Version in base suite: 1.46.0+dfsg-1 Base version: ublock-origin_1.46.0+dfsg-1 Target version: ublock-origin_1.67.0+dfsg-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/u/ublock-origin/ublock-origin_1.46.0+dfsg-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/u/ublock-origin/ublock-origin_1.67.0+dfsg-1~deb12u1.dsc /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/line-hor-dashed.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_128_off.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_16_off.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_32_off.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_512.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_64_off.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-Regular.woff2 |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-SemiBold.woff2 |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ad.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ae.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/af.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ag.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ai.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/al.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/am.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ao.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/aq.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ar.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/as.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/at.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/au.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/aw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ax.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/az.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ba.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bb.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bd.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/be.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bi.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bj.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bo.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bq.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/br.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bs.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/by.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/bz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ca.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cd.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ch.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ci.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ck.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/co.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cx.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cy.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/cz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/de.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/dj.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/dk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/dm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/do.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/dz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ec.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ee.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/eg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/eh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/er.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/es.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/et.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fi.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fj.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fo.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/fr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ga.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gb-eng.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gb-nir.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gb-sct.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gb-wls.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gb.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gd.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ge.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gi.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gp.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gq.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gs.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/gy.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/hk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/hm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/hn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/hr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ht.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/hu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/id.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ie.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/il.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/im.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/in.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/io.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/iq.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ir.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/is.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/it.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/je.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/jm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/jo.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/jp.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ke.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ki.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/km.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kp.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ky.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/kz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/la.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lb.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/li.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ls.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/lv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ly.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ma.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/md.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/me.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ml.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mo.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mp.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mq.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ms.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mx.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/my.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/mz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/na.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ne.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ng.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ni.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/no.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/np.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/nz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/om.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pa.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pe.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ph.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ps.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/pw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/py.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/qa.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/re.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ro.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/rs.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ru.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/rw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sa.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sb.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sd.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/se.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sh.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/si.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sj.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/so.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ss.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/st.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sx.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sy.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/sz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/td.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/th.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tj.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tl.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/to.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tr.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tv.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/tz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ua.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ug.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/um.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/us.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/uy.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/uz.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/va.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/vc.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ve.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/vg.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/vi.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/vn.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/vu.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/wf.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ws.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/xk.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/ye.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/yt.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/za.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/zm.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/zw.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/icon_16-loading.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/icon_32-loading.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/icon_64-loading.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/img/icon_64-off.png |binary /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/js/wasm/biditrie.wasm |binary ublock-origin-1.67.0+dfsg/.github/ISSUE_TEMPLATE/config.yml | 25 ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md | 7 ublock-origin-1.67.0+dfsg/.github/workflows/main.yml | 71 ublock-origin-1.67.0+dfsg/.github/workflows/mv3.yml | 53 ublock-origin-1.67.0+dfsg/.gitignore | 3 ublock-origin-1.67.0+dfsg/.gitmodules | 6 ublock-origin-1.67.0+dfsg/.jshintrc | 21 ublock-origin-1.67.0+dfsg/CHANGELOG.md | 448 ublock-origin-1.67.0+dfsg/CONTRIBUTING.md | 32 ublock-origin-1.67.0+dfsg/MANIFESTO.md | 11 ublock-origin-1.67.0+dfsg/Makefile | 147 ublock-origin-1.67.0+dfsg/README.md | 128 ublock-origin-1.67.0+dfsg/assets/assets.dev.json | 973 ublock-origin-1.67.0+dfsg/assets/assets.json | 672 ublock-origin-1.67.0+dfsg/assets/resources/scriptlets.js | 1847 ublock-origin-1.67.0+dfsg/debian/changelog | 83 ublock-origin-1.67.0+dfsg/debian/control | 15 ublock-origin-1.67.0+dfsg/debian/copyright | 45 ublock-origin-1.67.0+dfsg/debian/missing-sources/hsluv.ts | 374 ublock-origin-1.67.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch | 4 ublock-origin-1.67.0+dfsg/debian/patches/make-assets.patch | 18 ublock-origin-1.67.0+dfsg/debian/rules | 6 ublock-origin-1.67.0+dfsg/debian/watch | 6 ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides | 1 ublock-origin-1.67.0+dfsg/dist/README.md | 156 ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py | 190 ublock-origin-1.67.0+dfsg/dist/description/description-am.txt | 49 ublock-origin-1.67.0+dfsg/dist/description/description-en.txt | 22 ublock-origin-1.67.0+dfsg/dist/description/description-ga.txt | 49 ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py | 331 ublock-origin-1.67.0+dfsg/dist/firefox/updates.json | 24 ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json | 13 ublock-origin-1.67.0+dfsg/dist/mv3/log.txt | 3005 ublock-origin-1.67.0+dfsg/dist/mv3/publish-beta.py | 196 ublock-origin-1.67.0+dfsg/dist/version | 2 ublock-origin-1.67.0+dfsg/eslint.config.mjs | 51 ublock-origin-1.67.0+dfsg/package-lock.json | 1163 ublock-origin-1.67.0+dfsg/package.json | 32 ublock-origin-1.67.0+dfsg/platform/browser/main.js | 125 ublock-origin-1.67.0+dfsg/platform/browser/test.html | 71 ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html | 2 ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.js | 10 ublock-origin-1.67.0+dfsg/platform/chromium/manifest.json | 24 ublock-origin-1.67.0+dfsg/platform/chromium/vapi-background-ext.js | 153 ublock-origin-1.67.0+dfsg/platform/chromium/webext.js | 52 ublock-origin-1.67.0+dfsg/platform/common/vapi-background.js | 563 ublock-origin-1.67.0+dfsg/platform/common/vapi-client-extra.js | 312 ublock-origin-1.67.0+dfsg/platform/common/vapi-client.js | 64 ublock-origin-1.67.0+dfsg/platform/common/vapi-common.js | 175 ublock-origin-1.67.0+dfsg/platform/common/vapi.js | 6 ublock-origin-1.67.0+dfsg/platform/dig/snfe.js | 41 ublock-origin-1.67.0+dfsg/platform/firefox/manifest.json | 31 ublock-origin-1.67.0+dfsg/platform/firefox/vapi-background-ext.js | 430 ublock-origin-1.67.0+dfsg/platform/firefox/webext.js | 4 ublock-origin-1.67.0+dfsg/platform/mv3/README.md | 34 ublock-origin-1.67.0+dfsg/platform/mv3/chromium/manifest.json | 92 ublock-origin-1.67.0+dfsg/platform/mv3/description/en.md | 30 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.am.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ar.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.az.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.be.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bg.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bn.txt | 35 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.br_FR.txt | 12 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bs.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ca.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cs.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cv.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cy.txt | 12 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.da.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.de.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.el.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.en_GB.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eo.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.es.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.et.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eu.txt | 35 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fa.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fi.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fil.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fr.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fy.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ga.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gl.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gu.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.he.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hi.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hr.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hu.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hy.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.id.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.it.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ja.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ka.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kk.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kn.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ko.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ku.txt | 30 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lt.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lv.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mk.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ml.txt | 35 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mr.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ms.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nb.txt | 21 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nl.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.oc.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pa.txt | 12 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pl.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_BR.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_PT.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ro.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ru.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.si.txt | 35 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sk.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sl.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.so.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sq.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sr.txt | 29 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sv.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sw.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ta.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.te.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.th.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.tr.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.txt | 23 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.uk.txt | 25 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ur.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.vi.txt | 31 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_CN.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_TW.txt | 27 ublock-origin-1.67.0+dfsg/platform/mv3/edge/patch-extension.js | 71 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/am/messages.json | 278 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ar/messages.json | 436 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/az/messages.json | 436 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/be/messages.json | 398 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bg/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bn/messages.json | 458 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json | 414 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bs/messages.json | 418 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ca/messages.json | 394 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cs/messages.json | 402 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cv/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cy/messages.json | 414 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/da/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/de/messages.json | 410 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/el/messages.json | 404 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json | 398 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eo/messages.json | 426 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/es/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/et/messages.json | 398 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eu/messages.json | 418 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fa/messages.json | 430 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fi/messages.json | 404 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fil/messages.json | 398 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fr/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fy/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ga/messages.json | 278 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gl/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gu/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/he/messages.json | 422 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hi/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hr/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hu/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hy/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/id/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/it/messages.json | 434 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ja/messages.json | 398 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ka/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kk/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kn/messages.json | 438 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ko/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lt/messages.json | 406 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lv/messages.json | 408 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mk/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ml/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mr/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ms/messages.json | 430 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nb/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nl/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/oc/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pa/messages.json | 414 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pl/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json | 420 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json | 404 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ro/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ru/messages.json | 402 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/si/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sk/messages.json | 408 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sl/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/so/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sq/messages.json | 404 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sr/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sv/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sw/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ta/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/te/messages.json | 426 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/th/messages.json | 462 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/tr/messages.json | 408 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/uk/messages.json | 396 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ur/messages.json | 446 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/vi/messages.json | 406 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json | 400 ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json | 418 ublock-origin-1.67.0+dfsg/platform/mv3/extension/about.html | 43 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard-common.css | 16 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard.css | 103 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/develop.css | 168 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/filtering-mode.css | 53 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/matched-rules.css | 31 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/picker-ui.css | 144 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/popup.css | 319 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/report.css | 3 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/settings.css | 290 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/strictblock.css | 158 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css | 99 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/unpicker-ui.css | 64 ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/zapper-ui.css | 29 ublock-origin-1.67.0+dfsg/platform/mv3/extension/dashboard.html | 240 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/about.js | 33 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/action.js | 110 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/admin.js | 215 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/background.js | 733 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/backup-restore.js | 153 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/config.js | 70 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard-common.js | 30 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard.js | 146 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/debug.js | 211 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/develop.js | 624 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-editor.js | 180 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-parser.js | 581 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext-compat.js | 103 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext.js | 117 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/fetch.js | 8 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-lists.js | 464 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js | 486 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager.js | 277 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/matched-rules.js | 48 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-editor.js | 91 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-manager.js | 561 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-parser.js | 211 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/picker-ui.js | 422 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/popup.js | 247 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/report.js | 120 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js | 104 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ruleset-manager.js | 832 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js | 409 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting-manager.js | 859 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-api.js | 33 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js | 115 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js | 97 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js | 813 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js | 760 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.entity.js | 86 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js | 74 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js | 45 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user.js | 48 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js | 80 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/picker.js | 303 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js | 367 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js | 27 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js | 57 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/zapper.js | 138 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/settings.js | 469 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/storage.js | 44 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/strictblock.js | 295 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/theme.js | 27 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js | 237 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/troubleshooting.js | 130 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ubo-parser.js | 581 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/unpicker-ui.js | 171 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/utils.js | 123 ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/zapper-ui.js | 133 ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/README.md | 9 ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE | 21 ublock-origin-1.67.0+dfsg/platform/mv3/extension/managed_storage.json | 40 ublock-origin-1.67.0+dfsg/platform/mv3/extension/manifest.json | 42 ublock-origin-1.67.0+dfsg/platform/mv3/extension/matched-rules.html | 33 ublock-origin-1.67.0+dfsg/platform/mv3/extension/picker-ui.html | 56 ublock-origin-1.67.0+dfsg/platform/mv3/extension/popup.html | 53 ublock-origin-1.67.0+dfsg/platform/mv3/extension/report.html | 69 ublock-origin-1.67.0+dfsg/platform/mv3/extension/settings.html | 110 ublock-origin-1.67.0+dfsg/platform/mv3/extension/strictblock.html | 50 ublock-origin-1.67.0+dfsg/platform/mv3/extension/unpicker-ui.html | 40 ublock-origin-1.67.0+dfsg/platform/mv3/extension/zapper-ui.html | 32 ublock-origin-1.67.0+dfsg/platform/mv3/firefox/manifest.json | 96 ublock-origin-1.67.0+dfsg/platform/mv3/firefox/patch-ruleset.js | 30 ublock-origin-1.67.0+dfsg/platform/mv3/make-rulesets.js | 1617 ublock-origin-1.67.0+dfsg/platform/mv3/make-scriptlets.js | 196 ublock-origin-1.67.0+dfsg/platform/mv3/rulesets.json | 636 ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-api.js | 46 ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-user.js | 59 ublock-origin-1.67.0+dfsg/platform/mv3/safari/ext-compat.js | 223 ublock-origin-1.67.0+dfsg/platform/mv3/safari/manifest.json | 89 ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-extension.js | 107 ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-ruleset.js | 69 ublock-origin-1.67.0+dfsg/platform/mv3/safe-replace.js | 37 ublock-origin-1.67.0+dfsg/platform/mv3/salvage-ruleids.mjs | 116 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.entity.js | 181 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.js | 184 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.entity.js | 139 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.js | 143 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.entity.js | 113 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.js | 117 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-declarative.js | 51 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.js | 65 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.template.js | 87 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generichigh.template.css | 26 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.js | 51 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js | 42 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.entity.js | 51 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.js | 87 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.template.js | 42 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/json-prune.js | 160 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.entity.js | 113 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.js | 118 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-fetch-if.js | 143 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-setinterval-if.js | 121 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.entity.js | 117 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.js | 121 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.entity.js | 154 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.js | 159 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-xhr-if.js | 145 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js | 116 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.entity.js | 199 ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.js | 202 ublock-origin-1.67.0+dfsg/platform/nodejs/.eslintrc.json | 38 ublock-origin-1.67.0+dfsg/platform/nodejs/README.md | 158 ublock-origin-1.67.0+dfsg/platform/nodejs/build.js | 7 ublock-origin-1.67.0+dfsg/platform/nodejs/index.js | 83 ublock-origin-1.67.0+dfsg/platform/npm/.eslintrc.json | 38 ublock-origin-1.67.0+dfsg/platform/npm/README.md | 170 ublock-origin-1.67.0+dfsg/platform/npm/demo.js | 121 ublock-origin-1.67.0+dfsg/platform/npm/package-lock.json | 3030 ublock-origin-1.67.0+dfsg/platform/npm/package.json | 15 ublock-origin-1.67.0+dfsg/platform/npm/test.js | 9 ublock-origin-1.67.0+dfsg/platform/npm/tests/_common.js | 2 ublock-origin-1.67.0+dfsg/platform/npm/tests/leaks.js | 2 ublock-origin-1.67.0+dfsg/platform/npm/tests/request-data.js | 2 ublock-origin-1.67.0+dfsg/platform/npm/tests/snfe.js | 2 ublock-origin-1.67.0+dfsg/platform/npm/tests/wasm.js | 2 ublock-origin-1.67.0+dfsg/platform/opera/manifest.json | 24 ublock-origin-1.67.0+dfsg/platform/thunderbird/manifest.json | 20 ublock-origin-1.67.0+dfsg/src/1p-filters.html | 22 ublock-origin-1.67.0+dfsg/src/3p-filters.html | 87 ublock-origin-1.67.0+dfsg/src/_locales/am/messages.json | 1266 ublock-origin-1.67.0+dfsg/src/_locales/ar/messages.json | 238 ublock-origin-1.67.0+dfsg/src/_locales/az/messages.json | 116 ublock-origin-1.67.0+dfsg/src/_locales/be/messages.json | 146 ublock-origin-1.67.0+dfsg/src/_locales/bg/messages.json | 126 ublock-origin-1.67.0+dfsg/src/_locales/bn/messages.json | 144 ublock-origin-1.67.0+dfsg/src/_locales/br_FR/messages.json | 1330 ublock-origin-1.67.0+dfsg/src/_locales/bs/messages.json | 126 ublock-origin-1.67.0+dfsg/src/_locales/ca/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/cs/messages.json | 142 ublock-origin-1.67.0+dfsg/src/_locales/cv/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/cy/messages.json | 1330 ublock-origin-1.67.0+dfsg/src/_locales/da/messages.json | 132 ublock-origin-1.67.0+dfsg/src/_locales/de/messages.json | 238 ublock-origin-1.67.0+dfsg/src/_locales/el/messages.json | 178 ublock-origin-1.67.0+dfsg/src/_locales/en/messages.json | 132 ublock-origin-1.67.0+dfsg/src/_locales/en_GB/messages.json | 110 ublock-origin-1.67.0+dfsg/src/_locales/eo/messages.json | 126 ublock-origin-1.67.0+dfsg/src/_locales/es/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/et/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/eu/messages.json | 114 ublock-origin-1.67.0+dfsg/src/_locales/fa/messages.json | 128 ublock-origin-1.67.0+dfsg/src/_locales/fi/messages.json | 148 ublock-origin-1.67.0+dfsg/src/_locales/fil/messages.json | 110 ublock-origin-1.67.0+dfsg/src/_locales/fr/messages.json | 124 ublock-origin-1.67.0+dfsg/src/_locales/fy/messages.json | 120 ublock-origin-1.67.0+dfsg/src/_locales/ga/messages.json | 1266 ublock-origin-1.67.0+dfsg/src/_locales/gl/messages.json | 366 ublock-origin-1.67.0+dfsg/src/_locales/gu/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/he/messages.json | 142 ublock-origin-1.67.0+dfsg/src/_locales/hi/messages.json | 150 ublock-origin-1.67.0+dfsg/src/_locales/hr/messages.json | 132 ublock-origin-1.67.0+dfsg/src/_locales/hu/messages.json | 230 ublock-origin-1.67.0+dfsg/src/_locales/hy/messages.json | 116 ublock-origin-1.67.0+dfsg/src/_locales/id/messages.json | 140 ublock-origin-1.67.0+dfsg/src/_locales/it/messages.json | 146 ublock-origin-1.67.0+dfsg/src/_locales/ja/messages.json | 124 ublock-origin-1.67.0+dfsg/src/_locales/ka/messages.json | 212 ublock-origin-1.67.0+dfsg/src/_locales/kk/messages.json | 162 ublock-origin-1.67.0+dfsg/src/_locales/kn/messages.json | 292 ublock-origin-1.67.0+dfsg/src/_locales/ko/messages.json | 112 ublock-origin-1.67.0+dfsg/src/_locales/lt/messages.json | 134 ublock-origin-1.67.0+dfsg/src/_locales/lv/messages.json | 136 ublock-origin-1.67.0+dfsg/src/_locales/mk/messages.json | 340 ublock-origin-1.67.0+dfsg/src/_locales/ml/messages.json | 118 ublock-origin-1.67.0+dfsg/src/_locales/mr/messages.json | 122 ublock-origin-1.67.0+dfsg/src/_locales/ms/messages.json | 120 ublock-origin-1.67.0+dfsg/src/_locales/nb/messages.json | 134 ublock-origin-1.67.0+dfsg/src/_locales/nl/messages.json | 128 ublock-origin-1.67.0+dfsg/src/_locales/oc/messages.json | 144 ublock-origin-1.67.0+dfsg/src/_locales/pa/messages.json | 1330 ublock-origin-1.67.0+dfsg/src/_locales/pl/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/pt_BR/messages.json | 412 ublock-origin-1.67.0+dfsg/src/_locales/pt_PT/messages.json | 178 ublock-origin-1.67.0+dfsg/src/_locales/ro/messages.json | 118 ublock-origin-1.67.0+dfsg/src/_locales/ru/messages.json | 138 ublock-origin-1.67.0+dfsg/src/_locales/si/messages.json | 568 ublock-origin-1.67.0+dfsg/src/_locales/sk/messages.json | 122 ublock-origin-1.67.0+dfsg/src/_locales/sl/messages.json | 110 ublock-origin-1.67.0+dfsg/src/_locales/so/messages.json | 118 ublock-origin-1.67.0+dfsg/src/_locales/sq/messages.json | 244 ublock-origin-1.67.0+dfsg/src/_locales/sr/messages.json | 122 ublock-origin-1.67.0+dfsg/src/_locales/sv/messages.json | 200 ublock-origin-1.67.0+dfsg/src/_locales/sw/messages.json | 110 ublock-origin-1.67.0+dfsg/src/_locales/ta/messages.json | 112 ublock-origin-1.67.0+dfsg/src/_locales/te/messages.json | 140 ublock-origin-1.67.0+dfsg/src/_locales/th/messages.json | 410 ublock-origin-1.67.0+dfsg/src/_locales/tr/messages.json | 146 ublock-origin-1.67.0+dfsg/src/_locales/uk/messages.json | 130 ublock-origin-1.67.0+dfsg/src/_locales/ur/messages.json | 126 ublock-origin-1.67.0+dfsg/src/_locales/vi/messages.json | 188 ublock-origin-1.67.0+dfsg/src/_locales/zh_CN/messages.json | 138 ublock-origin-1.67.0+dfsg/src/_locales/zh_TW/messages.json | 246 ublock-origin-1.67.0+dfsg/src/about.html | 5 ublock-origin-1.67.0+dfsg/src/advanced-settings.html | 7 ublock-origin-1.67.0+dfsg/src/asset-viewer.html | 20 ublock-origin-1.67.0+dfsg/src/blank.html | 11 ublock-origin-1.67.0+dfsg/src/code-viewer.html | 54 ublock-origin-1.67.0+dfsg/src/css/1p-filters.css | 10 ublock-origin-1.67.0+dfsg/src/css/3p-filters.css | 249 ublock-origin-1.67.0+dfsg/src/css/advanced-settings.css | 1 ublock-origin-1.67.0+dfsg/src/css/asset-viewer.css | 1 ublock-origin-1.67.0+dfsg/src/css/code-viewer.css | 68 ublock-origin-1.67.0+dfsg/src/css/codemirror.css | 197 ublock-origin-1.67.0+dfsg/src/css/common.css | 68 ublock-origin-1.67.0+dfsg/src/css/dashboard-common.css | 2 ublock-origin-1.67.0+dfsg/src/css/dashboard.css | 20 ublock-origin-1.67.0+dfsg/src/css/devtools.css | 1 ublock-origin-1.67.0+dfsg/src/css/document-blocked.css | 53 ublock-origin-1.67.0+dfsg/src/css/dom-inspector.css | 41 ublock-origin-1.67.0+dfsg/src/css/dyna-rules.css | 1 ublock-origin-1.67.0+dfsg/src/css/epicker-ui.css | 161 ublock-origin-1.67.0+dfsg/src/css/fa-icons.css | 15 ublock-origin-1.67.0+dfsg/src/css/logger-ui-inspector.css | 9 ublock-origin-1.67.0+dfsg/src/css/logger-ui.css | 456 ublock-origin-1.67.0+dfsg/src/css/popup-fenix.css | 190 ublock-origin-1.67.0+dfsg/src/css/settings.css | 4 ublock-origin-1.67.0+dfsg/src/css/support.css | 39 ublock-origin-1.67.0+dfsg/src/css/themes/default.css | 31 ublock-origin-1.67.0+dfsg/src/css/whitelist.css | 1 ublock-origin-1.67.0+dfsg/src/dashboard.html | 39 ublock-origin-1.67.0+dfsg/src/devtools.html | 15 ublock-origin-1.67.0+dfsg/src/document-blocked.html | 46 ublock-origin-1.67.0+dfsg/src/dyna-rules.html | 7 ublock-origin-1.67.0+dfsg/src/img/flags-of-the-world/README | 9 ublock-origin-1.67.0+dfsg/src/img/fontawesome/fontawesome-defs.svg | 3 ublock-origin-1.67.0+dfsg/src/js/1p-filters.js | 253 ublock-origin-1.67.0+dfsg/src/js/3p-filters.js | 1008 ublock-origin-1.67.0+dfsg/src/js/about.js | 4 ublock-origin-1.67.0+dfsg/src/js/advanced-settings.js | 17 ublock-origin-1.67.0+dfsg/src/js/arglist-parser.js | 116 ublock-origin-1.67.0+dfsg/src/js/asset-viewer.js | 32 ublock-origin-1.67.0+dfsg/src/js/assets.js | 978 ublock-origin-1.67.0+dfsg/src/js/background.js | 178 ublock-origin-1.67.0+dfsg/src/js/base64-custom.js | 107 ublock-origin-1.67.0+dfsg/src/js/benchmarks.js | 165 ublock-origin-1.67.0+dfsg/src/js/biditrie.js | 122 ublock-origin-1.67.0+dfsg/src/js/broadcast.js | 85 ublock-origin-1.67.0+dfsg/src/js/cachestorage.js | 982 ublock-origin-1.67.0+dfsg/src/js/click2load.js | 9 ublock-origin-1.67.0+dfsg/src/js/cloud-ui.js | 9 ublock-origin-1.67.0+dfsg/src/js/code-viewer.js | 308 ublock-origin-1.67.0+dfsg/src/js/codemirror/search-thread.js | 27 ublock-origin-1.67.0+dfsg/src/js/codemirror/search.js | 162 ublock-origin-1.67.0+dfsg/src/js/codemirror/ubo-dynamic-filtering.js | 6 ublock-origin-1.67.0+dfsg/src/js/codemirror/ubo-static-filtering.js | 1127 ublock-origin-1.67.0+dfsg/src/js/commands.js | 36 ublock-origin-1.67.0+dfsg/src/js/console.js | 4 ublock-origin-1.67.0+dfsg/src/js/contentscript-extra.js | 103 ublock-origin-1.67.0+dfsg/src/js/contentscript.js | 72 ublock-origin-1.67.0+dfsg/src/js/contextmenu.js | 86 ublock-origin-1.67.0+dfsg/src/js/cosmetic-filtering.js | 307 ublock-origin-1.67.0+dfsg/src/js/dashboard-common.js | 14 ublock-origin-1.67.0+dfsg/src/js/dashboard.js | 53 ublock-origin-1.67.0+dfsg/src/js/devtools.js | 193 ublock-origin-1.67.0+dfsg/src/js/diff-updater.js | 285 ublock-origin-1.67.0+dfsg/src/js/document-blocked.js | 138 ublock-origin-1.67.0+dfsg/src/js/dom-inspector.js | 65 ublock-origin-1.67.0+dfsg/src/js/dom.js | 49 ublock-origin-1.67.0+dfsg/src/js/dyna-rules.js | 191 ublock-origin-1.67.0+dfsg/src/js/dynamic-net-filtering.js | 19 ublock-origin-1.67.0+dfsg/src/js/epicker-ui.js | 264 ublock-origin-1.67.0+dfsg/src/js/fa-icons.js | 9 ublock-origin-1.67.0+dfsg/src/js/filtering-context.js | 249 ublock-origin-1.67.0+dfsg/src/js/filtering-engines.js | 6 ublock-origin-1.67.0+dfsg/src/js/hnswitches.js | 15 ublock-origin-1.67.0+dfsg/src/js/hntrie.js | 58 ublock-origin-1.67.0+dfsg/src/js/html-filtering.js | 142 ublock-origin-1.67.0+dfsg/src/js/httpheader-filtering.js | 117 ublock-origin-1.67.0+dfsg/src/js/i18n.js | 71 ublock-origin-1.67.0+dfsg/src/js/jsonpath.js | 524 ublock-origin-1.67.0+dfsg/src/js/logger-ui-inspector.js | 434 ublock-origin-1.67.0+dfsg/src/js/logger-ui.js | 863 ublock-origin-1.67.0+dfsg/src/js/logger.js | 46 ublock-origin-1.67.0+dfsg/src/js/lz4.js | 53 ublock-origin-1.67.0+dfsg/src/js/messaging.js | 659 ublock-origin-1.67.0+dfsg/src/js/mrucache.js | 56 ublock-origin-1.67.0+dfsg/src/js/pagestore.js | 311 ublock-origin-1.67.0+dfsg/src/js/popup-fenix.js | 256 ublock-origin-1.67.0+dfsg/src/js/redirect-engine.js | 599 ublock-origin-1.67.0+dfsg/src/js/redirect-resources.js | 68 ublock-origin-1.67.0+dfsg/src/js/regex-analyzer.js | 256 ublock-origin-1.67.0+dfsg/src/js/resources/attribute.js | 305 ublock-origin-1.67.0+dfsg/src/js/resources/base.js | 38 ublock-origin-1.67.0+dfsg/src/js/resources/cookie.js | 441 ublock-origin-1.67.0+dfsg/src/js/resources/create-html.js | 113 ublock-origin-1.67.0+dfsg/src/js/resources/href-sanitizer.js | 170 ublock-origin-1.67.0+dfsg/src/js/resources/json-edit.js | 1105 ublock-origin-1.67.0+dfsg/src/js/resources/json-prune.js | 275 ublock-origin-1.67.0+dfsg/src/js/resources/localstorage.js | 235 ublock-origin-1.67.0+dfsg/src/js/resources/noeval.js | 58 ublock-origin-1.67.0+dfsg/src/js/resources/object-prune.js | 272 ublock-origin-1.67.0+dfsg/src/js/resources/parse-replace.js | 54 ublock-origin-1.67.0+dfsg/src/js/resources/prevent-fetch.js | 221 ublock-origin-1.67.0+dfsg/src/js/resources/prevent-innerHTML.js | 82 ublock-origin-1.67.0+dfsg/src/js/resources/prevent-settimeout.js | 236 ublock-origin-1.67.0+dfsg/src/js/resources/proxy-apply.js | 113 ublock-origin-1.67.0+dfsg/src/js/resources/replace-argument.js | 131 ublock-origin-1.67.0+dfsg/src/js/resources/run-at.js | 96 ublock-origin-1.67.0+dfsg/src/js/resources/safe-self.js | 221 ublock-origin-1.67.0+dfsg/src/js/resources/scriptlets.js | 2609 ublock-origin-1.67.0+dfsg/src/js/resources/set-constant.js | 287 ublock-origin-1.67.0+dfsg/src/js/resources/shared.js | 40 ublock-origin-1.67.0+dfsg/src/js/resources/spoof-css.js | 163 ublock-origin-1.67.0+dfsg/src/js/resources/stack-trace.js | 148 ublock-origin-1.67.0+dfsg/src/js/resources/utils.js | 192 ublock-origin-1.67.0+dfsg/src/js/reverselookup-worker.js | 85 ublock-origin-1.67.0+dfsg/src/js/reverselookup.js | 72 ublock-origin-1.67.0+dfsg/src/js/s14e-serializer.js | 1438 ublock-origin-1.67.0+dfsg/src/js/scriptlet-filtering-core.js | 317 ublock-origin-1.67.0+dfsg/src/js/scriptlet-filtering.js | 651 ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-logger.js | 99 ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-off.js | 4 ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-on.js | 4 ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-report.js | 140 ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-inspector.js | 670 ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-survey-elements.js | 4 ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-survey-scripts.js | 4 ublock-origin-1.67.0+dfsg/src/js/scriptlets/epicker.js | 334 ublock-origin-1.67.0+dfsg/src/js/scriptlets/load-3p-css.js | 6 ublock-origin-1.67.0+dfsg/src/js/scriptlets/load-large-media-all.js | 4 ublock-origin-1.67.0+dfsg/src/js/scriptlets/load-large-media-interactive.js | 111 ublock-origin-1.67.0+dfsg/src/js/scriptlets/noscript-spoof.js | 83 ublock-origin-1.67.0+dfsg/src/js/scriptlets/scriptlet-loglevel-1.js | 47 ublock-origin-1.67.0+dfsg/src/js/scriptlets/scriptlet-loglevel-2.js | 47 ublock-origin-1.67.0+dfsg/src/js/scriptlets/should-inject-contentscript.js | 12 ublock-origin-1.67.0+dfsg/src/js/scriptlets/subscriber.js | 8 ublock-origin-1.67.0+dfsg/src/js/scriptlets/updater.js | 114 ublock-origin-1.67.0+dfsg/src/js/settings.js | 82 ublock-origin-1.67.0+dfsg/src/js/start.js | 327 ublock-origin-1.67.0+dfsg/src/js/static-dnr-filtering.js | 415 ublock-origin-1.67.0+dfsg/src/js/static-ext-filtering-db.js | 299 ublock-origin-1.67.0+dfsg/src/js/static-ext-filtering.js | 75 ublock-origin-1.67.0+dfsg/src/js/static-filtering-io.js | 9 ublock-origin-1.67.0+dfsg/src/js/static-filtering-parser.js | 5556 ublock-origin-1.67.0+dfsg/src/js/static-net-filtering.js | 3230 ublock-origin-1.67.0+dfsg/src/js/storage.js | 835 ublock-origin-1.67.0+dfsg/src/js/support.js | 128 ublock-origin-1.67.0+dfsg/src/js/tab.js | 136 ublock-origin-1.67.0+dfsg/src/js/tasks.js | 8 ublock-origin-1.67.0+dfsg/src/js/text-encode.js | 102 ublock-origin-1.67.0+dfsg/src/js/text-utils.js | 4 ublock-origin-1.67.0+dfsg/src/js/theme.js | 19 ublock-origin-1.67.0+dfsg/src/js/traffic.js | 914 ublock-origin-1.67.0+dfsg/src/js/ublock.js | 88 ublock-origin-1.67.0+dfsg/src/js/uri-utils.js | 22 ublock-origin-1.67.0+dfsg/src/js/url-net-filtering.js | 6 ublock-origin-1.67.0+dfsg/src/js/urlskip.js | 165 ublock-origin-1.67.0+dfsg/src/js/utils.js | 95 ublock-origin-1.67.0+dfsg/src/js/wasm/README.md | 2 ublock-origin-1.67.0+dfsg/src/js/wasm/biditrie.wat | 40 ublock-origin-1.67.0+dfsg/src/js/wasm/hntrie.wat | 2 ublock-origin-1.67.0+dfsg/src/js/whitelist.js | 70 ublock-origin-1.67.0+dfsg/src/lib/codemirror/mode/css/css.js | 864 ublock-origin-1.67.0+dfsg/src/lib/codemirror/mode/htmlmixed/htmlmixed.js | 153 ublock-origin-1.67.0+dfsg/src/lib/codemirror/mode/javascript/javascript.js | 942 ublock-origin-1.67.0+dfsg/src/lib/codemirror/mode/xml/xml.js | 413 ublock-origin-1.67.0+dfsg/src/lib/codemirror/theme/night.css | 27 ublock-origin-1.67.0+dfsg/src/lib/js-beautify/LICENSE | 9 ublock-origin-1.67.0+dfsg/src/lib/js-beautify/README | 5 ublock-origin-1.67.0+dfsg/src/lib/js-beautify/beautifier.min.js | 2 ublock-origin-1.67.0+dfsg/src/lib/lz4/README.md | 6 ublock-origin-1.67.0+dfsg/src/lib/lz4/lz4-block-codec-any.js | 2 ublock-origin-1.67.0+dfsg/src/lib/lz4/lz4-block-codec.wat | 6 ublock-origin-1.67.0+dfsg/src/lib/publicsuffixlist/publicsuffixlist.js | 10 ublock-origin-1.67.0+dfsg/src/lib/regexanalyzer/CHANGES.md | 11 ublock-origin-1.67.0+dfsg/src/lib/regexanalyzer/regex.js | 1180 ublock-origin-1.67.0+dfsg/src/logger-ui.html | 72 ublock-origin-1.67.0+dfsg/src/no-dashboard.html | 1 ublock-origin-1.67.0+dfsg/src/popup-fenix.html | 23 ublock-origin-1.67.0+dfsg/src/settings.html | 5 ublock-origin-1.67.0+dfsg/src/support.html | 65 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/addthis_widget.js | 39 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/chartbeat.js | 3 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/click2load.html | 2 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/dom-inspector.html | 25 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/epicker-ui.html | 16 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/fingerprint2.js | 32 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/google-ima.js | 106 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/googlesyndication_adsbygoogle.js | 8 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/googletagservices_gpt.js | 3 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/ligatus_angular-tag.js | 29 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/monkeybroker.js | 43 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/mxpnl_mixpanel.js | 51 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop-vast2.xml | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop-vast3.xml | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop-vast4.xml | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop-vmap1.0.xml | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop-vmap1.xml | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop.css | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/noop.json | 1 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/popads.js | 2 ublock-origin-1.67.0+dfsg/src/web_accessible_resources/window.open-defuser.js | 115 ublock-origin-1.67.0+dfsg/src/whitelist.html | 19 ublock-origin-1.67.0+dfsg/tools/copy-common-files.sh | 1 ublock-origin-1.67.0+dfsg/tools/import-crowdin.sh | 1 ublock-origin-1.67.0+dfsg/tools/jsonpath-tool.html | 197 ublock-origin-1.67.0+dfsg/tools/make-assets.sh | 24 ublock-origin-1.67.0+dfsg/tools/make-chromium-meta.py | 2 ublock-origin-1.67.0+dfsg/tools/make-chromium.sh | 2 ublock-origin-1.67.0+dfsg/tools/make-firefox-meta.py | 2 ublock-origin-1.67.0+dfsg/tools/make-firefox.sh | 4 ublock-origin-1.67.0+dfsg/tools/make-mv3.sh | 233 ublock-origin-1.67.0+dfsg/tools/make-nodejs.sh | 62 ublock-origin-1.67.0+dfsg/tools/make-npm.sh | 2 ublock-origin-1.67.0+dfsg/tools/make-opera.sh | 5 ublock-origin-1.67.0+dfsg/tools/make-thunderbird.sh | 2 ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/bug_report.yml | 127 ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/config.yml | 5 ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/report_from_ubo.yml | 108 ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/specific_report_from_ubo.yml | 67 ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/specific_report_from_ubol.yml | 122 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/del-runs-comments.yml | 19 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/main.yml | 27 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/on-issue-comment.yml | 21 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/on-issue-created.yml | 54 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/on-youtube-issue.yml | 34 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/update-3rd-party-assets.yml | 5 ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/update-easylist.yml | 14 ublock-origin-1.67.0+dfsg/uAssets/.gitignore | 3 ublock-origin-1.67.0+dfsg/uAssets/Makefile | 8 ublock-origin-1.67.0+dfsg/uAssets/README.md | 42 ublock-origin-1.67.0+dfsg/uAssets/dnr/default.json | 2 ublock-origin-1.67.0+dfsg/uAssets/filters/annoyances-cookies.txt | 4925 ublock-origin-1.67.0+dfsg/uAssets/filters/annoyances-others.txt | 7774 + ublock-origin-1.67.0+dfsg/uAssets/filters/annoyances.txt | 6585 ublock-origin-1.67.0+dfsg/uAssets/filters/badlists.txt | 69 ublock-origin-1.67.0+dfsg/uAssets/filters/badware.txt | 6372 ublock-origin-1.67.0+dfsg/uAssets/filters/experimental.txt | 36 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2020.txt | 3400 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2021.txt | 4303 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2022.txt | 3947 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2023.txt | 4818 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2024.txt | 4266 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2025.txt | 3083 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-general.txt | 2737 ublock-origin-1.67.0+dfsg/uAssets/filters/filters-mobile.txt | 175 ublock-origin-1.67.0+dfsg/uAssets/filters/filters.txt |11393 - ublock-origin-1.67.0+dfsg/uAssets/filters/lan-block.txt | 129 ublock-origin-1.67.0+dfsg/uAssets/filters/legacy.txt | 27 ublock-origin-1.67.0+dfsg/uAssets/filters/privacy.txt | 2302 ublock-origin-1.67.0+dfsg/uAssets/filters/quick-fixes.txt | 661 ublock-origin-1.67.0+dfsg/uAssets/filters/resource-abuse.txt | 125 ublock-origin-1.67.0+dfsg/uAssets/filters/ubo-link-shorteners.txt | 1595 ublock-origin-1.67.0+dfsg/uAssets/filters/ubol-filters.txt | 170 ublock-origin-1.67.0+dfsg/uAssets/filters/unbreak.txt | 3526 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-annoyances.template | 22 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-chat.template | 7 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-cookies.template | 23 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-newsletters.template | 28 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-notifications.template | 22 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist-social.template | 22 ublock-origin-1.67.0+dfsg/uAssets/templates/easylist.template | 41 ublock-origin-1.67.0+dfsg/uAssets/templates/easyprivacy.template | 57 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-annoyances.template | 8 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-badware.template | 8 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-experimental.template | 8 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-filters.template | 22 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-privacy.template | 10 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-quick-fixes.template | 8 ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-unbreak.template | 8 ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt |54229 ------- ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt |31433 ---- ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-annoyances.txt | 4131 ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-chat.txt | 271 ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-cookies.txt |27983 +++ ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-newsletters.txt | 6138 ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-notifications.txt | 1726 ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-social.txt |13717 + ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist.txt |76536 ++++++++++ ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easyprivacy.txt |54785 +++++++ ublock-origin-1.67.0+dfsg/uAssets/thirdparties/publicsuffix.org/list/effective_tld_names.dat | 9534 - ublock-origin-1.67.0+dfsg/uAssets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt |10007 - ublock-origin-1.67.0+dfsg/uAssets/tools/easylist/make-easylist.js | 106 ublock-origin-1.67.0+dfsg/uAssets/tools/easylist/package.json | 6 ublock-origin-1.67.0+dfsg/uAssets/tools/make-diffpatch.sh | 100 ublock-origin-1.67.0+dfsg/uAssets/tools/make-easylist.mjs | 212 ublock-origin-1.67.0+dfsg/uAssets/tools/make-easylist.sh | 25 ublock-origin-1.67.0+dfsg/uAssets/tools/make-ublock.sh | 24 ublock-origin-1.67.0+dfsg/uAssets/tools/need-patch.mjs | 81 ublock-origin-1.67.0+dfsg/uAssets/tools/update-3rdparties.sh | 10 ublock-origin-1.67.0+dfsg/uAssets/tools/update-diffpatches.sh | 115 975 files changed, 327578 insertions(+), 169082 deletions(-) diff -Nru ublock-origin-1.46.0+dfsg/.github/ISSUE_TEMPLATE/config.yml ublock-origin-1.67.0+dfsg/.github/ISSUE_TEMPLATE/config.yml --- ublock-origin-1.46.0+dfsg/.github/ISSUE_TEMPLATE/config.yml 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.github/ISSUE_TEMPLATE/config.yml 2025-10-25 19:32:51.000000000 +0000 @@ -1,17 +1,14 @@ blank_issues_enabled: false contact_links: - - name: Bug report - url: https://github.com/uBlockOrigin/uBlock-issues - about: Bugs and feature requests are now in a separate repository - - name: Questions and support - url: https://old.reddit.com/r/uBlockOrigin/ - about: Answers to questions and other kinds of help support is provided on the subreddit r/uBlockOrigin - - name: Filter issues/website is broken + - name: Support Forum + url: https://www.reddit.com/r/uBlockOrigin/ + about: For support, questions, or help, visit /r/uBlockOrigin. + - name: uBlock Origin (uBO) Issues + url: https://github.com/uBlockOrigin/uBlock-issues/issues + about: Report issues with uBO in the uBO issue tracker. + - name: Filter List Issues url: https://github.com/uBlockOrigin/uAssets/issues - about: Please report any issues with specific websites to uAssets issue tracker - - name: New filter list - url: https://github.com/uBlockOrigin/uBlock-issues/blob/master/README.md#ublock-issues - about: Opening issues for adding new filter lists is now disallowed and such issues will be declined and closed - - name: Issues with Firefox 56 or older - url: https://github.com/gorhill/uBlock-for-firefox-legacy/issues - about: If you are using uBlock Origin for Firefox legacy, please write the issues to its issue tracker + about: Report issues with filter lists or broken website functionality in the uAssets issue tracker. + - name: uBO Lite (uBOL) Issues + url: https://github.com/uBlockOrigin/uBOL-home/issues + about: Report issues specific to the Manifest Version 3 (MV3) variant in the uBOL issue tracker. diff -Nru ublock-origin-1.46.0+dfsg/.github/workflows/RELEASE.HEAD.md ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md --- ublock-origin-1.46.0+dfsg/.github/workflows/RELEASE.HEAD.md 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,7 @@ +[Commits to Master Since This Release](https://github.com/gorhill/uBlock/compare/%version%...master) + +#### How to Install the Developer Build: + +- **Firefox**: Signing pending + uBO works best on Gecko-based browsers, check out [why](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox). +- **Chromium**: Install directly from the [Chrome Web Store](https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii). diff -Nru ublock-origin-1.46.0+dfsg/.github/workflows/main.yml ublock-origin-1.67.0+dfsg/.github/workflows/main.yml --- ublock-origin-1.46.0+dfsg/.github/workflows/main.yml 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.github/workflows/main.yml 2025-10-25 19:32:51.000000000 +0000 @@ -7,9 +7,6 @@ permissions: contents: read -# I used the following project as template to get started: -# https://github.com/dessant/search-by-image/blob/master/.github/workflows/ci.yml - jobs: build: permissions: @@ -19,65 +16,35 @@ if: startsWith(github.ref, 'refs/tags/') steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: persist-credentials: false - name: Clone uAssets run: | tools/pull-assets.sh - # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html - name: Get release information - id: release_info run: | - echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} + echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV + - name: Build MV2 packages + run: | + tools/make-chromium.sh ${{ env.VERSION }} + tools/make-firefox.sh ${{ env.VERSION }} + - name: Assemble release notes + run: | + > release.body.txt + grep -m1 -B10000 -- "----------" CHANGELOG.md >> release.body.txt + sed -e 's/%version%/${{ env.VERSION }}/g' .github/workflows/RELEASE.HEAD.md >> release.body.txt - name: Create GitHub release id: create_release - uses: actions/create-release@v1 + uses: softprops/action-gh-release@v2 env: GITHUB_TOKEN: ${{ github.token }} with: - tag_name: ${{ steps.release_info.outputs.VERSION }} - release_name: ${{ steps.release_info.outputs.VERSION }} + tag_name: ${{ env.VERSION }} + name: ${{ env.VERSION }} + draft: true prerelease: true - - name: Build MV2 packages - run: | - tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} - - name: Upload Chromium package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - asset_content_type: application/octet-stream - - name: Upload Firefox package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - asset_content_type: application/octet-stream - - name: Upload Thunderbird package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - asset_content_type: application/octet-stream - - name: Upload NodeJS package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz - asset_content_type: application/octet-stream + body_path: release.body.txt + files: | + dist/build/uBlock0_${{ env.VERSION }}.chromium.zip + dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi diff -Nru ublock-origin-1.46.0+dfsg/.github/workflows/mv3.yml ublock-origin-1.67.0+dfsg/.github/workflows/mv3.yml --- ublock-origin-1.46.0+dfsg/.github/workflows/mv3.yml 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.github/workflows/mv3.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -name: uBO Lite release - -on: workflow_dispatch - -permissions: - contents: read - -# I used the following project as template to get started: -# https://github.com/dessant/search-by-image/blob/master/.github/workflows/ci.yml - -jobs: - build: - permissions: - contents: write # for creating release - name: Build packages - runs-on: ubuntu-latest - steps: - - name: Clone repository - uses: actions/checkout@v3 - with: - persist-credentials: false - # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html - - name: Build uBOLite MV3 packages - run: | - tools/make-mv3.sh full - echo "PACKAGE=$(basename $(ls dist/build/uBOLite_*.mv3.zip))" >> $GITHUB_ENV - echo "TAGNAME=$(basename $(ls dist/build/uBOLite_*.mv3.zip) .mv3.zip)" >> $GITHUB_ENV - RELEASENAME=${TAGNAME/_/ } - echo "RELEASENAME=$RELEASENAME" >> $GITHUB_ENV - cp dist/build/uBOLite.mv3/log.txt dist/mv3/ - - name: Commit uBOLite MV3 build log file - # https://github.com/marketplace/actions/github-action-for-committing-changes-to-a-repository - uses: devops-infra/action-commit-push@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - commit_message: Update build log file - - name: Create GitHub release - id: create_release - uses: ncipollo/release-action@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - tag: ${{ env.TAGNAME }} - prerelease: true - - name: Upload uBOLite MV3 package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/${{ env.PACKAGE }} - asset_name: ${{ env.PACKAGE }} - asset_content_type: application/octet-stream diff -Nru ublock-origin-1.46.0+dfsg/.gitignore ublock-origin-1.67.0+dfsg/.gitignore --- ublock-origin-1.46.0+dfsg/.gitignore 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.gitignore 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,7 @@ *.bak *.pem +__pycache__/ +node_modules/ /dist/build/ /tmp/ +.DS_Store diff -Nru ublock-origin-1.46.0+dfsg/.gitmodules ublock-origin-1.67.0+dfsg/.gitmodules --- ublock-origin-1.46.0+dfsg/.gitmodules 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.gitmodules 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,6 @@ +[submodule "platform/mv3/extension/lib/codemirror/codemirror-ubol"] + path = platform/mv3/extension/lib/codemirror/codemirror-ubol + url = https://github.com/gorhill/codemirror-ubol.git +[submodule "publish-extension"] + path = publish-extension + url = https://github.com/gorhill/publish-extension.git diff -Nru ublock-origin-1.46.0+dfsg/.jshintrc ublock-origin-1.67.0+dfsg/.jshintrc --- ublock-origin-1.46.0+dfsg/.jshintrc 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/.jshintrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -{ - "browser": true, - "devel": true, - "eqeqeq": true, - "esversion": 8, - "globals": { - "chrome": false, // global variable in Chromium, Chrome, Opera - "self": false, - "vAPI": false, - "URLSearchParams": false, - "WebAssembly": false - }, - "laxbreak": true, - "newcap": false, - "nonew": false, - "strict": "global", - "sub": true, - "undef": true, - "unused": true, - "validthis": true -} diff -Nru ublock-origin-1.46.0+dfsg/CHANGELOG.md ublock-origin-1.67.0+dfsg/CHANGELOG.md --- ublock-origin-1.46.0+dfsg/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/CHANGELOG.md 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,448 @@ +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/a43d1d8c42) +- [Fix `editInboundObjectFn` utility scriptlet](https://github.com/gorhill/uBlock/commit/d376adaae8) +- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/52bc354bce) +- [Add ability to test against regex in JSONPath expressions](https://github.com/gorhill/uBlock/commit/f36d2b8496) +- [Improve `proxy-apply` utility scriptlet](https://github.com/gorhill/uBlock/commit/dd4f764920) +- [Fix `removeparam` for multiple query parameters with same name](https://github.com/gorhill/uBlock/commit/3e5ea3b03f) +- [Improve `trusted-click-element` scriptlet](https://github.com/gorhill/uBlock/commit/9aa91ba111) +- [Improve `google-ima` shim](https://github.com/gorhill/uBlock/commit/8de47f250d) +- [Add back a uBO-specific version of "CERT.PL's Warning List"](https://github.com/gorhill/uBlock/commit/87dddb7d78) + +---------- + +# 1.66.4 + +- [Fix potential infinite loop when scanning for `$` anchor](https://github.com/gorhill/uBlock/commit/889c0eb208) +- [Allow generic exception for `replace=` option](https://github.com/gorhill/uBlock/commit/52dba4116e) + +---------- + +# 1.66.2 + +- [Fix version snafu](https://github.com/gorhill/uBlock/commit/50cb780107) + +---------- + +# 1.66.0 + +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/d2bce26e7d) +- [Add support to strict-block from `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6327aae56c) +- [Improve rendering with high-contrast theme](https://github.com/gorhill/uBlock/commit/5d7e5ee3a0) (fix suggested by @emv33) +- [Fix undue fetch from remote server at first install](https://github.com/gorhill/uBlock/commit/9327e19233) +- [Improve compatibility of `uritransform=` with DNR syntax](https://github.com/gorhill/uBlock/commit/aaf35d9d71) +- [Allow usage of `csp=`/`permissions=` with resource type object](https://github.com/gorhill/uBlock/commit/07e9f805bb) +- [JSONPath: Add ability to select root node for appending/modifying](https://github.com/gorhill/uBlock/commit/faff035203) +- [JSONPath: Add ability to substitute a pattern within a string value](https://github.com/gorhill/uBlock/commit/38ca6d41ff) +- [Remove "CERT.PL's Warning List" from stock lists](https://github.com/gorhill/uBlock/commit/e713e133eb) +- [Fix incorrect CNAME-related test in advanced settings](https://github.com/gorhill/uBlock/commit/171ddd3e06) +- [Remove "AdGuard Tracking Protection"from stock list](https://github.com/gorhill/uBlock/commit/14a9572c86) +- [Add filter list for experimental filters](https://github.com/gorhill/uBlock/commit/d88814bc12) +- [Improve `fingerprint2.js` shim](https://github.com/gorhill/uBlock/commit/7d9317bb17) +- [Make `google-ima` a valid injectable scriptlet](https://github.com/gorhill/uBlock/commit/47cbb43a0e) +- [Improve `abort-current-script` scriptlet](https://github.com/gorhill/uBlock/commit/fef50e59f2) +- [Fix potential exception in procedural operator `:matches-attr`](https://github.com/gorhill/uBlock/commit/e07e7bbd09) +- [Improve reporting of `reason` option in strict-blocked pages](https://github.com/gorhill/uBlock/commit/b7510eee61) +- [Improve `prevent-innerHTML` scriptlet](https://github.com/gorhill/uBlock/commit/b0396029bd) + +---------- + +# 1.65.0 + +## Fixes / changes + +- [Reset `important` option flag at `header` evaluation time](https://github.com/gorhill/uBlock/commit/66b68b4442) +- [Fix broken reverse lookup of filter lists](https://github.com/gorhill/uBlock/commit/527b4a201f) +- [Add `[trusted-]edit-inbound-object` scriptlets](https://github.com/gorhill/uBlock/commit/6e466cf945) +- [Improve `remove-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/0a8ea58bb7) +- [Add `json-edit`-related scriptlets](https://github.com/gorhill/uBlock/commit/87e0434c90) +- [Improve `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/3a2bb62519) +- [Force cache bypass reload when no-scripting switch is toggled](https://github.com/gorhill/uBlock/commit/4affe343dd) +- [Improve `jsonl[...]` suite of scriptlets](https://github.com/gorhill/uBlock/commit/ed9999efd6) +- [Add support for network filter option `message`](https://github.com/gorhill/uBlock/commit/d8298bb067) + - [Complete support for reporing strict-block messages](https://github.com/gorhill/uBlock/commit/253ef7ade3) +- [Make `header=` syntax compatible with DNR rules](https://github.com/gorhill/uBlock/commit/408b538e75) +- [Counter CodeMirror's `pointer-events: none` on scrollbars](https://github.com/gorhill/uBlock/commit/c44f043ed3) +- [Fix element picker issue with explicit dark theme](https://github.com/gorhill/uBlock/commit/0130fdf4a1) + +---------- + +# 1.64.0 + +## Fixes / changes + +- [Use custom blank page for embedded iframe in dashboard](https://github.com/gorhill/uBlock/commit/8cd6212867) +- [Use `color-scheme` `meta` tag, as suggested](https://github.com/gorhill/uBlock/commit/5c029b3532) +- [Bring zapper look in line with uBO Lite's zapper](https://github.com/gorhill/uBlock/commit/3f59f94b60) +- [Ignore `start_page` transition for popup-blocking purpose](https://github.com/gorhill/uBlock/commit/0243a141a7) +- [Exclude `chrome:` as valid openers for popup candidates](https://github.com/gorhill/uBlock/commit/59f4aca010) +- [Fetch diff patches from "reliable" servers only](https://github.com/gorhill/uBlock/commit/8b964a8c54) +- [Add `trusted-create-html` scriptlet](https://github.com/gorhill/uBlock/commit/20dd606504) +- [Mind potential race condition when dynamically registering scriptlets](https://github.com/gorhill/uBlock/commit/15e832da8a) +- [Fix undue unchecking of setting in "My filters"](https://github.com/gorhill/uBlock/commit/2bb6999e3f) +- [Add path support as target option in static extended filtering](https://github.com/gorhill/uBlock/commit/8b696a691a) +- [Add `trusted-prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/4ce26b63ff) +- [Code viewer shouldn't be maximizable](https://github.com/gorhill/uBlock/commit/97e740bd2c) +- [Add `json-edit` suite of scriptlets; extend `replace=` option](https://github.com/gorhill/uBlock/commit/b18daa53aa) +- [Improve `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/68a256bdde) +- [Add `jsonl-prune-xhr-response`/`jsonl-prune-fetch-response` scriptlets](https://github.com/gorhill/uBlock/commit/95a3be9d56) +- [Improve `[json-prune|trusted-replace]-fetch-response` scriptlets](https://github.com/gorhill/uBlock/commit/88fa550a96) + +---------- + +# 1.63.2 + +## Fixes / changes + +- [Fix TypedArray overflow](https://github.com/gorhill/uBlock/commit/76b80baaea) +- [Add prevent-innerHTML scriptlet](https://github.com/gorhill/uBlock/commit/fe744816f1) + +---------- + +# 1.63.0 + +## Fixes / changes + +- [Improve `prevent-set[Timeout|Interval]` scriptlets](https://github.com/gorhill/uBlock/commit/d36ea89a02) +- [Add quit button to element zapper mode](https://github.com/gorhill/uBlock/commit/4aebdbb0a9) +- [Improve `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/9e946ce0c3) +- [Disable obsolete cache-control workaround for Firefox](https://github.com/gorhill/uBlock/commit/34cea70924) +- [Improve `overlay-buster` scriptlet](https://github.com/gorhill/uBlock/commit/fc231998b9) +- [Add ability to inject scriptlets according to origin of ancestor contexts](https://github.com/gorhill/uBlock/commit/a483f7955f) +- [Fix range parser in prevent-setTimeout scriptlet](https://github.com/gorhill/uBlock/commit/e636c32f2a) +- [Add filter option synonyms for `strict1p`/`strict3p`](https://github.com/gorhill/uBlock/commit/34df044808) +- [Increase URL buffer size to 8192 (from 2048)](https://github.com/gorhill/uBlock/commit/36404543e4) +- [Use onmessage/postMessage instead of BroadcastChannel in diff updater](https://github.com/gorhill/uBlock/commit/ea8853cda3) +- [Improve `disable-newtab-links` scriptlet](https://github.com/gorhill/uBlock/commit/d41989e62a) +- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/9c26a07b53) +- [Fix reverse lookup of `##^responseheader(...)` filters](https://github.com/gorhill/uBlock/commit/5921e50e03) +- [Improve `evaldata-prune` scriptlet](https://github.com/gorhill/uBlock/commit/9bb1a2baaf) +- [Comply with Mozilla's "User Consent and Control"](https://github.com/gorhill/uBlock/commit/344539d793) +- [Improve `noeval-if` scriptlet](https://github.com/gorhill/uBlock/commit/0df7faffac) +- [Add "closed","next", "mandatory", "agree/disagree" values to `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/35a47d674b) (by @ryanbr) +- [Add `decline` value to `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/4b12247da1) +- [Improve `abort-on-stack-trace` scriptlet](https://github.com/gorhill/uBlock/commit/b617926c1c) +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/551c6bc6eb) + +---------- + +# 1.62.0 + +## Fixes / changes + +- [Fix deserialization of ArrayBuffer shared by multiple TypedArrays](https://github.com/gorhill/uBlock/commit/c92a518218) +- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/cb6c11ab6f) +- [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/a7aa755f18) +- [Improve `parse-properties-to-match` scriptlet helper](https://github.com/gorhill/uBlock/commit/7494eaf621) +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/9bf8d53ebe) +- [Improve quote usage in filter options and scriptlets](https://github.com/gorhill/uBlock/commit/8ba71f09d7) +- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/7ed3470844) +- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/3417fe3d5d) +- [Block media elements unconditionally when max size is set to 0](https://github.com/gorhill/uBlock/commit/36db7f8327) + - Regression from +- [Visually separate scriptlet parameters in active line](https://github.com/gorhill/uBlock/commit/076e9fa73e) +- [Mitigate potentially delayed execution of scriptlets in Firefox](https://github.com/gorhill/uBlock/commit/b1a00145bd) +- [Improve `prevent-setTimeout`/`prevent-setInterval` scriptlets](https://github.com/gorhill/uBlock/commit/3b7fa79a68) +- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/adced29b5b) +- [Add `-safebase64` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/bcc058eba7) +- [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/77ed83ff2f) +- [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/5f5e3d730f) +- [Improve `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/c8174d6032) +- [Add support for EasyList `{ remove: true }` cosmetic filter syntax](https://github.com/gorhill/uBlock/commit/ff5fc61753) +- [Keep moving related scriptlets into separate files](https://github.com/gorhill/uBlock/commit/e5a088738d) +- [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/ce4908b341) +- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/41616df866) +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/e613282698) + +---------- + +# 1.61.2 + +## Fixes / changes + +- [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) +- [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) + +---------- + +# 1.61.0 + +## Fixes / changes + +- [Improve `prevent-refresh` scriptlet](https://github.com/gorhill/uBlock/commit/8884f259c1) +- [Improve `googlesyndication_adsbygoogle.js` scriptlet](https://github.com/gorhill/uBlock/commit/f645e8f0d2) +- [Offer ability to skip redirects in strict-blocked page](https://github.com/gorhill/uBlock/commit/20b54185fa) +- [Add `-blocked` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/d04dc4c767) +- [Add `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/11ca4a3923) +- [Remove `64:ff9b:` as private network block](https://github.com/gorhill/uBlock/commit/2621c908c3) +- [Ensure `urlskip=` redirects only to `https:`](https://github.com/gorhill/uBlock/commit/32f27c5131) +- [Add support to `urlskip=` media resources](https://github.com/gorhill/uBlock/commit/ce9fc5dc14) +- [Add `-uricomponent` to `urlskip=` option](https://github.com/gorhill/uBlock/commit/01eebffc1f) +- [Add `forbidden`/`forever` as safe cookie values](https://github.com/gorhill/uBlock/commit/4d982d9972) (by @ryanbr) +- [Add regex extraction transformation step to `urlskip=` option](https://github.com/gorhill/uBlock/commit/c86ed5287b) +- [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/85877b12ed) +- [Add support to parse Adguard's `[$domain=/.../]` regex-based modifier](https://github.com/gorhill/uBlock/commit/58bfe4c846) +- [Validate result type of XPath expressions](https://github.com/gorhill/uBlock/commit/c746633693) +- [Fix npm test suite](https://github.com/gorhill/uBlock/commit/818cb2d801) +- [Add ability to lookup parameter name in `urlskip=`](https://github.com/gorhill/uBlock/commit/64b2086ba4) +- [Mind that BroadcastChannel contructor can throw in Firefox](https://github.com/gorhill/uBlock/commit/6d2b3375f8) +- [Add `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/95b0ce5e3a) +- [Add `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/1abc864742) +- [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) +- [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) +- [Blocking large media elements also prevents autoplay, regardless of size](https://github.com/gorhill/uBlock/commit/73ce4e6bcf) +- [Do not discard `!#else` block for unknown preprocessor tokens](https://github.com/gorhill/uBlock/commit/6cac645830) +- [Add ability to decode base64 in `urlskip=`](https://github.com/gorhill/uBlock/commit/e81e70937f) +- [Fix images not properly downloading on click](https://github.com/gorhill/uBlock/commit/aec0bd39e3) + +---------- + +# 1.60.0 + +## Fixes / changes + +- [Add advanced setting `dnsResolveEnabled`](https://github.com/gorhill/uBlock/commit/760b2ffce6) +- [Fix contextual menu quirks](https://github.com/gorhill/uBlock/commit/0a6dc47a72) +- [Fix exception thrown in `spoof-css` in Firefox](https://github.com/gorhill/uBlock/commit/11c3a16036) +- [Throttle down repeated scriptlet logging information](https://github.com/gorhill/uBlock/commit/e8f6f3ddff) +- [Improve scriptlet helper `proxy-apply`](https://github.com/gorhill/uBlock/commit/547fae4842) +- [Add an entry in _Report_ page for badware/phishing category](https://github.com/gorhill/uBlock/commit/e18a3707c7) +- [New static network filter option `urlskip=`](https://github.com/gorhill/uBlock/commit/266ec4894b) +- [Rewrite cname uncloaking code to account for new `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6acf97bf51) +- [Avoid using dns.resolve() for proxied DNS resolution](https://github.com/gorhill/uBlock/commit/d5f14ffa32) +- [Add support for `lan`/`loopback` values to `ipaddress=` option](https://github.com/gorhill/uBlock/commit/030d7334e4) +- [New static network filter option `ipaddress=`](https://github.com/gorhill/uBlock/commit/c6dedd253f) +- [Add ability to quote static network option values](https://github.com/gorhill/uBlock/commit/20115697e5) +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e8202af11d) +- [Apply CSP/PP injections to `object` resources](https://github.com/gorhill/uBlock/commit/89f02098fd) +- [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/c8307f58a3) +- [Add support for `application/dash+xml` in `replace=` option](https://github.com/gorhill/uBlock/commit/91125d29cf) +- [Add ability to directly evaluate static network filtering engine](https://github.com/gorhill/uBlock/commit/b7ed3b45ed) +- [Fix `prevent-window-open` for when logger is open](https://github.com/gorhill/uBlock/commit/f552f655cb) +- [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) +- [Improve `validate-constant` scriptlet helper](https://github.com/gorhill/uBlock/commit/ae5dc6299e) +- [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) +- [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) +- [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) +- [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) +- [Add `checked`/`unchecked` to `set-cookie`](https://github.com/gorhill/uBlock/commit/3e2171f550) (by @ryanbr) +- [Add `allowed`/`denied` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/41c2258f91) (by @ryanbr) +- [Fix plain exceptions not overriding block filters using `header=` option](https://github.com/gorhill/uBlock/commit/1cb660b94e) +- [Improve various scriptlets](https://github.com/gorhill/uBlock/commit/56dfdd2568) +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) +- [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) + +---------- + +# 1.59.0 + +## Fixes / changes + +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/84be9cde6d) +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/8afd9e233d) +- [Improve `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/77feb25c4d) +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e785b99338) +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/66e3a1ad47) +- [Fix CSP/PP header injection in non-document resources](https://github.com/gorhill/uBlock/commit/c90f4933df) +- [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) +- [Add support for `$currentISODate$` in `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/a3576ea651) +- [Add `essential` and `nonessential` to set-cookie](https://github.com/gorhill/uBlock/commit/37d31a82d8) (by @ryanbr) +- [Fix distance calculation in picker](https://github.com/gorhill/uBlock/commit/9569969b55) +- [Fix bad serialization of Date objects](https://github.com/gorhill/uBlock/commit/c154aaa69c) +- [Fix race condition when loading redirect/scriptlet resources](https://github.com/gorhill/uBlock/commit/896737d098) +- [Improve logging in `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/8eb3b19c69) +- [Add `:matches-prop()` pseudo CSS operator](https://github.com/gorhill/uBlock/commit/aca7674bac) +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/b4d8750f44) +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) +- [Improve `trusted-replace-(fetch|xhr)-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) +- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) +- [Add `isodate` as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) +- [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/fa6740a059) +- [Classify generic cosmetic filters with comma as highly generic](https://github.com/gorhill/uBlock/commit/8f81833efc) +- [Raise max buffer size for response body filtering](https://github.com/gorhill/uBlock/commit/82a3992896) +- [Trim end of class tokens in generic cosmetic filtering's surveyor](https://github.com/gorhill/uBlock/commit/8ea1bac80b) +- [Improve `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/0e1e4b82c5) + +---------- + +# 1.58.0 + +## Fixes / changes + +- [Fallback to `requestAnimationFrame` when `requestIdleCallback` is not available](https://github.com/gorhill/uBlock/commit/59ffc96e89) +- [Improve `trusted-click-element` scriptlet](https://github.com/gorhill/uBlock/commit/ee67cd6284) +- [Replace EasyDutch with AdGuard Dutch](https://github.com/gorhill/uBlock/commit/ca7d2ad61d) +- [Add checksum validation when loading trie buffers in selfie](https://github.com/gorhill/uBlock/commit/0e6d607484) +- [Catch exceptions in API calls for the sake of old Chromium versions](https://github.com/gorhill/uBlock/commit/bb479b0a66) +- [Add `accept`/`reject` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/363ad6795c) (by @ryanbr) +- [Use raw string for regex patterns in python scripts](https://github.com/gorhill/uBlock/commit/923452b788) +- [Improve `noeval-if` scriptlet](https://github.com/gorhill/uBlock/commit/4d8ee35ef7) +- [Improve `trusted-set-local-storage-item` scriptlet](https://github.com/gorhill/uBlock/commit/2ccc3135c1) +- [Fix potential corruption when reading serialized data](https://github.com/gorhill/uBlock/commit/c098eb8625) +- [Improve `remove-[attr|class]` scriptlets](https://github.com/gorhill/uBlock/commit/91dfcbef2a) +- [Improve dashboard layout at high zoom factor](https://github.com/gorhill/uBlock/commit/6152f5269e) +- [Add a console pane to the logger](https://github.com/gorhill/uBlock/commit/3b4f02db21) +- [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/277e90a4a7) +- [Fix bad date computation in auto-comment feature](https://github.com/gorhill/uBlock/commit/a5f6c35bb0) +- [Fix regression breaking import of `file://` lists](https://github.com/gorhill/uBlock/commit/c223a8cd39) +- [Add `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/21e1ee30ee) +- [Improve `[trusted-]set-cookie` scriptlets](https://github.com/gorhill/uBlock/commit/49ff7cffb1) + +---------- + +# 1.57.2 + +## Fixes / changes + +- [Fix stray lists in redesigned cache storage](https://github.com/gorhill/uBlock/commit/defd68ef7d) + +---------- + +# 1.57.0 + +## Fixes / changes + +- [Do not block large media resources when loaded as top-level document](https://github.com/gorhill/uBlock/commit/3919a16bb8) +- [Properly manage cache storage regarding managed user filters](https://github.com/gorhill/uBlock/commit/90ab1a76ab) +- [Improve `[trusted-]set-cookie` scriptlets](https://github.com/gorhill/uBlock/commit/11a48561e0) +- [Fixed Belgian and Nepali flags for Windows Chromium users](https://github.com/gorhill/uBlock/commit/499c80bd8a) (by @DandelionSprout) +- [Mind that `tabs.sendMessage` can throw](https://github.com/gorhill/uBlock/commit/3f7374c1f1) +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/9146134874) +- [Append wildcard character only when filter starts & ends with `/`](https://github.com/gorhill/uBlock/commit/1cb190e102) +- [Fix failure to create popup logger window sometimes](https://github.com/gorhill/uBlock/commit/c8762945d9) +- [Improve json-prune-related scriptlets](https://github.com/gorhill/uBlock/commit/e7a0f8c781) +- [Support maximizing editor to viewport size](https://github.com/gorhill/uBlock/commit/664dd95700) +- [Add advanced setting to force popup panel orientation](https://github.com/gorhill/uBlock/commit/0d77ccded7) +- [Add checkboxes to "My filters" pane](https://github.com/gorhill/uBlock/commit/46ea5519c1) +- [Assume UTF-8 when no encoding can be looked up](https://github.com/gorhill/uBlock/commit/63acdcbdeb) +- [Fix issue with "My filters" pane on mobile](https://github.com/gorhill/uBlock/commit/24d94e559d) +- [Support aborting "Pick" mode in element picker](https://github.com/gorhill/uBlock/commit/a557f62112) +- [Remove sections with no lists in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/0f4e50db07) +- [Add "Social widgets", "Cookie notices" sections in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/21a76e32a1) +- [No longer disable generic cosmetic filters by default on mobile](https://github.com/gorhill/uBlock/commit/7a768e7b1a) +- [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/603239970d) +- [Make asset updater compatible with non-persistent background page](https://github.com/gorhill/uBlock/commit/96704f2fda) +- [Move dragbar to the top of element picker dialog](https://github.com/gorhill/uBlock/commit/953c978d59) + - [Move "Quit" button to top bar in element picker](https://github.com/gorhill/uBlock/commit/6266c4718d) +- [Add advanced setting `requestStatsDisabled`](https://github.com/gorhill/uBlock/commit/e02ea69c86) +- [First lookup matching stock lists when importing URLs](https://github.com/gorhill/uBlock/commit/2b16a10b82) +- [Reset filter lists in worker when creating filters via "Block element"](https://github.com/gorhill/uBlock/commit/b0067b79d5) +- [Remove trusted-source requirement when using `badfilter`](https://github.com/gorhill/uBlock/commit/3c299b8632) +- [Redesign cache storage](https://github.com/gorhill/uBlock/commit/086766a924) +- [Don't match network filter-derived regexes against non-network URIs](https://github.com/gorhill/uBlock/commit/2262a129ec) +- [Remove obsolete trusted directives](https://github.com/gorhill/uBlock/commit/439a059cca) +- [Support logging details of calls to `json-prune-fetch-response`](https://github.com/gorhill/uBlock/commit/e527a8f9af) +- [Escape special whitespace characters in attribute values](https://github.com/gorhill/uBlock/commit/be3e366019) + +---------- + +# 1.56.0 + +## Fixes / changes + +- [Mind that multiple `uritransform` may apply to a single request](https://github.com/gorhill/uBlock/commit/2a5a444482) +- [Fix incorrect built-in filtering expression in logger](https://github.com/gorhill/uBlock/commit/9bff0c2f94) +- [Fix improper invalidation of valid `uritransform` exception filters](https://github.com/gorhill/uBlock/commit/21ec5a277c) +- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/b22b3d729b) +- [Fix Chartbeat flicker control `div`'s](https://github.com/gorhill/uBlock/commit/397d6d47b9) (by @ryanbr) +- [Fix potential exfiltration of browsing history by a rogue list author through `permissions=`](https://github.com/gorhill/uBlock/commit/7b138b58c6) +- [Ignore event handler-related attributes in `set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/3037ae5f04) (suggested by @distinctmondaylilac) +- [Fix potential exfiltration of browsing history by a rogue list author through `csp=`](https://github.com/gorhill/uBlock/commit/db5656f607) (reported by @distinctmondaylilac) +- [Output scriptlet logging information to the logger](https://github.com/gorhill/uBlock/commit/869a653fdf) +- [Fix decompiling of scriptlet parameters](https://github.com/gorhill/uBlock/commit/49dd68ef3d) +- [Add support for `extraMatch` in `trusted-click-element` scriptlet](https://github.com/gorhill/uBlock/commit/45e62c939f) +- [Remove minimum height constraint from "My filters" pane](https://github.com/gorhill/uBlock/commit/f624c835c2) +- [Unregister all scriptlets when disabling uBO on a specific site](https://github.com/gorhill/uBlock/commit/13dcd844a7) +- [Allow `uritransform` to process the hash part of a URL](https://github.com/gorhill/uBlock/commit/b19094339f) +- [Remember presentation state of "My rules" pane](https://github.com/gorhill/uBlock/commit/3d1b100646) +- [Fix improperly assembled `!#include` sublists](https://github.com/gorhill/uBlock/commit/0e00010b91) +- [Mark procedural filters with pseudo-elements selector as invalid](https://github.com/gorhill/uBlock/commit/757b8be9cd) +- [Prevent access to picker when "My filters" is not enabled](https://github.com/gorhill/uBlock/commit/bc641fc024) +- [Provide visual feedback when applying changes in "Filter lists" pane](https://github.com/gorhill/uBlock/commit/c4bb8a0f64) +- [Empty query parameters must still use `=`](https://github.com/gorhill/uBlock/commit/1cac61a9a4) +- [Add support to toggle no-scripting switch with keyboard shortcut](https://github.com/gorhill/uBlock/commit/936444883f) +- [Do not exceed rate-limited calls to `handlerBehaviorChanged()`](https://github.com/gorhill/uBlock/commit/63fe18a761) +- [Shield some code paths against potentially tampered global properties](https://github.com/gorhill/uBlock/commit/534d877e95) (in scriptlets) +- [Do not prevent applying changes when lists are updating](https://github.com/gorhill/uBlock/commit/f6b726136c) +- [Add `elements` vararg to `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/060f9d68fc) +- [Do not use tab character as field separator](https://github.com/gorhill/uBlock/commit/a9eb9630cf) (in logger) +- [Prevent `:others()` from hiding `html` tag](https://github.com/gorhill/uBlock/commit/9a104bcbd2) + +---------- + +# 1.55.0 + +## Fixes / changes + +- [Discard repeating adjacent entries in the logger](https://github.com/gorhill/uBlock/commit/55e4cee6e8) +- [Mind drop events in filter expression field of logger](https://github.com/gorhill/uBlock/commit/c8b7d1a526) +- [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/d7063a052f) +- [Fix message entries overflowing in logger](https://github.com/gorhill/uBlock/commit/49c8310e22) +- [Add support for `application/x-javascript` in `replace=` option](https://github.com/gorhill/uBlock/commit/abeadf18eb) +- [Extend support for differential updates to imported lists](https://github.com/gorhill/uBlock/commit/443c1f81e1) +- [Add detection of mismatched `!#if`-`!#endif` in linter](https://github.com/gorhill/uBlock/commit/9f4b31a96f) +- [Support links to update lists which are differential update-friendly](https://github.com/gorhill/uBlock/commit/5e3f9695b4) +- [Remove "Purge all caches" button from "Filter lists" pane](https://github.com/gorhill/uBlock/commit/bd7ce41224) +- [Add support for `all` list token in updater-link feature](https://github.com/gorhill/uBlock/commit/14926913f7) +- [Fix logging of broad exception filter `#@#+js()`](https://github.com/gorhill/uBlock/commit/4305ea9c0c) +- [Improve `no-xhr-if` scriptlet](https://github.com/gorhill/uBlock/commit/d01ad24291) +- [Ensure cache storage backend is selected before access](https://github.com/gorhill/uBlock/commit/bfa28b960e) +- [Fix popup panel rendering when embedded in logger](https://github.com/gorhill/uBlock/commit/4183ce477a) +- [Add visual hint in support information re. differential update](https://github.com/gorhill/uBlock/commit/7e44db763e) +- [Remove obsolete web accessible resources](https://github.com/gorhill/uBlock/commit/310bfec6a1) +- [Rename `urltransform` to `uritransform`](https://github.com/gorhill/uBlock/commit/cdc5e89f52) +- [Vertically expand/collapse in steps in dom inspector](https://github.com/gorhill/uBlock/commit/885bc3875b) +- [Reset the DOM inspector when URL in top context changes](https://github.com/gorhill/uBlock/commit/c744c87607) +- [Support shadow-piercing combinator `>>>` in `trusted-click-element`](https://github.com/gorhill/uBlock/commit/941077a25c) +- [Isolate DOM inspector layers from page context](https://github.com/gorhill/uBlock/commit/ee83a4304a) +- [Refactoring: Replace DOM events with broadcast channels](https://github.com/gorhill/uBlock/commit/67fb969572) +- [Support non-default sticky lists](https://github.com/gorhill/uBlock/commit/ea7d411bc2) +- [Add enableLazyLoad function](https://github.com/gorhill/uBlock/commit/a8cf08325d) (by @spazmodius ) +- [Change frequency of save-to-storage blocking stats](https://github.com/gorhill/uBlock/commit/5a338b7210) +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/6aeab2adbc) +- [Catch cases of `! Expires:` field with no value](https://github.com/gorhill/uBlock/commit/9ce958432d) + +---------- + +# 1.54.0 + +## New + +Differential update of filter lists, as a result of discussions at . Resulting spec is [here](https://github.com/ameshkov/diffupdates). + +![inkscape](https://github.com/gorhill/uBlock/assets/585534/3ee3567b-e24f-4d39-90e2-915b39a114fb) + +The goal is to **NOT** be ranked among the "most popular projects" by bandwidth usage (as per [jsDelivr's public stats](https://www.jsdelivr.com/statistics)): + +![jsDelivr stats](https://github.com/gorhill/uBlock/assets/585534/96c7e0fa-ffcc-4879-a01e-e340b4f0fa9e) + +It is expected that differential updates will lower both requests and bandwidth usage. + +To benefit the much shorter update period enabled by differential updates, you must let uBO auto-update the filter lists. Forcing a manual update will prevent differential updates until the next time a list auto-update. + +## Fixes / changes + +- [Enable path for native `has()` selector in Firefox](https://github.com/gorhill/uBlock/commit/c5724c1cce) +- [Allow scriptlets to be injected in `about:blank`](https://github.com/gorhill/uBlock/commit/3fd2588650) +- [Fix faulty `as` vararg in `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/c292a90b90) +- [Add support to redirect to `noop.json`](https://github.com/gorhill/uBlock/commit/bd8a91ed3a) +- [More improvements to the `google-ima` shim script](https://github.com/gorhill/uBlock/commit/c1d8f5908d) (by @kzar) +- [All exceptions filters are exempt from requiring a trusted source](https://github.com/gorhill/uBlock/commit/d2b8d990e6) +- [Add `trusted-set-session-storage-item` scriptlet](https://github.com/gorhill/uBlock/commit/f3d6a21e7a) +- [Allow the use of quotes in `set-cookie` scriptlet ](https://github.com/gorhill/uBlock/commit/7c562d0c5c) +- [Allow the use of quotes in `set-(local|session)-storage-item`](https://github.com/gorhill/uBlock/commit/decafc5cbf) +- [Add ability to trigger cookie removal on specific events](https://github.com/gorhill/uBlock/commit/ef311ddbec) +- [Ensure CSSTree does not hold a reference onto last parsed string](https://github.com/gorhill/uBlock/commit/1dba557c9a) +- [Lower minimum Expires value to 4h](https://github.com/gorhill/uBlock/commit/2360bc02f3) +- [Properly reset needle length in unserialized buffer](https://github.com/gorhill/uBlock/commit/8ed1ad9c9d) +- [Add additional flags to regional lists](https://github.com/gorhill/uBlock/commit/0962366524) (by @DandelionSprout) +- [Harden scriptlets which need to serialize function code into string](https://github.com/gorhill/uBlock/commit/7823d98070) +- [Reset `g` regexes before use in `rmnt`/`rpnt` scriptlets](https://github.com/gorhill/uBlock/commit/cdc3f66a6b) +- [Apply response filtering according to mime type](https://github.com/gorhill/uBlock/commit/6417f54299) +- [Add t/f to set-cookie](https://github.com/gorhill/uBlock/commit/4ab1c36ac9) (by @ryanbr) +- [Have `urltransform=` use the same syntax as `replace=`](https://github.com/gorhill/uBlock/commit/d7c99b46e6) +- [Implement network filter option `replace=`](https://github.com/gorhill/uBlock/commit/7c3e060c01) (Firefox only because [filterResponseData](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/filterResponseData#browser_compatibility)) +- [Prevent evaluating the SNFE until fully loaded](https://github.com/gorhill/uBlock/commit/89b272775a) +- [Add support for differential update of filter lists](https://github.com/gorhill/uBlock/commit/d05ff8ffeb) + +---------- diff -Nru ublock-origin-1.46.0+dfsg/CONTRIBUTING.md ublock-origin-1.67.0+dfsg/CONTRIBUTING.md --- ublock-origin-1.46.0+dfsg/CONTRIBUTING.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/CONTRIBUTING.md 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,31 @@ -# Submitting issues +# Contributions -Submit on . +Please refer to the sections below to find the appropriate destination for your contributions. Thank you for your support! -Issue tracker here is read-only for non-[prior contributors](https://github.com/gorhill/uBlock/graphs/contributors). +--- + +### Translations + +You can help translate uBO via [Crowdin](https://crowdin.com/project/ublock). + +--- + +### Reporting Issues + +The issue tracker in this repository is deprecated. Use the links below to report your issues. + +#### Support Forum + +For support, questions, or assistance, please visit [/r/uBlockOrigin](https://www.reddit.com/r/uBlockOrigin/). + +#### Filter List Issues + +Report issues related to filter lists or broken website functionality in the [uAssets issue tracker](https://github.com/uBlockOrigin/uAssets/issues). + +#### uBlock Origin (uBO) Issues + +For issues specifically about uBO, please use the [uBO issue tracker](https://github.com/uBlockOrigin/uBlock-issues/issues). + +#### uBO Lite (uBOL) Issues + +For issues related to the Manifest Version 3 (MV3) variant, report them in the [uBOL issue tracker](https://github.com/uBlockOrigin/uBOL-home/issues). diff -Nru ublock-origin-1.46.0+dfsg/MANIFESTO.md ublock-origin-1.67.0+dfsg/MANIFESTO.md --- ublock-origin-1.46.0+dfsg/MANIFESTO.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/MANIFESTO.md 2025-10-25 19:32:51.000000000 +0000 @@ -1,10 +1,7 @@ -### This is uBlock's manifesto +uBlock Origin (uBO)'s manifesto: -1. The **user decides** what web content is acceptable or not in their browser. +The **user decides** what web content is acceptable in their browser. -The uBlock project does not support Adblock Plus' _"Acceptable Ads Manifesto"_, -because the _"Acceptable Ads"_ marketing campaign is really the business -plan of a for-profit entity. +The uBO project does not support Adblock Plus' _"Acceptable Ads Manifesto"_ because the _"Acceptable Ads"_ marketing campaign is the business plan of a for-profit entity. -Users are best placed to know what is or is not acceptable to them. uBlock's -sole purpose is to give users the means to enforce their own choices. +Users are the best placed to know what is or is not acceptable to them. uBO's sole purpose is to give users the means to enforce their choices. diff -Nru ublock-origin-1.46.0+dfsg/Makefile ublock-origin-1.67.0+dfsg/Makefile --- ublock-origin-1.46.0+dfsg/Makefile 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/Makefile 2025-10-25 19:32:51.000000000 +0000 @@ -1,12 +1,25 @@ # https://stackoverflow.com/a/6273809 run_options := $(filter-out $@,$(MAKECMDGOALS)) -.PHONY: all clean test lint chromium firefox npm dig mv3 mv3-quick \ - compare maxcost medcost mincost modifiers record wasm +.PHONY: all clean cleanassets test lint chromium opera firefox npm dig \ + mv3-chromium mv3-firefox mv3-edge mv3-safari ubol-codemirror \ + compare maxcost medcost mincost modifiers record wasm \ + publish-chromium publish-edge publish-firefox \ + publish-dev-chromium publish-dev-firefox \ + upload-firefox upload-dev-firefox -sources := $(wildcard assets/resources/* dist/version src/* src/*/* src/*/*/* src/*/*/*/*) -platform := $(wildcard platform/* platform/*/* platform/*/*/* platform/*/*/*/*) +sources := ./dist/version $(shell find ./assets -type f) $(shell find ./src -type f) +platform := $(wildcard platform/*/*) assets := dist/build/uAssets +mv3-sources := \ + $(shell find ./src -type f) \ + $(wildcard platform/mv3/*) \ + $(shell find ./platform/mv3/extension -name codemirror-ubol -prune -o -type f) \ + platform/mv3/extension/lib/codemirror/codemirror-ubol/dist/cm6.bundle.ubol.min.js +mv3-data := $(shell find ./dist/build/mv3-data -type f) + +mv3-edge-deps := $(wildcard platform/mv3/edge/*) +mv3-safari-deps := $(wildcard platform/mv3/safari/*) all: chromium firefox npm @@ -16,6 +29,12 @@ # Build the extension for Chromium. chromium: dist/build/uBlock0.chromium +dist/build/uBlock0.opera: tools/make-opera.sh $(sources) $(platform) $(assets) + tools/make-opera.sh + +# Build the extension for Opera. +opera: dist/build/uBlock0.opera + dist/build/uBlock0.firefox: tools/make-firefox.sh $(sources) $(platform) $(assets) tools/make-firefox.sh all @@ -25,20 +44,16 @@ dist/build/uBlock0.npm: tools/make-nodejs.sh $(sources) $(platform) $(assets) tools/make-npm.sh -# Build the Node.js package. npm: dist/build/uBlock0.npm -lint: npm - cd dist/build/uBlock0.npm && npm run lint +# Dev tools +node_modules: + npm install -test: npm - cd dist/build/uBlock0.npm && npm run test +init: node_modules -test-full-battery: npm - cd dist/build/uBlock0.npm && npm run test-full-battery - -check-leaks: npm - cd dist/build/uBlock0.npm && npm run check-leaks +lint: init + npm run lint dist/build/uBlock0.dig: tools/make-nodejs.sh $(sources) $(platform) $(assets) tools/make-dig.sh @@ -49,21 +64,111 @@ dig-snfe: dig cd dist/build/uBlock0.dig && npm run snfe $(run_options) -mv3: tools/make-mv3.sh $(sources) $(platform) - tools/make-mv3.sh +dist/build/mv3-data: + mkdir -p dist/build/mv3-data + +ubol-codemirror: + $(MAKE) -sC platform/mv3/extension/lib/codemirror/codemirror-ubol/ ubol.bundle + +dist/build/uBOLite.chromium: tools/make-mv3.sh $(mv3-sources) $(platform) $(mv3-data) dist/build/mv3-data + tools/make-mv3.sh chromium -mv3-quick: tools/make-mv3.sh $(sources) $(platform) - tools/make-mv3.sh quick +mv3-chromium: ubol-codemirror dist/build/uBOLite.chromium -mv3-full: tools/make-mv3.sh $(sources) $(platform) - tools/make-mv3.sh full +dist/build/uBOLite.firefox: tools/make-mv3.sh $(mv3-sources) $(platform) $(mv3-data) dist/build/mv3-data + tools/make-mv3.sh firefox + +mv3-firefox: ubol-codemirror dist/build/uBOLite.firefox + +dist/build/uBOLite.edge: tools/make-mv3.sh $(mv3-sources) $(mv3-edge-deps) $(mv3-data) dist/build/mv3-data + tools/make-mv3.sh edge + +mv3-edge: ubol-codemirror dist/build/uBOLite.edge + +dist/build/uBOLite.safari: tools/make-mv3.sh $(mv3-sources) $(mv3-safari-deps) $(mv3-data) dist/build/mv3-data + tools/make-mv3.sh safari + +mv3-safari: ubol-codemirror dist/build/uBOLite.safari dist/build/uAssets: tools/pull-assets.sh clean: - rm -rf dist/build tmp/node_modules + rm -rf dist/build tmp/node_modules node_modules + +cleanassets: + rm -rf dist/build/mv3-data dist/build/uAssets +# Usage: make publish-publish version=? +publish-chromium: + node publish-extension/publish-chromium.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=chromium \ + storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm + +# Usage: make publish-edge version=? +publish-edge: + node publish-extension/publish-edge.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=chromium \ + datebasedmajor=1 \ + storeid=odfafepnkmbhccpbejgmiehpchacaeak \ + productid=$(shell secret-tool lookup token ubo_edge_id) + +# Usage: make publish-firefox version=? +publish-firefox: + node publish-extension/publish-firefox.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=firefox \ + storeid=uBlock0@raymondhill.net \ + channel=listed + +# Usage: make publish-dev-chromium version=? +publish-dev-chromium: + node publish-extension/publish-chromium.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=chromium \ + storeid=cgbcahbpdhpcegmbfconppldiemgcoii + +# Usage: make publish-dev-firefox version=? +publish-dev-firefox: + node publish-extension/publish-firefox.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=firefox \ + storeid=uBlock0@raymondhill.net \ + channel=unlisted \ + updatepath=./dist/firefox/updates.json + +# Usage: make upload-firefox version=? +upload-firefox: + node publish-extension/upload-firefox.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=firefox \ + storeid=uBlock0@raymondhill.net \ + channel=listed + +# Usage: make upload-dev-firefox version=? +upload-dev-firefox: + node publish-extension/upload-firefox.js \ + ghowner=gorhill \ + ghrepo=uBlock \ + ghtag=$(version) \ + ghasset=firefox \ + storeid=uBlock0@raymondhill.net \ + channel=unlisted \ + updatepath=./dist/firefox/updates.json # Not real targets, just convenient for auto-completion at shell prompt compare: diff -Nru ublock-origin-1.46.0+dfsg/README.md ublock-origin-1.67.0+dfsg/README.md --- ublock-origin-1.46.0+dfsg/README.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/README.md 2025-10-25 19:32:51.000000000 +0000 @@ -5,6 +5,7 @@ [![Badge NPM]][NPM] [![Badge Mozilla]][Mozilla] [![Badge Chrome]][Chrome] +[![Badge Edge]][Edge] *** @@ -14,86 +15,97 @@ uBlock Origin (uBO) -

-BEWARE! uBO is (and has always been) COMPLETELY UNRELATED to the website ublock.org. -

+ +| Browser | Install from ... | Status | +| :-------: | ---------------- | ------ | +| Get uBlock Origin for Firefox | Firefox Add-ons | [uBO works best on Firefox](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox) | +| Get uBlock Origin for Microsoft Edge | Edge Add-ons | +| Get uBlock Origin for Opera | Opera Add-ons | +| Get uBlock Origin for Chromium | Chrome Web Store | About Google Chrome's "This extension may soon no longer be supported"
End of support on Chrome 139 | +| Get uBlock Origin for Thunderbird | Thunderbird Add-ons | [No longer updated and stuck at 1.49.2.](https://github.com/uBlockOrigin/uBlock-issues/issues/2928) Later versions require "GitHub - Releases". | +| Get uBlock Origin through GitHub | GitHub - Releases | Stable and development versions on Firefox, Chromium MV2, and Thunderbird. Must be placed manually into web browsers; the Chromium and Thunderbird versions usually won't auto-update. *** -

-Get uBlock Origin for Firefox -Get uBlock Origin for Chromium -Get uBlock Origin for Microsoft Edge -Get uBlock Origin for Opera -

+uBlock Origin (uBO) is a CPU and memory-efficient [wide-spectrum content blocker][Blocking] for Chromium and Firefox. It blocks ads, trackers, coin miners, popups, annoying anti-blockers, malware sites, etc., by default using [EasyList][EasyList], [EasyPrivacy][EasyPrivacy], [Peter Lowe's Blocklist][Peter Lowe's Blocklist], [Online Malicious URL Blocklist][Malicious Blocklist], and uBO [filter lists][uBO Filters]. There are many other lists available to block even more. Hosts files are also supported. uBO uses the EasyList filter syntax and [extends][Extended Syntax] the syntax to work with custom rules and filters. -*** +You may easily unselect any preselected filter lists if you think uBO blocks too much. For reference, Adblock Plus installs with only EasyList, ABP filters, and Acceptable Ads enabled by default. + +It is important to note that using a blocker is **NOT** [theft]. Do not fall for this creepy idea. The _ultimate_ logical consequence of `blocking = theft` is the criminalization of the inalienable right to privacy. -uBO is **NOT** an "ad blocker"; it is a [wide-spectrum content blocker][Blocking] for Chromium and Firefox with CPU and memory efficiency as primary features. After a new installation, the default behavior of uBO is to block ads, trackers, and malware sites through [EasyList][EasyList], [EasyPrivacy][EasyPrivacy], [Peter Lowe's Blocklist][Peter Lowe's Blocklist], [Online Malicious URL Blocklist][Malicious Blocklist], and uBO's [filter lists][uBO Filters]. +Ads, "unintrusive" or not, are just the visible portion of the privacy-invading means entering your browser when you visit most sites. **uBO's primary goal is to help users neutralize these privacy-invading methods** in a way that welcomes those users who do not wish to use more technical means. *** * [Documentation](#documentation) -* [General Information](#general-information) * [Installation](#installation) + * [Firefox](#firefox) + * [Thunderbird](#thunderbird) * [Chromium](#chromium) - * [Firefox / Firefox for Android](#firefox--firefox-for-android) + * [All Programs](#all-programs) + * [Enterprise Deployment](#enterprise-deployment) * [Release History](#release-history) +* [Translations](#translations) * [About](#about) -* [License](#license) -* [Privacy Policy] -* [Wiki](https://github.com/gorhill/uBlock/wiki) ## Documentation - Basic mode | Advanced-user mode -:----------:|:------------------: -[Popup user interface] | [A point-and-click firewall that is configurable on a per-site basis][Dynamic Filters] -
.
.
|
Configure as you wish.
The image shows 3rd-party scripts and frames blocked by default everywhere.
+ + + + + + + + + + + + + + + + + +
Basic ModeAdvanced Mode
The simple popup user interface for an install-it-and-forget-it type of installation that is configured optimally by default.The advanced popup user interface includes a point-and-click firewall that is configurable on a per-site basis.
-Visit the [wiki][Wiki] for documentation. +Visit the [Wiki][Wiki] for documentation. For support, questions, or help, visit [/r/uBlockOrigin][Reddit]. -## General Information +## Installation + +[Required Permissions][Permissions] -uBO is **NOT** an "ad blocker"; it is a wide-spectrum content blocker. uBO blocks ads through the EasyList filter syntax and [extends][Extended Syntax] the syntax to work with custom rules and filters. Furthermore, the advanced mode allows uBO to work in [default-deny mode][Default Deny], which will cause [all 3rd-party network requests][3rd Party Requests] to be blocked by default unless allowed by the user. +#### Firefox -It is important to note that using a blocker is **NOT** [theft]. Do not fall for this creepy idea. The _ultimate_ logical consequence of `blocking = theft` is the criminalization of the inalienable right to privacy. +[Firefox Add-ons][Mozilla] -Ads, "unintrusive" or not, are just the visible portion of the privacy-invading means entering your browser when you visit most sites. **uBO's primary goal is to help users neutralize these privacy-invading methods** in a way that welcomes those users who do not wish to use more technical, involved means (such as [uMatrix]). +[Development Builds][Beta] -EasyList, EasyPrivacy, Peter Lowe's Blocklist, Online Malicious URL Blocklist, and uBO's filter lists are default enabled when you install uBO. Many other lists are available to block trackers, analytics, and more. Hosts files are also supported. +uBO [works best][Works Best] on Firefox and is available for desktop and Android versions. -Once you install uBO, you may easily unselect any preselected filter lists if you think uBO blocks too much. For reference, Adblock Plus installs with only EasyList, ABP filters, and Acceptable Ads enabled by default. +#### Thunderbird -## Installation +[Thunderbird Add-ons][Thunderbird] -[Required Permissions][Permissions] +In Thunderbird, uBlock Origin does not affect emails, just feeds. #### Chromium [Chrome Web Store][Chrome] -[Microsoft Edge Add-ons][Edge] (Published by: [Nicole Rolls][Nicole Rolls]) +[Microsoft Edge Add-ons][Edge] (Published by [Nicole Rolls][Nicole Rolls] until version 1.62. Ownership transfer at version 1.64.) [Opera Add-ons][Opera] -[Development Build][Chrome Dev] +[Development Builds][Chrome Dev] uBO should be compatible with any Chromium-based browser. -#### Firefox / Firefox for Android - -[Firefox Add-ons][Mozilla] - -[Development Build][Beta] - -#### All Browsers +#### All Programs -Do **NOT** use any other content blocker concurrently with uBO to benefit from its higher efficiency. uBO will [perform][Performance] as well as or better than most of the other popular ad blockers. Other blockers can prevent uBO's privacy or anti-blocker-defusing features from working correctly. - -Do **NOT** use uBO along with other [similarly-purposed blockers][Similarly-Purposed]. +Do **NOT** use uBO with any other content blocker. uBO [performs][Performance] as well as or better than most popular blockers. Other blockers can prevent uBO's privacy or anti-blocker-defusing features from working correctly. [Manual Installation][Manual Installation] @@ -105,36 +117,37 @@ [Releases Page][Releases] +## Translations + +Help translate uBO via [Crowdin][Crowdin]. + ## About [Manifesto][Manifesto] -Free. Open-source. For users by users. No donations sought. - -Without the preset filter lists, this extension is nothing. If you ever want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free. +[Privacy Policy][Privacy Policy] -You can help contribute by translating uBO on [Crowdin]. +[GPLv3 License][License] -## License +Free. Open-source. For users by users. No donations sought. -[GPLv3][License] +If you ever want to contribute something, think about the people working hard to maintain the filter lists you are using, which are available to use by all for free. [Peter Lowe's Blocklist]: https://pgl.yoyo.org/adservers/ [Malicious Blocklist]: https://gitlab.com/malware-filter/urlhaus-filter#malicious-url-blocklist -[3rd Party Requests]: https://requestpolicycontinued.github.io/#what-are-cross-site-requests -[Similarly-Purposed]: https://twitter.com/gorhill/status/1033706103782170625 -[Performance]: https://www.debugbear.com/blog/chrome-extension-performance-2021#how-do-ad-blockers-and-privacy-tools-affect-browser-performance +[Performance]: https://www.debugbear.com/blog/chrome-extensions-website-performance#the-impact-of-ad-blocking-on-website-performance [EasyPrivacy]: https://easylist.to/#easyprivacy -[Chrome Dev]: https://chrome.google.com/webstore/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii +[Thunderbird]: https://addons.thunderbird.net/thunderbird/addon/ublock-origin/ +[Chrome Dev]: https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii [EasyList]: https://easylist.to/#easylist [Mozilla]: https://addons.mozilla.org/addon/ublock-origin/ [Crowdin]: https://crowdin.com/project/ublock -[Chrome]: https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm +[Chrome]: https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm [Reddit]: https://www.reddit.com/r/uBlockOrigin/ -[Theft]: https://twitter.com/LeaVerou/status/518154828166725632 +[Theft]: https://x.com/LeaVerou/status/518154828166725632 [Opera]: https://addons.opera.com/extensions/details/ublock/ [Edge]: https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak [NPM]: https://www.npmjs.com/package/@gorhill/ubo-core @@ -144,27 +157,22 @@ [Nicole Rolls]: https://github.com/nicole-ashley - -[Popup User Interface]: https://github.com/gorhill/uBlock/wiki/Quick-guide:-popup-user-interface [Manual Installation]: https://github.com/gorhill/uBlock/tree/master/dist#install [Extended Syntax]: https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#extended-syntax -[Dynamic Filters]: https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-quick-guide [Privacy Policy]: https://github.com/gorhill/uBlock/wiki/Privacy-policy -[Default Deny]: https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-default-deny [uBO Filters]: https://github.com/uBlockOrigin/uAssets/tree/master/filters [Permissions]: https://github.com/gorhill/uBlock/wiki/Permissions [Commit Rate]: https://github.com/gorhill/uBlock/commits/master +[Works Best]: https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox [Deployment]: https://github.com/gorhill/uBlock/wiki/Deploying-uBlock-Origin [Blocking]: https://github.com/gorhill/uBlock/wiki/Blocking-mode [Releases]: https://github.com/gorhill/uBlock/releases -[UMatrix]: https://github.com/gorhill/uMatrix [Issues]: https://github.com/uBlockOrigin/uBlock-issues/issues [Beta]: https://github.com/gorhill/uBlock/blob/master/dist/README.md#for-beta-version [Wiki]: https://github.com/gorhill/uBlock/wiki - [Badge Localization]: https://d322cqt584bo4o.cloudfront.net/ublock/localized.svg @@ -172,6 +180,6 @@ [Badge Mozilla]: https://img.shields.io/amo/rating/ublock-origin?label=Firefox [Badge License]: https://img.shields.io/badge/License-GPLv3-blue.svg [Badge Chrome]: https://img.shields.io/chrome-web-store/rating/cjpalhdlnbpafiamejdnhcphjbkeiagm?label=Chrome +[Badge Edge]: https://img.shields.io/badge/dynamic/json?label=Edge&color=brightgreen&query=%24.averageRating&suffix=%2F%35&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Fodfafepnkmbhccpbejgmiehpchacaeak [Badge Issues]: https://img.shields.io/github/issues/uBlockOrigin/uBlock-issues [Badge NPM]: https://img.shields.io/npm/v/@gorhill/ubo-core - diff -Nru ublock-origin-1.46.0+dfsg/assets/assets.dev.json ublock-origin-1.67.0+dfsg/assets/assets.dev.json --- ublock-origin-1.46.0+dfsg/assets/assets.dev.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/assets/assets.dev.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,973 @@ +{ + "assets.json": { + "content": "internal", + "updateAfter": 13, + "contentURL": [ + "https://raw.githubusercontent.com/gorhill/uBlock/master/assets/assets.dev.json", + "assets/assets.dev.json" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/ublock/assets.dev.json", + "https://ublockorigin.pages.dev/ublock/assets.dev.json", + "https://cdn.jsdelivr.net/gh/gorhill/uBlock@master/assets/assets.dev.json", + "https://cdn.statically.io/gh/gorhill/uBlock/master/assets/assets.dev.json" + ] + }, + "public_suffix_list.dat": { + "content": "internal", + "updateAfter": 19, + "contentURL": [ + "https://publicsuffix.org/list/public_suffix_list.dat", + "assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat" + ] + }, + "ublock-badlists": { + "content": "internal", + "updateAfter": 29, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/badlists.txt", + "assets/ublock/badlists.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/badlists.txt", + "https://ublockorigin.pages.dev/filters/badlists.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badlists.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt" + ] + }, + "ublock-filters": { + "content": "filters", + "group": "default", + "parent": "uBlock filters", + "title": "uBlock filters – Ads", + "tags": "ads", + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/filters.txt", + "assets/ublock/filters.min.txt", + "assets/ublock/filters.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/filters.min.txt", + "https://ublockorigin.pages.dev/filters/filters.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "ublock-badware": { + "content": "filters", + "group": "default", + "parent": "uBlock filters", + "title": "uBlock filters – Badware risks", + "tags": "malware security", + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/badware.txt", + "assets/ublock/badware.min.txt", + "assets/ublock/badware.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/badware.min.txt", + "https://ublockorigin.pages.dev/filters/badware.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets", + "instructionURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks" + }, + "ublock-privacy": { + "content": "filters", + "group": "default", + "parent": "uBlock filters", + "title": "uBlock filters – Privacy", + "tags": "privacy", + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/privacy.txt", + "assets/ublock/privacy.min.txt", + "assets/ublock/privacy.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/privacy.min.txt", + "https://ublockorigin.pages.dev/filters/privacy.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "ublock-unbreak": { + "content": "filters", + "group": "default", + "parent": "uBlock filters", + "title": "uBlock filters – Unbreak", + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/unbreak.txt", + "assets/ublock/unbreak.min.txt", + "assets/ublock/unbreak.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.min.txt", + "https://ublockorigin.pages.dev/filters/unbreak.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "ublock-quick-fixes": { + "content": "filters", + "group": "default", + "parent": "uBlock filters", + "title": "uBlock filters – Quick fixes", + "contentURL": [ + "https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt", + "assets/ublock/quick-fixes.min.txt", + "assets/ublock/quick-fixes.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt", + "https://ublockorigin.pages.dev/filters/quick-fixes.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "ublock-experimental": { + "content": "filters", + "group": "default", + "off": true, + "title": "uBlock filters – Experimental", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/experimental.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/experimental.min.txt", + "https://ublockorigin.pages.dev/filters/experimental.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/experimental.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/experimental.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "adguard-generic": { + "content": "filters", + "group": "ads", + "off": true, + "title": "AdGuard – Ads", + "tags": "ads", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "adguard-mobile": { + "content": "filters", + "group": "ads", + "off": true, + "title": "AdGuard – Mobile Ads", + "tags": "ads mobile", + "ua": "mobile", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/11.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "easylist": { + "content": "filters", + "group": "ads", + "title": "EasyList", + "tags": "ads", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt", + "assets/thirdparties/easylist/easylist.txt" + ], + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://easylist.to/" + }, + "adguard-spyware-url": { + "content": "filters", + "group": "privacy", + "off": true, + "title": "AdGuard URL Tracking Protection", + "tags": "privacy", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "block-lan": { + "content": "filters", + "group": "privacy", + "off": true, + "title": "Block Outsider Intrusion into LAN", + "tags": "privacy security", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/lan-block.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/lan-block.txt", + "https://ublockorigin.pages.dev/filters/lan-block.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/lan-block.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "easyprivacy": { + "content": "filters", + "group": "privacy", + "title": "EasyPrivacy", + "tags": "privacy", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt", + "assets/thirdparties/easylist/easyprivacy.txt" + ], + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easyprivacy.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt", + "https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://easylist.to/" + }, + "urlhaus-1": { + "content": "filters", + "group": "malware", + "title": "Online Malicious URL Blocklist", + "contentURL": [ + "https://malware-filter.gitlab.io/urlhaus-filter/urlhaus-filter-ag-online.txt", + "assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt" + ], + "cdnURLs": [ + "https://curbengh.github.io/malware-filter/urlhaus-filter-ag-online.txt", + "https://malware-filter.gitlab.io/urlhaus-filter/urlhaus-filter-ag-online.txt", + "https://malware-filter.pages.dev/urlhaus-filter-ag-online.txt" + ], + "supportURL": "https://gitlab.com/malware-filter/urlhaus-filter#malicious-url-blocklist" + }, + "curben-phishing": { + "content": "filters", + "group": "malware", + "off": true, + "title": "Phishing URL Blocklist", + "contentURL": "https://malware-filter.gitlab.io/phishing-filter/phishing-filter.txt", + "cdnURLs": [ + "https://curbengh.github.io/phishing-filter/phishing-filter.txt", + "https://malware-filter.gitlab.io/phishing-filter/phishing-filter.txt", + "https://phishing-filter.pages.dev/phishing-filter.txt" + ], + "supportURL": "https://gitlab.com/malware-filter/phishing-filter#phishing-url-blocklist" + }, + "adguard-cookies": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "AdGuard – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/18.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "ublock-cookies-adguard": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "fanboy-cookiemonster": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", + "off": true, + "title": "EasyList – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "ublock-cookies-easylist": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", + "off": true, + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "adguard-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "AdGuard – Social Widgets", + "tags": "annoyances social", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "fanboy-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "EasyList – Social Widgets", + "tags": "annoyances social", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "supportURL": "https://easylist.to/" + }, + "fanboy-thirdparty_social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "off": true, + "title": "Fanboy – Anti-Facebook", + "tags": "privacy", + "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", + "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" + }, + "adguard-popup-overlays": { + "content": "filters", + "group": "annoyances", + "parent": "AdGuard – Annoyances", + "off": true, + "title": "AdGuard – Popup Overlays", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/19.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "adguard-mobile-app-banners": { + "content": "filters", + "group": "annoyances", + "parent": "AdGuard – Annoyances", + "off": true, + "title": "AdGuard – Mobile App Banners", + "tags": "annoyances mobile", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/20.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "adguard-other-annoyances": { + "content": "filters", + "group": "annoyances", + "parent": "AdGuard – Annoyances", + "off": true, + "title": "AdGuard – Other Annoyances", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/21.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "adguard-widgets": { + "content": "filters", + "group": "annoyances", + "parent": "AdGuard – Annoyances", + "off": true, + "title": "AdGuard – Widgets", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/22.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "easylist-annoyances": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Other Annoyances", + "tags": "annoyances", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-annoyances.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-annoyances.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-annoyances.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-annoyances.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "easylist-chat": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Chat Widgets", + "tags": "annoyances", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-chat.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-chat.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-chat.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-chat.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "easylist-newsletters": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Newsletter Notices", + "tags": "annoyances", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-newsletters.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-newsletters.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-newsletters.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-newsletters.txt" + ], + "supportURL": "https://easylist.to/" + }, + "easylist-notifications": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Notifications", + "tags": "annoyances", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-notifications.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-notifications.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-notifications.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-notifications.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-notifications.txt" + ], + "supportURL": "https://easylist.to/" + }, + "ublock-annoyances": { + "content": "filters", + "group": "annoyances", + "off": true, + "title": "uBlock filters – Annoyances", + "tags": "annoyances", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances.min.txt", + "https://ublockorigin.pages.dev/filters/annoyances.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "dpollock-0": { + "content": "filters", + "group": "multipurpose", + "updateAfter": 13, + "off": true, + "title": "Dan Pollock’s hosts file", + "tags": "ads privacy security", + "contentURL": "https://someonewhocares.org/hosts/hosts", + "supportURL": "https://someonewhocares.org/hosts/" + }, + "plowe-0": { + "content": "filters", + "group": "multipurpose", + "updateAfter": 13, + "title": "Peter Lowe’s Ad and tracking server list", + "tags": "ads privacy security", + "preferred": true, + "contentURL": [ + "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext", + "assets/thirdparties/pgl.yoyo.org/as/serverlist.txt", + "assets/thirdparties/pgl.yoyo.org/as/serverlist" + ], + "supportURL": "https://pgl.yoyo.org/adservers/" + }, + "ALB-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇦🇱al 🇽🇰xk: Adblock List for Albania", + "tags": "ads albania shqipja", + "lang": "sq", + "contentURL": "https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt", + "supportURL": "https://github.com/AnXh3L0/blocklist" + }, + "ara-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇪🇬eg 🇸🇦sa 🇲🇦ma 🇩🇿dz: Liste AR", + "tags": "ads arabic اَلْعَرَبِيَّةُ‎", + "lang": "ar kab", + "contentURL": "https://easylist-downloads.adblockplus.org/Liste_AR.txt", + "supportURL": "https://forums.lanik.us/viewforum.php?f=98" + }, + "BGR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇧🇬bg: Bulgarian Adblock list", + "tags": "ads bulgarian България macedonian Македонија", + "lang": "bg mk", + "contentURL": "https://stanev.org/abp/adblock_bg.txt", + "supportURL": "https://stanev.org/abp/" + }, + "CHN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇨🇳cn 🇹🇼tw: AdGuard Chinese (中文)", + "tags": "ads chinese 中文", + "lang": "ug zh", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/224.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "CZE-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇨🇿cz 🇸🇰sk: EasyList Czech and Slovak", + "tags": "ads czech česká slovak slovenská", + "lang": "cs sk", + "contentURL": "https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt", + "supportURL": "https://github.com/tomasko126/easylistczechandslovak" + }, + "DEU-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇩🇪de 🇨🇭ch 🇦🇹at: EasyList Germany", + "tags": "ads german deutschland luxembourgish lëtzebuerg romansh", + "lang": "de dsb hsb lb rm", + "contentURL": [ + "https://easylist.to/easylistgermany/easylistgermany.txt", + "https://easylist-downloads.adblockplus.org/easylistgermany.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=90" + }, + "EST-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇪🇪ee: Eesti saitidele kohandatud filter", + "tags": "ads estonian", + "lang": "et", + "contentURL": "https://adblock.ee/list.txt", + "supportURL": "https://adblock.ee" + }, + "FIN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇫🇮fi: Adblock List for Finland", + "tags": "ads finnish", + "lang": "fi", + "contentURL": "https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/gh-pages/Finland_adb.txt", + "supportURL": "https://github.com/finnish-easylist-addition/finnish-easylist-addition" + }, + "FRA-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇫🇷fr 🇨🇦ca: AdGuard Français", + "tags": "ads french", + "lang": "ar br ff fr kab lb oc son", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/16.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "GRC-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇬🇷gr 🇨🇾cy: Greek AdBlock Filter", + "tags": "ads greek", + "lang": "el", + "contentURL": "https://www.void.gr/kargig/void-gr-filters.txt", + "supportURL": "https://github.com/kargig/greek-adblockplus-filter" + }, + "HRV-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇭🇷hr 🇷🇸rs: Dandelion Sprout's Serbo-Croatian filters", + "tags": "ads croatian serbian bosnian", + "lang": "bs hr sr", + "contentURL": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/SerboCroatianList.txt", + "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/SerboCroatianList.txt" + ], + "supportURL": "https://github.com/DandelionSprout/adfilt#readme" + }, + "HUN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇭🇺hu: hufilter", + "tags": "ads hungarian", + "lang": "hu", + "contentURL": "https://cdn.jsdelivr.net/gh/hufilter/hufilter@gh-pages/hufilter-ublock.txt", + "supportURL": "https://github.com/hufilter/hufilter" + }, + "IDN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇩id 🇲🇾my: ABPindo", + "tags": "ads indonesian malay", + "lang": "id ms", + "contentURL": "https://raw.githubusercontent.com/ABPindo/indonesianadblockrules/master/subscriptions/abpindo.txt", + "supportURL": "https://github.com/ABPindo/indonesianadblockrules" + }, + "IND-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇳in 🇱🇰lk 🇳🇵np: IndianList", + "tags": "ads assamese bengali gujarati hindi kannada malayalam marathi nepali punjabi sinhala tamil telugu", + "lang": "as bn gu hi kn ml mr ne pa sat si ta te", + "contentURL": "https://easylist-downloads.adblockplus.org/indianlist.txt", + "supportURL": "https://github.com/mediumkreation/IndianList" + }, + "IRN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇷ir: PersianBlocker", + "tags": "ads af ir persian pashto tajik tj", + "lang": "fa ps tg", + "contentURL": [ + "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt", + "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" + ], + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/MasterKia/PersianBlocker@main/PersianBlocker.txt", + "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" + ], + "supportURL": "https://github.com/MasterKia/PersianBlocker" + }, + "ISL-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇸is: Icelandic ABP List", + "tags": "ads icelandic", + "lang": "is", + "contentURL": "https://raw.githubusercontent.com/brave/adblock-lists/master/custom/is.txt", + "supportURL": "https://github.com/brave/adblock-lists/issues" + }, + "ISR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇱il: EasyList Hebrew", + "tags": "ads hebrew", + "lang": "he", + "contentURL": "https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt", + "supportURL": "https://github.com/easylist/EasyListHebrew" + }, + "ITA-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇮🇹it: EasyList Italy", + "tags": "ads italian", + "lang": "fur it lij sc", + "contentURL": "https://easylist-downloads.adblockplus.org/easylistitaly.txt", + "supportURL": "https://forums.lanik.us/viewforum.php?f=96" + }, + "JPN-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇯🇵jp: AdGuard Japanese", + "tags": "ads japanese 日本語", + "lang": "ja", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/7.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "KOR-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇰🇷kr: List-KR", + "tags": "ads korean 한국어", + "lang": "ko", + "contentURL": "https://cdn.jsdelivr.net/gh/List-KR/List-KR@latest/filter-uBlockOrigin.txt", + "supportURL": "https://github.com/List-KR/List-KR#readme" + }, + "LTU-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇱🇹lt: EasyList Lithuania", + "tags": "ads lithuanian", + "lang": "lt", + "contentURL": "https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/EasyList-Lithuania/easylist_lithuania@master/easylistlithuania.txt", + "https://cdn.statically.io/gh/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt" + ], + "supportURL": "https://github.com/EasyList-Lithuania/easylist_lithuania" + }, + "LVA-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇱🇻lv: Latvian List", + "tags": "ads latvian", + "lang": "lv", + "contentURL": "https://raw.githubusercontent.com/Latvian-List/adblock-latvian/master/lists/latvian-list.txt", + "supportURL": "https://github.com/Latvian-List/adblock-latvian" + }, + "MKD-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇲🇰mk: Macedonian adBlock Filters", + "tags": "ads macedonian", + "lang": "mk", + "contentURL": "https://raw.githubusercontent.com/DeepSpaceHarbor/Macedonian-adBlock-Filters/master/Filters", + "supportURL": "https://github.com/DeepSpaceHarbor/Macedonian-adBlock-Filters" + }, + "NLD-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇳🇱nl 🇧🇪be: AdGuard Dutch", + "tags": "ads afrikaans be belgië frisian dutch flemish nederlands netherlands nl sr suriname za", + "lang": "af fy nl", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/8.txt", + "cdnURLs": null, + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "NOR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇳🇴no 🇩🇰dk 🇮🇸is: Dandelion Sprouts nordiske filtre", + "tags": "ads norwegian danish icelandic", + "lang": "nb nn no da is", + "contentURL": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt", + "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/NorwegianList.txt", + "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/NorwegianList.txt" + ], + "supportURL": "https://github.com/DandelionSprout/adfilt" + }, + "POL-0": { + "content": "filters", + "group": "regions", + "parent": "🇵🇱pl: Oficjalne Polskie Filtry", + "off": true, + "title": "🇵🇱pl: Oficjalne Polskie Filtry do uBlocka Origin", + "tags": "ads polish polski", + "lang": "szl pl _", + "contentURL": "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt", + "supportURL": "https://github.com/MajkiIT/polish-ads-filter" + }, + "POL-3": { + "content": "filters", + "group": "regions", + "parent": "🇵🇱pl: Oficjalne Polskie Filtry", + "off": true, + "title": "🇵🇱pl: CERT.PL's Warning List", + "tags": "malware polish polski", + "lang": "szl pl", + "contentURL": "https://hole.cert.pl/domains/v2/domains_ublock.txt", + "supportURL": "https://cert.pl/lista-ostrzezen/" + }, + "ROU-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇷🇴ro 🇲🇩md: Romanian Ad (ROad) Block List Light", + "tags": "ads romanian română moldavian moldovenească молдовеняскэ", + "lang": "ro", + "contentURL": [ + "https://raw.githubusercontent.com/tcptomato/ROad-Block/master/road-block-filters-light.txt" + ], + "supportURL": "https://github.com/tcptomato/ROad-Block" + }, + "RUS-0": { + "content": "filters", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "off": true, + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek uk", + "lang": "be kk tt ru uz", + "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt", + "https://cdn.statically.io/gh/dimisa-RUAdList/RUAdListCDN/main/lists/ruadlist.ubo.min.txt", + "https://raw.githubusercontent.com/dimisa-RUAdList/RUAdListCDN/main/lists/ruadlist.ubo.min.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=102", + "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" + }, + "RUS-1": { + "content": "filters", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "off": true, + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList: Counters", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek be kk tt ru uk uz", + "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/easylist/ruadlist@master/cntblock.txt", + "https://cdn.statically.io/gh/easylist/ruadlist/master/cntblock.txt", + "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=102", + "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" + }, + "spa-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇪🇸es 🇦🇷ar 🇲🇽mx 🇨🇴co: EasyList Spanish", + "tags": "ads aragonese basque catalan spanish español galician guarani", + "lang": "an ast ca cak es eu gl gn trs quz", + "contentURL": "https://easylist-downloads.adblockplus.org/easylistspanish.txt", + "supportURL": "https://forums.lanik.us/viewforum.php?f=103" + }, + "spa-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇪🇸es 🇦🇷ar 🇧🇷br 🇵🇹pt: AdGuard Spanish/Portuguese", + "tags": "ads aragonese basque catalan spanish español galician guarani portuguese português", + "lang": "an ast ca cak es eu gl gn trs pt quz", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/9.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "SVN-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇸🇮si: Slovenian List", + "tags": "ads slovenian slovenski", + "lang": "sl", + "contentURL": "https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt", + "supportURL": "https://github.com/betterwebleon/slovenian-list" + }, + "SWE-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇸🇪se: Frellwit's Swedish Filter", + "tags": "ads swedish svenska", + "lang": "sv", + "contentURL": "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt", + "cdnURLs": [ + "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/swefilter/swefilter.min.txt", + "https://cdn.jsdelivr.net/gh/lassekongo83/Frellwits-filter-lists@swefilter/swefilter.min.txt" + ], + "supportURL": "https://github.com/lassekongo83/Frellwits-filter-lists" + }, + "THA-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇹🇭th: EasyList Thailand", + "tags": "ads thai ไทย", + "lang": "th", + "contentURL": "https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/easylist-thailand.txt", + "supportURL": "https://github.com/easylist-thailand/easylist-thailand" + }, + "TUR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇹🇷tr: AdGuard Turkish", + "tags": "ads turkish türkçe", + "lang": "tr", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/13.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "UKR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇺🇦ua: AdGuard Ukrainian", + "tags": "ads ukraine україна", + "lang": "uk", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/23.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "VIE-1": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇻🇳vn: ABPVN List", + "tags": "ads vietnamese việt", + "lang": "vi", + "contentURL": "https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn_ublock.txt", + "supportURL": "https://abpvn.com/" + } +} diff -Nru ublock-origin-1.46.0+dfsg/assets/assets.json ublock-origin-1.67.0+dfsg/assets/assets.json --- ublock-origin-1.46.0+dfsg/assets/assets.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/assets/assets.json 2025-10-25 19:32:51.000000000 +0000 @@ -9,7 +9,6 @@ "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/ublock/assets.json", "https://ublockorigin.pages.dev/ublock/assets.json", - "https://gitcdn.link/cdn/gorhill/uBlock/master/assets/assets.json", "https://cdn.jsdelivr.net/gh/gorhill/uBlock@master/assets/assets.json", "https://cdn.statically.io/gh/gorhill/uBlock/master/assets/assets.json" ] @@ -19,7 +18,6 @@ "updateAfter": 19, "contentURL": [ "https://publicsuffix.org/list/public_suffix_list.dat", - "https://gitcdn.link/cdn/publicsuffix/list/master/public_suffix_list.dat", "assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat" ] }, @@ -33,7 +31,6 @@ "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/filters/badlists.txt", "https://ublockorigin.pages.dev/filters/badlists.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt", "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badlists.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt" ] @@ -41,106 +38,132 @@ "ublock-filters": { "content": "filters", "group": "default", - "title": "uBlock filters", + "parent": "uBlock filters", + "title": "uBlock filters – Ads", + "tags": "ads", "contentURL": [ "https://ublockorigin.github.io/uAssets/filters/filters.txt", + "assets/ublock/filters.min.txt", "assets/ublock/filters.txt" ], "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/filters.txt", - "https://ublockorigin.pages.dev/filters/filters.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/filters.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/filters.min.txt", + "https://ublockorigin.pages.dev/filters/filters.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, "ublock-badware": { "content": "filters", "group": "default", + "parent": "uBlock filters", "title": "uBlock filters – Badware risks", + "tags": "malware security", "contentURL": [ "https://ublockorigin.github.io/uAssets/filters/badware.txt", + "assets/ublock/badware.min.txt", "assets/ublock/badware.txt" ], "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/badware.txt", - "https://ublockorigin.pages.dev/filters/badware.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/badware.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/badware.min.txt", + "https://ublockorigin.pages.dev/filters/badware.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets", "instructionURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks" }, "ublock-privacy": { "content": "filters", - "updateAfter": 13, "group": "default", + "parent": "uBlock filters", "title": "uBlock filters – Privacy", + "tags": "privacy", "contentURL": [ "https://ublockorigin.github.io/uAssets/filters/privacy.txt", + "assets/ublock/privacy.min.txt", "assets/ublock/privacy.txt" ], "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/privacy.txt", - "https://ublockorigin.pages.dev/filters/privacy.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/privacy.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.txt" - ], - "supportURL": "https://github.com/uBlockOrigin/uAssets" - }, - "ublock-abuse": { - "content": "filters", - "updateAfter": 13, - "group": "default", - "title": "uBlock filters – Resource abuse", - "contentURL": [ - "https://ublockorigin.github.io/uAssets/filters/resource-abuse.txt", - "assets/ublock/resource-abuse.txt" - ], - "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/resource-abuse.txt", - "https://ublockorigin.pages.dev/filters/resource-abuse.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/resource-abuse.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/resource-abuse.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/resource-abuse.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/privacy.min.txt", + "https://ublockorigin.pages.dev/filters/privacy.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, "ublock-unbreak": { "content": "filters", "group": "default", + "parent": "uBlock filters", "title": "uBlock filters – Unbreak", "contentURL": [ "https://ublockorigin.github.io/uAssets/filters/unbreak.txt", + "assets/ublock/unbreak.min.txt", "assets/ublock/unbreak.txt" ], "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.txt", - "https://ublockorigin.pages.dev/filters/unbreak.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/unbreak.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.min.txt", + "https://ublockorigin.pages.dev/filters/unbreak.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, "ublock-quick-fixes": { "content": "filters", - "updateAfter": 1, "group": "default", + "parent": "uBlock filters", "title": "uBlock filters – Quick fixes", "contentURL": [ "https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt", + "assets/ublock/quick-fixes.min.txt", "assets/ublock/quick-fixes.txt" ], "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.txt", - "https://ublockorigin.pages.dev/filters/quick-fixes.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt", + "https://ublockorigin.pages.dev/filters/quick-fixes.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "ublock-experimental": { + "content": "filters", + "group": "default", + "off": true, + "title": "uBlock filters – Experimental", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/experimental.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/experimental.min.txt", + "https://ublockorigin.pages.dev/filters/experimental.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/experimental.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/experimental.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, @@ -148,66 +171,61 @@ "content": "filters", "group": "ads", "off": true, - "title": "AdGuard Base", + "title": "AdGuard – Ads", + "tags": "ads", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "adguard-mobile": { "content": "filters", "group": "ads", "off": true, - "title": "AdGuard Mobile Ads", + "title": "AdGuard – Mobile Ads", + "tags": "ads mobile", "ua": "mobile", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/11.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "easylist": { "content": "filters", "group": "ads", "title": "EasyList", + "tags": "ads", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt", - "assets/thirdparties/easylist/easylist.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt" + "assets/thirdparties/easylist/easylist.txt" ], "cdnURLs": [ - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt", "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt", - "https://easylist.to/easylist/easylist.txt" + "https://ublockorigin.pages.dev/thirdparties/easylist.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://easylist.to/" }, - "adguard-spyware": { - "content": "filters", - "group": "privacy", - "off": true, - "title": "AdGuard Tracking Protection", - "contentURL": "https://filters.adtidy.org/extension/ublock/filters/3.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" - }, "adguard-spyware-url": { "content": "filters", "group": "privacy", "off": true, "title": "AdGuard URL Tracking Protection", + "tags": "privacy", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "block-lan": { "content": "filters", "group": "privacy", "off": true, "title": "Block Outsider Intrusion into LAN", + "tags": "privacy security", "contentURL": "https://ublockorigin.github.io/uAssets/filters/lan-block.txt", "cdnURLs": [ "https://ublockorigin.github.io/uAssetsCDN/filters/lan-block.txt", "https://ublockorigin.pages.dev/filters/lan-block.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt", "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/lan-block.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt" ], @@ -217,16 +235,20 @@ "content": "filters", "group": "privacy", "title": "EasyPrivacy", + "tags": "privacy", + "preferred": true, "contentURL": [ "https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt", - "assets/thirdparties/easylist/easyprivacy.txt", - "assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt" + "assets/thirdparties/easylist/easyprivacy.txt" ], "cdnURLs": [ - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt", "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easyprivacy.txt", "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt", - "https://easylist.to/easylist/easyprivacy.txt" + "https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://easylist.to/" }, @@ -235,13 +257,13 @@ "group": "malware", "title": "Online Malicious URL Blocklist", "contentURL": [ - "https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-online.txt", + "https://malware-filter.gitlab.io/urlhaus-filter/urlhaus-filter-ag-online.txt", "assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt" ], "cdnURLs": [ - "https://curbengh.github.io/malware-filter/urlhaus-filter-online.txt", - "https://malware-filter.gitlab.io/urlhaus-filter/urlhaus-filter-online.txt", - "https://malware-filter.pages.dev/urlhaus-filter-online.txt" + "https://curbengh.github.io/malware-filter/urlhaus-filter-ag-online.txt", + "https://malware-filter.gitlab.io/urlhaus-filter/urlhaus-filter-ag-online.txt", + "https://malware-filter.pages.dev/urlhaus-filter-ag-online.txt" ], "supportURL": "https://gitlab.com/malware-filter/urlhaus-filter#malicious-url-blocklist" }, @@ -250,7 +272,7 @@ "group": "malware", "off": true, "title": "Phishing URL Blocklist", - "contentURL": "https://malware-filter.gitlab.io/malware-filter/phishing-filter.txt", + "contentURL": "https://malware-filter.gitlab.io/phishing-filter/phishing-filter.txt", "cdnURLs": [ "https://curbengh.github.io/phishing-filter/phishing-filter.txt", "https://malware-filter.gitlab.io/phishing-filter/phishing-filter.txt", @@ -258,93 +280,255 @@ ], "supportURL": "https://gitlab.com/malware-filter/phishing-filter#phishing-url-blocklist" }, - "curben-pup": { + "adguard-cookies": { "content": "filters", - "group": "malware", + "group": "annoyances", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "AdGuard – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/18.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "ublock-cookies-adguard": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "AdGuard/uBO – Cookie Notices", + "off": true, + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" + }, + "fanboy-cookiemonster": { + "content": "filters", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", "off": true, - "title": "PUP Domains Blocklist", - "contentURL": "https://malware-filter.gitlab.io/malware-filter/pup-filter.txt", + "title": "EasyList – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" + ], "cdnURLs": [ - "https://curbengh.github.io/pup-filter/pup-filter.txt", - "https://malware-filter.gitlab.io/pup-filter/pup-filter.txt", - "https://pup-filter.pages.dev/pup-filter.txt" + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-cookies.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-cookies.txt", + "https://secure.fanboy.co.nz/fanboy-cookiemonster_ubo.txt" ], - "supportURL": "https://gitlab.com/malware-filter/pup-filter#pup-domains-blocklist" + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" }, - "adguard-annoyance": { + "ublock-cookies-easylist": { "content": "filters", - "group": "social", + "group": "annoyances", + "group2": "cookies", + "parent": "EasyList/uBO – Cookie Notices", "off": true, - "title": "AdGuard Annoyances", - "contentURL": "https://filters.adtidy.org/extension/ublock/filters/14.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "title": "uBlock filters – Cookie Notices", + "tags": "annoyances cookies", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances-cookies.txt", + "https://ublockorigin.pages.dev/filters/annoyances-cookies.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances-cookies.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances-cookies.txt" + ], + "supportURL": "https://github.com/uBlockOrigin/uAssets" }, "adguard-social": { "content": "filters", - "group": "social", + "group": "annoyances", + "group2": "social", + "parent": null, "off": true, - "title": "AdGuard Social Media", + "title": "AdGuard – Social Widgets", + "tags": "annoyances social", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "fanboy-social": { + "content": "filters", + "group": "annoyances", + "group2": "social", + "parent": null, + "off": true, + "title": "EasyList – Social Widgets", + "tags": "annoyances social", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-social.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-social.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-social.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-social.txt", + "https://secure.fanboy.co.nz/fanboy-social_ubo.txt" + ], + "supportURL": "https://easylist.to/" }, "fanboy-thirdparty_social": { "content": "filters", - "group": "social", + "group": "annoyances", + "group2": "social", "off": true, - "title": "Anti-Facebook", + "title": "Fanboy – Anti-Facebook", + "tags": "privacy", "contentURL": "https://secure.fanboy.co.nz/fanboy-antifacebook.txt", "supportURL": "https://github.com/ryanbr/fanboy-adblock/issues" }, - "fanboy-annoyance": { + "adguard-popup-overlays": { "content": "filters", - "group": "social", + "group": "annoyances", + "parent": "AdGuard – Annoyances", "off": true, - "title": "Fanboy’s Annoyance", - "contentURL": "https://secure.fanboy.co.nz/fanboy-annoyance.txt", - "supportURL": "https://easylist.to/" + "title": "AdGuard – Popup Overlays", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/19.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, - "fanboy-cookiemonster": { + "adguard-mobile-app-banners": { "content": "filters", - "group": "social", + "group": "annoyances", + "parent": "AdGuard – Annoyances", "off": true, - "title": "EasyList Cookie", - "contentURL": "https://secure.fanboy.co.nz/fanboy-cookiemonster.txt", - "supportURL": "https://github.com/easylist/easylist/issues" + "title": "AdGuard – Mobile App Banners", + "tags": "annoyances mobile", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/20.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, - "fanboy-social": { + "adguard-other-annoyances": { "content": "filters", - "group": "social", + "group": "annoyances", + "parent": "AdGuard – Annoyances", "off": true, - "title": "Fanboy’s Social", + "title": "AdGuard – Other Annoyances", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/21.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "adguard-widgets": { + "content": "filters", + "group": "annoyances", + "parent": "AdGuard – Annoyances", + "off": true, + "title": "AdGuard – Widgets", + "tags": "annoyances", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/22.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "easylist-annoyances": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Other Annoyances", + "tags": "annoyances", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-annoyances.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-annoyances.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-annoyances.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-annoyances.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "easylist-chat": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Chat Widgets", + "tags": "annoyances", + "preferred": true, + "contentURL": "https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt", + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-chat.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-chat.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-chat.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-chat.txt" + ], + "supportURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + "easylist-newsletters": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Newsletter Notices", + "tags": "annoyances", + "preferred": true, + "contentURL": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-newsletters.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-newsletters.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-newsletters.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-newsletters.txt" + ], + "supportURL": "https://easylist.to/" + }, + "easylist-notifications": { + "content": "filters", + "group": "annoyances", + "parent": "EasyList – Annoyances", + "off": true, + "title": "EasyList – Notifications", + "tags": "annoyances", + "preferred": true, "contentURL": [ - "https://easylist.to/easylist/fanboy-social.txt", - "https://secure.fanboy.co.nz/fanboy-social.txt" + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-notifications.txt" + ], + "cdnURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/thirdparties/easylist-notifications.txt", + "https://ublockorigin.pages.dev/thirdparties/easylist-notifications.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/thirdparties/easylist-notifications.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist-notifications.txt" ], "supportURL": "https://easylist.to/" }, "ublock-annoyances": { "content": "filters", - "group": "social", - "title": "uBlock filters – Annoyances", + "group": "annoyances", "off": true, + "title": "uBlock filters – Annoyances", + "tags": "annoyances", "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances.txt", "cdnURLs": [ - "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances.txt", - "https://ublockorigin.pages.dev/filters/annoyances.txt", - "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/annoyances.txt", - "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.txt", - "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.txt" + "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances.min.txt", + "https://ublockorigin.pages.dev/filters/annoyances.min.txt", + "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.min.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.min.txt" + ], + "patchURLs": [ + "https://ublockorigin.github.io/uAssetsCDN/filters/", + "https://ublockorigin.pages.dev/filters/" ], "supportURL": "https://github.com/uBlockOrigin/uAssets" }, "dpollock-0": { "content": "filters", "group": "multipurpose", - "updateAfter": 11, + "updateAfter": 13, "off": true, "title": "Dan Pollock’s hosts file", + "tags": "ads privacy security", "contentURL": "https://someonewhocares.org/hosts/hosts", "supportURL": "https://someonewhocares.org/hosts/" }, @@ -353,6 +537,8 @@ "group": "multipurpose", "updateAfter": 13, "title": "Peter Lowe’s Ad and tracking server list", + "tags": "ads privacy security", + "preferred": true, "contentURL": [ "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext", "assets/thirdparties/pgl.yoyo.org/as/serverlist.txt", @@ -364,7 +550,8 @@ "content": "filters", "group": "regions", "off": true, - "title": "ALB: Adblock List for Albania", + "title": "🇦🇱al 🇽🇰xk: Adblock List for Albania", + "tags": "ads albania shqipja", "lang": "sq", "contentURL": "https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt", "supportURL": "https://github.com/AnXh3L0/blocklist" @@ -373,8 +560,9 @@ "content": "filters", "group": "regions", "off": true, - "title": "ara: Liste AR", - "lang": "ar", + "title": "🇪🇬eg 🇸🇦sa 🇲🇦ma 🇩🇿dz: Liste AR", + "tags": "ads arabic اَلْعَرَبِيَّةُ‎", + "lang": "ar kab", "contentURL": "https://easylist-downloads.adblockplus.org/Liste_AR.txt", "supportURL": "https://forums.lanik.us/viewforum.php?f=98" }, @@ -382,7 +570,8 @@ "content": "filters", "group": "regions", "off": true, - "title": "BGR: Bulgarian Adblock list", + "title": "🇧🇬bg: Bulgarian Adblock list", + "tags": "ads bulgarian България macedonian Македонија", "lang": "bg mk", "contentURL": "https://stanev.org/abp/adblock_bg.txt", "supportURL": "https://stanev.org/abp/" @@ -391,7 +580,8 @@ "content": "filters", "group": "regions", "off": true, - "title": "CHN: AdGuard Chinese (中文)", + "title": "🇨🇳cn 🇹🇼tw: AdGuard Chinese (中文)", + "tags": "ads chinese 中文", "lang": "ug zh", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/224.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" @@ -400,7 +590,8 @@ "content": "filters", "group": "regions", "off": true, - "title": "CZE, SVK: EasyList Czech and Slovak", + "title": "🇨🇿cz 🇸🇰sk: EasyList Czech and Slovak", + "tags": "ads czech česká slovak slovenská", "lang": "cs sk", "contentURL": "https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt", "supportURL": "https://github.com/tomasko126/easylistczechandslovak" @@ -409,7 +600,8 @@ "content": "filters", "group": "regions", "off": true, - "title": "DEU: EasyList Germany", + "title": "🇩🇪de 🇨🇭ch 🇦🇹at: EasyList Germany", + "tags": "ads german deutschland luxembourgish lëtzebuerg romansh", "lang": "de dsb hsb lb rm", "contentURL": [ "https://easylist.to/easylistgermany/easylistgermany.txt", @@ -421,26 +613,29 @@ "content": "filters", "group": "regions", "off": true, - "title": "EST: Eesti saitidele kohandatud filter", + "title": "🇪🇪ee: Eesti saitidele kohandatud filter", + "tags": "ads estonian", "lang": "et", - "contentURL": "https://adblock.ee/list.php", - "supportURL": "https://adblock.ee/" + "contentURL": "https://adblock.ee/list.txt", + "supportURL": "https://adblock.ee" }, "FIN-0": { "content": "filters", "group": "regions", "off": true, - "title": "FIN: Adblock List for Finland", + "title": "🇫🇮fi: Adblock List for Finland", + "tags": "ads finnish", "lang": "fi", - "contentURL": "https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/master/Finland_adb.txt", + "contentURL": "https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/gh-pages/Finland_adb.txt", "supportURL": "https://github.com/finnish-easylist-addition/finnish-easylist-addition" }, "FRA-0": { "content": "filters", "group": "regions", "off": true, - "title": "FRA: AdGuard Français", - "lang": "ar br ff fr lb oc son", + "title": "🇫🇷fr 🇨🇦ca: AdGuard Français", + "tags": "ads french", + "lang": "ar br ff fr kab lb oc son", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/16.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, @@ -448,25 +643,42 @@ "content": "filters", "group": "regions", "off": true, - "title": "GRC: Greek AdBlock Filter", + "title": "🇬🇷gr 🇨🇾cy: Greek AdBlock Filter", + "tags": "ads greek", "lang": "el", "contentURL": "https://www.void.gr/kargig/void-gr-filters.txt", "supportURL": "https://github.com/kargig/greek-adblockplus-filter" }, + "HRV-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇭🇷hr 🇷🇸rs: Dandelion Sprout's Serbo-Croatian filters", + "tags": "ads croatian serbian bosnian", + "lang": "bs hr sr", + "contentURL": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/SerboCroatianList.txt", + "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/SerboCroatianList.txt" + ], + "supportURL": "https://github.com/DandelionSprout/adfilt#readme" + }, "HUN-0": { "content": "filters", "group": "regions", "off": true, - "title": "HUN: hufilter", + "title": "🇭🇺hu: hufilter", + "tags": "ads hungarian", "lang": "hu", - "contentURL": "https://raw.githubusercontent.com/hufilter/hufilter/master/hufilter-ublock.txt", + "contentURL": "https://cdn.jsdelivr.net/gh/hufilter/hufilter@gh-pages/hufilter-ublock.txt", "supportURL": "https://github.com/hufilter/hufilter" }, "IDN-0": { "content": "filters", "group": "regions", "off": true, - "title": "IDN, MYS: ABPindo", + "title": "🇮🇩id 🇲🇾my: ABPindo", + "tags": "ads indonesian malay", "lang": "id ms", "contentURL": "https://raw.githubusercontent.com/ABPindo/indonesianadblockrules/master/subscriptions/abpindo.txt", "supportURL": "https://github.com/ABPindo/indonesianadblockrules" @@ -475,8 +687,9 @@ "content": "filters", "group": "regions", "off": true, - "title": "IND, LKA, NPL: IndianList", - "lang": "as bn gu hi kn ml mr ne pa si ta te", + "title": "🇮🇳in 🇱🇰lk 🇳🇵np: IndianList", + "tags": "ads assamese bengali gujarati hindi kannada malayalam marathi nepali punjabi sinhala tamil telugu", + "lang": "as bn gu hi kn ml mr ne pa sat si ta te", "contentURL": "https://easylist-downloads.adblockplus.org/indianlist.txt", "supportURL": "https://github.com/mediumkreation/IndianList" }, @@ -484,11 +697,15 @@ "content": "filters", "group": "regions", "off": true, - "title": "IRN: PersianBlocker", - "lang": "fa", + "title": "🇮🇷ir: PersianBlocker", + "tags": "ads af ir persian pashto tajik tj", + "lang": "fa ps tg", "contentURL": [ "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt", - "https://gitcdn.link/cdn/MasterKia/PersianBlocker/main/PersianBlocker.txt", + "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" + ], + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/MasterKia/PersianBlocker@main/PersianBlocker.txt", "https://cdn.statically.io/gh/MasterKia/PersianBlocker/main/PersianBlocker.txt" ], "supportURL": "https://github.com/MasterKia/PersianBlocker" @@ -497,16 +714,18 @@ "content": "filters", "group": "regions", "off": true, - "title": "ISL: Icelandic ABP List", + "title": "🇮🇸is: Icelandic ABP List", + "tags": "ads icelandic", "lang": "is", - "contentURL": "https://adblock.gardar.net/is.abp.txt", - "supportURL": "https://adblock.gardar.net/" + "contentURL": "https://raw.githubusercontent.com/brave/adblock-lists/master/custom/is.txt", + "supportURL": "https://github.com/brave/adblock-lists/issues" }, "ISR-0": { "content": "filters", "group": "regions", "off": true, - "title": "ISR: EasyList Hebrew", + "title": "🇮🇱il: EasyList Hebrew", + "tags": "ads hebrew", "lang": "he", "contentURL": "https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt", "supportURL": "https://github.com/easylist/EasyListHebrew" @@ -515,8 +734,9 @@ "content": "filters", "group": "regions", "off": true, - "title": "ITA: EasyList Italy", - "lang": "it lij", + "title": "🇮🇹it: EasyList Italy", + "tags": "ads italian", + "lang": "fur it lij sc", "contentURL": "https://easylist-downloads.adblockplus.org/easylistitaly.txt", "supportURL": "https://forums.lanik.us/viewforum.php?f=96" }, @@ -524,35 +744,31 @@ "content": "filters", "group": "regions", "off": true, - "title": "JPN: AdGuard Japanese", + "title": "🇯🇵jp: AdGuard Japanese", + "tags": "ads japanese 日本語", "lang": "ja", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/7.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "KOR-1": { "content": "filters", "group": "regions", "off": true, - "title": "KOR: List-KR", + "title": "🇰🇷kr: List-KR", + "tags": "ads korean 한국어", "lang": "ko", - "contentURL": "https://raw.githubusercontent.com/List-KR/List-KR/master/filter-uBO.txt", - "cdnURLs": [ - "https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filter-uBO.txt", - "https://cdn.statically.io/gh/List-KR/List-KR/master/filter-uBO.txt", - "https://gitcdn.link/cdn/List-KR/List-KR/master/filter-uBO.txt" - ], + "contentURL": "https://cdn.jsdelivr.net/gh/List-KR/List-KR@latest/filter-uBlockOrigin.txt", "supportURL": "https://github.com/List-KR/List-KR#readme" }, "LTU-0": { "content": "filters", "group": "regions", "off": true, - "title": "LTU: EasyList Lithuania", + "title": "🇱🇹lt: EasyList Lithuania", + "tags": "ads lithuanian", "lang": "lt", "contentURL": "https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt", "cdnURLs": [ - "https://gitcdn.link/cdn/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt", "https://cdn.jsdelivr.net/gh/EasyList-Lithuania/easylist_lithuania@master/easylistlithuania.txt", "https://cdn.statically.io/gh/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt" ], @@ -562,36 +778,42 @@ "content": "filters", "group": "regions", "off": true, - "title": "LVA: Latvian List", + "title": "🇱🇻lv: Latvian List", + "tags": "ads latvian", "lang": "lv", "contentURL": "https://raw.githubusercontent.com/Latvian-List/adblock-latvian/master/lists/latvian-list.txt", "supportURL": "https://github.com/Latvian-List/adblock-latvian" }, + "MKD-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇲🇰mk: Macedonian adBlock Filters", + "tags": "ads macedonian", + "lang": "mk", + "contentURL": "https://raw.githubusercontent.com/DeepSpaceHarbor/Macedonian-adBlock-Filters/master/Filters", + "supportURL": "https://github.com/DeepSpaceHarbor/Macedonian-adBlock-Filters" + }, "NLD-0": { "content": "filters", "group": "regions", "off": true, - "title": "NLD: EasyDutch", + "title": "🇳🇱nl 🇧🇪be: AdGuard Dutch", + "tags": "ads afrikaans be belgië frisian dutch flemish nederlands netherlands nl sr suriname za", "lang": "af fy nl", - "contentURL": "https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch.txt", - "cdnURLs": [ - "https://cdn.statically.io/gh/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch.txt", - "https://cdn.jsdelivr.net/gh/EasyDutch-uBO/EasyDutch@gh-pages/EasyDutch.txt", - "https://cdn.statically.io/gl/BPower0036/EasyDutch/raw/gh-pages/EasyDutch.txt" - ], - "supportURL": "https://github.com/EasyDutch-uBO/EasyDutch/" + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/8.txt", + "cdnURLs": null, + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "NOR-0": { "content": "filters", "group": "regions", "off": true, - "title": "NOR, DNK, ISL: Dandelion Sprouts nordiske filtre", + "title": "🇳🇴no 🇩🇰dk 🇮🇸is: Dandelion Sprouts nordiske filtre", + "tags": "ads norwegian danish icelandic", "lang": "nb nn no da is", "contentURL": [ - "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt" - ], - "cdnURLs": [ - "https://gitcdn.link/cdn/DandelionSprout/adfilt/master/NorwegianList.txt", + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt", "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/NorwegianList.txt", "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/NorwegianList.txt" ], @@ -600,30 +822,33 @@ "POL-0": { "content": "filters", "group": "regions", + "parent": "🇵🇱pl: Oficjalne Polskie Filtry", "off": true, - "title": "POL: Oficjalne Polskie Filtry do AdBlocka, uBlocka Origin i AdGuarda", - "lang": "szl pl", + "title": "🇵🇱pl: Oficjalne Polskie Filtry do uBlocka Origin", + "tags": "ads polish polski", + "lang": "szl pl _", "contentURL": "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt", - "supportURL": "https://github.com/MajkiIT/polish-ads-filter/issues", - "instructionURL": "https://github.com/MajkiIT/polish-ads-filter#polish-filters-for-adblock-ublock-origin--adguard" + "supportURL": "https://github.com/MajkiIT/polish-ads-filter" }, - "POL-2": { + "POL-3": { "content": "filters", "group": "regions", + "parent": "🇵🇱pl: Oficjalne Polskie Filtry", "off": true, - "title": "POL: Oficjalne polskie filtry przeciwko alertom o Adblocku", + "title": "🇵🇱pl: CERT.PL's Warning List", + "tags": "malware polish polski", "lang": "szl pl", - "contentURL": "https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt", - "supportURL": "https://github.com/olegwukr/polish-privacy-filters/issues" + "contentURL": "https://hole.cert.pl/domains/v2/domains_ublock.txt", + "supportURL": "https://cert.pl/lista-ostrzezen/" }, "ROU-1": { "content": "filters", "group": "regions", "off": true, - "title": "ROU: Romanian Ad (ROad) Block List Light", + "title": "🇷🇴ro 🇲🇩md: Romanian Ad (ROad) Block List Light", + "tags": "ads romanian română moldavian moldovenească молдовеняскэ", "lang": "ro", "contentURL": [ - "https://road.adblock.ro/lista.txt", "https://raw.githubusercontent.com/tcptomato/ROad-Block/master/road-block-filters-light.txt" ], "supportURL": "https://github.com/tcptomato/ROad-Block" @@ -631,14 +856,32 @@ "RUS-0": { "content": "filters", "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "off": true, - "title": "RUS: RU AdList", - "lang": "be kk tt ru uk uz", + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek uk", + "lang": "be kk tt ru uz", "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt", "cdnURLs": [ - "https://cdn.jsdelivr.net/gh/easylist/ruadlist@master/RuAdList-uBO.txt", - "https://cdn.statically.io/gh/easylist/ruadlist/master/RuAdList-uBO.txt", - "https://gitcdn.link/cdn/easylist/ruadlist/master/RuAdList-uBO.txt" + "https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt", + "https://cdn.statically.io/gh/dimisa-RUAdList/RUAdListCDN/main/lists/ruadlist.ubo.min.txt", + "https://raw.githubusercontent.com/dimisa-RUAdList/RUAdListCDN/main/lists/ruadlist.ubo.min.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=102", + "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" + }, + "RUS-1": { + "content": "filters", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "off": true, + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList: Counters", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek be kk tt ru uk uz", + "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/easylist/ruadlist@master/cntblock.txt", + "https://cdn.statically.io/gh/easylist/ruadlist/master/cntblock.txt", + "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt" ], "supportURL": "https://forums.lanik.us/viewforum.php?f=102", "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" @@ -647,8 +890,9 @@ "content": "filters", "group": "regions", "off": true, - "title": "spa: EasyList Spanish", - "lang": "an ast ca cak es eu gn gl trs quz", + "title": "🇪🇸es 🇦🇷ar 🇲🇽mx 🇨🇴co: EasyList Spanish", + "tags": "ads aragonese basque catalan spanish español galician guarani", + "lang": "an ast ca cak es eu gl gn trs quz", "contentURL": "https://easylist-downloads.adblockplus.org/easylistspanish.txt", "supportURL": "https://forums.lanik.us/viewforum.php?f=103" }, @@ -656,17 +900,18 @@ "content": "filters", "group": "regions", "off": true, - "title": "spa, por: AdGuard Spanish/Portuguese", + "title": "🇪🇸es 🇦🇷ar 🇧🇷br 🇵🇹pt: AdGuard Spanish/Portuguese", + "tags": "ads aragonese basque catalan spanish español galician guarani portuguese português", "lang": "an ast ca cak es eu gl gn trs pt quz", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/9.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "SVN-0": { "content": "filters", "group": "regions", "off": true, - "title": "SVN: Slovenian List", + "title": "🇸🇮si: Slovenian List", + "tags": "ads slovenian slovenski", "lang": "sl", "contentURL": "https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt", "supportURL": "https://github.com/betterwebleon/slovenian-list" @@ -675,16 +920,22 @@ "content": "filters", "group": "regions", "off": true, - "title": "SWE: Frellwit's Swedish Filter", + "title": "🇸🇪se: Frellwit's Swedish Filter", + "tags": "ads swedish svenska", "lang": "sv", "contentURL": "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt", + "cdnURLs": [ + "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/swefilter/swefilter.min.txt", + "https://cdn.jsdelivr.net/gh/lassekongo83/Frellwits-filter-lists@swefilter/swefilter.min.txt" + ], "supportURL": "https://github.com/lassekongo83/Frellwits-filter-lists" }, "THA-0": { "content": "filters", "group": "regions", "off": true, - "title": "THA: EasyList Thailand", + "title": "🇹🇭th: EasyList Thailand", + "tags": "ads thai ไทย", "lang": "th", "contentURL": "https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/easylist-thailand.txt", "supportURL": "https://github.com/easylist-thailand/easylist-thailand" @@ -693,17 +944,28 @@ "content": "filters", "group": "regions", "off": true, - "title": "TUR: AdGuard Turkish", + "title": "🇹🇷tr: AdGuard Turkish", + "tags": "ads turkish türkçe", "lang": "tr", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/13.txt", - "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + "UKR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇺🇦ua: AdGuard Ukrainian", + "tags": "ads ukraine україна", + "lang": "uk", + "contentURL": "https://filters.adtidy.org/extension/ublock/filters/23.txt", + "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" }, "VIE-1": { "content": "filters", "group": "regions", "off": true, - "title": "VIE: ABPVN List", + "title": "🇻🇳vn: ABPVN List", + "tags": "ads vietnamese việt", "lang": "vi", "contentURL": "https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn_ublock.txt", "supportURL": "https://abpvn.com/" diff -Nru ublock-origin-1.46.0+dfsg/assets/resources/scriptlets.js ublock-origin-1.67.0+dfsg/assets/resources/scriptlets.js --- ublock-origin-1.46.0+dfsg/assets/resources/scriptlets.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/assets/resources/scriptlets.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,1847 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -// The lines below are skipped by the resource parser. Purpose is clean -// jshinting. -(function() { -// >>>> start of private namespace -'use strict'; - - - - - -/// abort-current-script.js -/// alias acs.js -/// alias abort-current-inline-script.js -/// alias acis.js -// Issues to mind before changing anything: -// https://github.com/uBlockOrigin/uBlock-issues/issues/2154 -(function() { - const target = '{{1}}'; - if ( target === '' || target === '{{1}}' ) { return; } - const reRegexEscape = /[.*+?^${}()|[\]\\]/g; - const needle = '{{2}}'; - const reNeedle = (( ) => { - if ( needle === '' || needle === '{{2}}' ) { return /^/; } - if ( /^\/.+\/$/.test(needle) ) { - return new RegExp(needle.slice(1,-1)); - } - return new RegExp(needle.replace(reRegexEscape, '\\$&')); - })(); - const context = '{{3}}'; - const reContext = (( ) => { - if ( context === '' || context === '{{3}}' ) { return; } - if ( /^\/.+\/$/.test(context) ) { - return new RegExp(context.slice(1,-1)); - } - return new RegExp(context.replace(reRegexEscape, '\\$&')); - })(); - const thisScript = document.currentScript; - const chain = target.split('.'); - let owner = window; - let prop; - for (;;) { - prop = chain.shift(); - if ( chain.length === 0 ) { break; } - owner = owner[prop]; - if ( owner instanceof Object === false ) { return; } - } - let value; - let desc = Object.getOwnPropertyDescriptor(owner, prop); - if ( - desc instanceof Object === false || - desc.get instanceof Function === false - ) { - value = owner[prop]; - desc = undefined; - } - const magic = String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - const scriptTexts = new WeakMap(); - const getScriptText = elem => { - let text = elem.textContent; - if ( text.trim() !== '' ) { return text; } - if ( scriptTexts.has(elem) ) { return scriptTexts.get(elem); } - const [ , mime, content ] = - /^data:([^,]*),(.+)$/.exec(elem.src.trim()) || - [ '', '', '' ]; - try { - switch ( true ) { - case mime.endsWith(';base64'): - text = self.atob(content); - break; - default: - text = self.decodeURIComponent(content); - break; - } - } catch(ex) { - } - scriptTexts.set(elem, text); - return text; - }; - const validate = ( ) => { - const e = document.currentScript; - if ( e instanceof HTMLScriptElement === false ) { return; } - if ( e === thisScript ) { return; } - if ( reContext !== undefined && reContext.test(e.src) === false ) { - return; - } - if ( reNeedle.test(getScriptText(e)) === false ) { return; } - throw new ReferenceError(magic); - }; - Object.defineProperty(owner, prop, { - get: function() { - validate(); - return desc instanceof Object - ? desc.get.call(owner) - : value; - }, - set: function(a) { - validate(); - if ( desc instanceof Object ) { - desc.set.call(owner, a); - } else { - value = a; - } - } - }); - const oe = window.onerror; - window.onerror = function(msg) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe.apply(this, arguments); - } - }.bind(); -})(); - - -/// abort-on-property-read.js -/// alias aopr.js -(function() { - const magic = String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - const abort = function() { - throw new ReferenceError(magic); - }; - const makeProxy = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - const desc = Object.getOwnPropertyDescriptor(owner, chain); - if ( !desc || desc.get !== abort ) { - Object.defineProperty(owner, chain, { - get: abort, - set: function(){} - }); - } - return; - } - const prop = chain.slice(0, pos); - let v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v ) { - makeProxy(v, chain); - return; - } - const desc = Object.getOwnPropertyDescriptor(owner, prop); - if ( desc && desc.set !== undefined ) { return; } - Object.defineProperty(owner, prop, { - get: function() { return v; }, - set: function(a) { - v = a; - if ( a instanceof Object ) { - makeProxy(a, chain); - } - } - }); - }; - const owner = window; - let chain = '{{1}}'; - makeProxy(owner, chain); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -})(); - - -/// abort-on-property-write.js -/// alias aopw.js -(function() { - const magic = String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - let prop = '{{1}}'; - let owner = window; - for (;;) { - const pos = prop.indexOf('.'); - if ( pos === -1 ) { break; } - owner = owner[prop.slice(0, pos)]; - if ( owner instanceof Object === false ) { return; } - prop = prop.slice(pos + 1); - } - delete owner[prop]; - Object.defineProperty(owner, prop, { - set: function() { - throw new ReferenceError(magic); - } - }); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -})(); - - -/// abort-on-stack-trace.js -/// alias aost.js -// Status is currently experimental -(function() { - let chain = '{{1}}'; - let needle = '{{2}}'; - let logLevel = '{{3}}'; - const reRegexEscape = /[.*+?^${}()|[\]\\]/g; - if ( needle === '' || needle === '{{2}}' ) { - needle = '^'; - } else if ( /^\/.+\/$/.test(needle) ) { - needle = needle.slice(1,-1); - } else { - needle = needle.replace(reRegexEscape, '\\$&'); - } - const reNeedle = new RegExp(needle); - const magic = String.fromCharCode(Math.random() * 26 + 97) + - Math.floor( - (0.25 + Math.random() * 0.75) * Number.MAX_SAFE_INTEGER - ).toString(36).slice(-8); - const log = console.log.bind(console); - const ErrorCtor = self.Error; - const mustAbort = function(err) { - let docURL = self.location.href; - const pos = docURL.indexOf('#'); - if ( pos !== -1 ) { - docURL = docURL.slice(0, pos); - } - // Normalize stack trace - const lines = []; - for ( let line of err.stack.split(/[\n\r]+/) ) { - if ( line.includes(magic) ) { continue; } - line = line.trim(); - let match = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if ( match === null ) { continue; } - let url = match[2]; - if ( url.startsWith('(') ) { url = url.slice(1); } - if ( url === docURL ) { - url = 'inlineScript'; - } else if ( url.startsWith('') ) { - url = 'injectedScript'; - } - let fn = match[1] !== undefined - ? match[1].slice(0, -1) - : line.slice(0, match.index).trim(); - if ( fn.startsWith('at') ) { fn = fn.slice(2).trim(); } - let rowcol = match[3]; - lines.push(' ' + `${fn} ${url}${rowcol}:1`.trim()); - } - lines[0] = `stackDepth:${lines.length-1}`; - const stack = lines.join('\t'); - const r = reNeedle.test(stack); - if ( - logLevel === '1' || - logLevel === '2' && r || - logLevel === '3' && !r - ) { - log(stack.replace(/\t/g, '\n')); - } - return r; - }; - const makeProxy = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - let v = owner[chain]; - Object.defineProperty(owner, chain, { - get: function() { - if ( mustAbort(new ErrorCtor(magic)) ) { - throw new ReferenceError(magic); - } - return v; - }, - set: function(a) { - if ( mustAbort(new ErrorCtor(magic)) ) { - throw new ReferenceError(magic); - } - v = a; - }, - }); - return; - } - const prop = chain.slice(0, pos); - let v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v ) { - makeProxy(v, chain); - return; - } - const desc = Object.getOwnPropertyDescriptor(owner, prop); - if ( desc && desc.set !== undefined ) { return; } - Object.defineProperty(owner, prop, { - get: function() { return v; }, - set: function(a) { - v = a; - if ( a instanceof Object ) { - makeProxy(a, chain); - } - } - }); - }; - const owner = window; - makeProxy(owner, chain); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -})(); - - -/// addEventListener-defuser.js -/// alias aeld.js -// https://github.com/uBlockOrigin/uAssets/issues/9123#issuecomment-848255120 -(function() { - let needle1 = '{{1}}'; - if ( needle1 === '' || needle1 === '{{1}}' ) { - needle1 = '.?'; - } else if ( /^\/.+\/$/.test(needle1) ) { - needle1 = needle1.slice(1,-1); - } else { - needle1 = needle1.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needle1 = new RegExp(needle1); - let needle2 = '{{2}}'; - if ( needle2 === '' || needle2 === '{{2}}' ) { - needle2 = '.?'; - } else if ( /^\/.+\/$/.test(needle2) ) { - needle2 = needle2.slice(1,-1); - } else { - needle2 = needle2.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needle2 = new RegExp(needle2); - self.EventTarget.prototype.addEventListener = new Proxy( - self.EventTarget.prototype.addEventListener, - { - apply: function(target, thisArg, args) { - let type, handler; - try { - type = String(args[0]); - handler = String(args[1]); - } catch(ex) { - } - if ( - needle1.test(type) === false || - needle2.test(handler) === false - ) { - return target.apply(thisArg, args); - } - } - } - ); -})(); - - -/// addEventListener-logger.js -/// alias aell.js -// https://github.com/uBlockOrigin/uAssets/issues/9123#issuecomment-848255120 -(function() { - const log = console.log.bind(console); - self.EventTarget.prototype.addEventListener = new Proxy( - self.EventTarget.prototype.addEventListener, - { - apply: function(target, thisArg, args) { - let type, handler; - try { - type = String(args[0]); - handler = String(args[1]); - } catch(ex) { - } - log('uBO: addEventListener("%s", %s)', type, handler); - return target.apply(thisArg, args); - } - } - ); -})(); - - -/// json-prune.js -// -// When no "prune paths" argument is provided, the scriptlet is -// used for logging purpose and the "needle paths" argument is -// used to filter logging output. -// -// https://github.com/uBlockOrigin/uBlock-issues/issues/1545 -// - Add support for "remove everything if needle matches" case -// -(function() { - const rawPrunePaths = '{{1}}'; - const rawNeedlePaths = '{{2}}'; - const prunePaths = rawPrunePaths !== '{{1}}' && rawPrunePaths !== '' - ? rawPrunePaths.split(/ +/) - : []; - let needlePaths; - let log, reLogNeedle; - if ( prunePaths.length !== 0 ) { - needlePaths = prunePaths.length !== 0 && - rawNeedlePaths !== '{{2}}' && rawNeedlePaths !== '' - ? rawNeedlePaths.split(/ +/) - : []; - } else { - log = console.log.bind(console); - let needle; - if ( rawNeedlePaths === '' || rawNeedlePaths === '{{2}}' ) { - needle = '.?'; - } else if ( rawNeedlePaths.charAt(0) === '/' && rawNeedlePaths.slice(-1) === '/' ) { - needle = rawNeedlePaths.slice(1, -1); - } else { - needle = rawNeedlePaths.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - reLogNeedle = new RegExp(needle); - } - const findOwner = function(root, path, prune = false) { - let owner = root; - let chain = path; - for (;;) { - if ( typeof owner !== 'object' || owner === null ) { - return false; - } - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - if ( prune === false ) { - return owner.hasOwnProperty(chain); - } - if ( chain === '*' ) { - for ( const key in owner ) { - if ( owner.hasOwnProperty(key) === false ) { continue; } - delete owner[key]; - } - } else if ( owner.hasOwnProperty(chain) ) { - delete owner[chain]; - } - return true; - } - const prop = chain.slice(0, pos); - if ( - prop === '[]' && Array.isArray(owner) || - prop === '*' && owner instanceof Object - ) { - const next = chain.slice(pos + 1); - let found = false; - for ( const key of Object.keys(owner) ) { - found = findOwner(owner[key], next, prune) || found; - } - return found; - } - if ( owner.hasOwnProperty(prop) === false ) { return false; } - owner = owner[prop]; - chain = chain.slice(pos + 1); - } - }; - const mustProcess = function(root) { - for ( const needlePath of needlePaths ) { - if ( findOwner(root, needlePath) === false ) { - return false; - } - } - return true; - }; - const pruner = function(o) { - if ( log !== undefined ) { - const json = JSON.stringify(o, null, 2); - if ( reLogNeedle.test(json) ) { - log('uBO:', location.hostname, json); - } - return o; - } - if ( mustProcess(o) === false ) { return o; } - for ( const path of prunePaths ) { - findOwner(o, path, true); - } - return o; - }; - JSON.parse = new Proxy(JSON.parse, { - apply: function() { - return pruner(Reflect.apply(...arguments)); - }, - }); - Response.prototype.json = new Proxy(Response.prototype.json, { - apply: function() { - return Reflect.apply(...arguments).then(o => pruner(o)); - }, - }); -})(); - - -// Imported from: -// https://github.com/NanoAdblocker/NanoFilters/blob/1f3be7211bb0809c5106996f52564bf10c4525f7/NanoFiltersSource/NanoResources.txt#L126 -// -// Speed up or down setInterval, 3 optional arguments. -// The payload matcher, a string literal or a JavaScript RegExp, defaults -// to match all. -// delayMatcher -// The delay matcher, an integer, defaults to 1000. -// Use `*` to match any delay. -// boostRatio - The delay multiplier when there is a match, 0.5 speeds up by -// 2 times and 2 slows down by 2 times, defaults to 0.05 or speed up -// 20 times. Speed up and down both cap at 50 times. -/// nano-setInterval-booster.js -/// alias nano-sib.js -(function() { - let needleArg = '{{1}}'; - if ( needleArg === '{{1}}' ) { needleArg = ''; } - let delayArg = '{{2}}'; - if ( delayArg === '{{2}}' ) { delayArg = ''; } - let boostArg = '{{3}}'; - if ( boostArg === '{{3}}' ) { boostArg = ''; } - if ( needleArg === '' ) { - needleArg = '.?'; - } else if ( needleArg.charAt(0) === '/' && needleArg.slice(-1) === '/' ) { - needleArg = needleArg.slice(1, -1); - } else { - needleArg = needleArg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const reNeedle = new RegExp(needleArg); - let delay = delayArg !== '*' ? parseInt(delayArg, 10) : -1; - if ( isNaN(delay) || isFinite(delay) === false ) { delay = 1000; } - let boost = parseFloat(boostArg); - boost = isNaN(boost) === false && isFinite(boost) - ? Math.min(Math.max(boost, 0.02), 50) - : 0.05; - self.setInterval = new Proxy(self.setInterval, { - apply: function(target, thisArg, args) { - const [ a, b ] = args; - if ( - (delay === -1 || b === delay) && - reNeedle.test(a.toString()) - ) { - args[1] = b * boost; - } - return target.apply(thisArg, args); - } - }); -})(); - - -// Imported from: -// https://github.com/NanoAdblocker/NanoFilters/blob/1f3be7211bb0809c5106996f52564bf10c4525f7/NanoFiltersSource/NanoResources.txt#L82 -// -// Speed up or down setTimeout, 3 optional arguments. -// funcMatcher -// The payload matcher, a string literal or a JavaScript RegExp, defaults -// to match all. -// delayMatcher -// The delay matcher, an integer, defaults to 1000. -// Use `*` to match any delay. -// boostRatio - The delay multiplier when there is a match, 0.5 speeds up by -// 2 times and 2 slows down by 2 times, defaults to 0.05 or speed up -// 20 times. Speed up and down both cap at 50 times. -/// nano-setTimeout-booster.js -/// alias nano-stb.js -(function() { - let needleArg = '{{1}}'; - if ( needleArg === '{{1}}' ) { needleArg = ''; } - let delayArg = '{{2}}'; - if ( delayArg === '{{2}}' ) { delayArg = ''; } - let boostArg = '{{3}}'; - if ( boostArg === '{{3}}' ) { boostArg = ''; } - if ( needleArg === '' ) { - needleArg = '.?'; - } else if ( needleArg.charAt(0) === '/' && needleArg.slice(-1) === '/' ) { - needleArg = needleArg.slice(1, -1); - } else { - needleArg = needleArg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const reNeedle = new RegExp(needleArg); - let delay = delayArg !== '*' ? parseInt(delayArg, 10) : -1; - if ( isNaN(delay) || isFinite(delay) === false ) { delay = 1000; } - let boost = parseFloat(boostArg); - boost = isNaN(boost) === false && isFinite(boost) - ? Math.min(Math.max(boost, 0.02), 50) - : 0.05; - self.setTimeout = new Proxy(self.setTimeout, { - apply: function(target, thisArg, args) { - const [ a, b ] = args; - if ( - (delay === -1 || b === delay) && - reNeedle.test(a.toString()) - ) { - args[1] = b * boost; - } - return target.apply(thisArg, args); - } - }); -})(); - - -/// noeval-if.js -(function() { - let needle = '{{1}}'; - if ( needle === '' || needle === '{{1}}' ) { - needle = '.?'; - } else if ( needle.slice(0,1) === '/' && needle.slice(-1) === '/' ) { - needle = needle.slice(1,-1); - } else { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needle = new RegExp(needle); - window.eval = new Proxy(window.eval, { // jshint ignore: line - apply: function(target, thisArg, args) { - const a = args[0]; - if ( needle.test(a.toString()) === false ) { - return target.apply(thisArg, args); - } - } - }); -})(); - - -/// no-fetch-if.js -(function() { - let arg1 = '{{1}}'; - if ( arg1 === '{{1}}' ) { arg1 = ''; } - const needles = []; - for ( const condition of arg1.split(/\s+/) ) { - if ( condition === '' ) { continue; } - const pos = condition.indexOf(':'); - let key, value; - if ( pos !== -1 ) { - key = condition.slice(0, pos); - value = condition.slice(pos + 1); - } else { - key = 'url'; - value = condition; - } - if ( value === '' ) { - value = '^'; - } else if ( value.startsWith('/') && value.endsWith('/') ) { - value = value.slice(1, -1); - } else { - value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needles.push({ key, re: new RegExp(value) }); - } - const log = needles.length === 0 ? console.log.bind(console) : undefined; - self.fetch = new Proxy(self.fetch, { - apply: function(target, thisArg, args) { - let proceed = true; - try { - let details; - if ( args[0] instanceof self.Request ) { - details = args[0]; - } else { - details = Object.assign({ url: args[0] }, args[1]); - } - const props = new Map(); - for ( const prop in details ) { - let v = details[prop]; - if ( typeof v !== 'string' ) { - try { v = JSON.stringify(v); } - catch(ex) { } - } - if ( typeof v !== 'string' ) { continue; } - props.set(prop, v); - } - if ( log !== undefined ) { - const out = Array.from(props) - .map(a => `${a[0]}:${a[1]}`) - .join(' '); - log(`uBO: fetch(${out})`); - } - proceed = needles.length === 0; - for ( const { key, re } of needles ) { - if ( - props.has(key) === false || - re.test(props.get(key)) === false - ) { - proceed = true; - break; - } - } - } catch(ex) { - } - return proceed - ? Reflect.apply(target, thisArg, args) - : Promise.resolve(new Response()); - } - }); -})(); - - -/// no-floc.js -// https://github.com/uBlockOrigin/uBlock-issues/issues/1553 -(function() { - if ( Document instanceof Object === false ) { return; } - if ( Document.prototype.interestCohort instanceof Function === false ) { - return; - } - Document.prototype.interestCohort = new Proxy( - Document.prototype.interestCohort, - { - apply: function() { - return Promise.reject(); - } - } - ); -})(); - - -/// refresh-defuser.js -// https://www.reddit.com/r/uBlockOrigin/comments/q0frv0/while_reading_a_sports_article_i_was_redirected/hf7wo9v/ -(function() { - const arg1 = '{{1}}'; - const defuse = ( ) => { - const meta = document.querySelector('meta[http-equiv="refresh" i][content]'); - if ( meta === null ) { return; } - const s = arg1 === '' || arg1 === '{{1}}' - ? meta.getAttribute('content') - : arg1; - const ms = Math.max(parseFloat(s) || 0, 0) * 1000; - setTimeout(( ) => { window.stop(); }, ms); - }; - if ( document.readyState === 'loading' ) { - document.addEventListener('DOMContentLoaded', defuse, { once: true }); - } else { - defuse(); - } -})(); - - -/// remove-attr.js -/// alias ra.js -(function() { - const token = '{{1}}'; - if ( token === '' || token === '{{1}}' ) { return; } - const tokens = token.split(/\s*\|\s*/); - let selector = '{{2}}'; - if ( selector === '' || selector === '{{2}}' ) { - selector = `[${tokens.join('],[')}]`; - } - let behavior = '{{3}}'; - let timer; - const rmattr = ( ) => { - timer = undefined; - try { - const nodes = document.querySelectorAll(selector); - for ( const node of nodes ) { - for ( const attr of tokens ) { - node.removeAttribute(attr); - } - } - } catch(ex) { - } - }; - const mutationHandler = mutations => { - if ( timer !== undefined ) { return; } - let skip = true; - for ( let i = 0; i < mutations.length && skip; i++ ) { - const { type, addedNodes, removedNodes } = mutations[i]; - if ( type === 'attributes' ) { skip = false; } - for ( let j = 0; j < addedNodes.length && skip; j++ ) { - if ( addedNodes[j].nodeType === 1 ) { skip = false; break; } - } - for ( let j = 0; j < removedNodes.length && skip; j++ ) { - if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } - } - } - if ( skip ) { return; } - timer = self.requestIdleCallback(rmattr, { timeout: 17 }); - }; - const start = ( ) => { - rmattr(); - if ( /\bstay\b/.test(behavior) === false ) { return; } - const observer = new MutationObserver(mutationHandler); - observer.observe(document, { - attributes: true, - attributeFilter: tokens, - childList: true, - subtree: true, - }); - }; - if ( document.readyState !== 'complete' && /\bcomplete\b/.test(behavior) ) { - self.addEventListener('load', start, { once: true }); - } else if ( document.readyState !== 'loading' || /\basap\b/.test(behavior) ) { - start(); - } else { - self.addEventListener('DOMContentLoaded', start, { once: true }); - } -})(); - - -/// remove-class.js -/// alias rc.js -(function() { - const token = '{{1}}'; - if ( token === '' || token === '{{1}}' ) { return; } - const tokens = token.split(/\s*\|\s*/); - let selector = '{{2}}'; - if ( selector === '' || selector === '{{2}}' ) { - selector = '.' + tokens.map(a => CSS.escape(a)).join(',.'); - } - let behavior = '{{3}}'; - let timer; - const rmclass = function() { - timer = undefined; - try { - const nodes = document.querySelectorAll(selector); - for ( const node of nodes ) { - node.classList.remove(...tokens); - } - } catch(ex) { - } - }; - const mutationHandler = mutations => { - if ( timer !== undefined ) { return; } - let skip = true; - for ( let i = 0; i < mutations.length && skip; i++ ) { - const { type, addedNodes, removedNodes } = mutations[i]; - if ( type === 'attributes' ) { skip = false; } - for ( let j = 0; j < addedNodes.length && skip; j++ ) { - if ( addedNodes[j].nodeType === 1 ) { skip = false; break; } - } - for ( let j = 0; j < removedNodes.length && skip; j++ ) { - if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } - } - } - if ( skip ) { return; } - timer = self.requestIdleCallback(rmclass, { timeout: 67 }); - }; - const start = ( ) => { - rmclass(); - if ( /\bstay\b/.test(behavior) === false ) { return; } - const observer = new MutationObserver(mutationHandler); - observer.observe(document, { - attributes: true, - attributeFilter: [ 'class' ], - childList: true, - subtree: true, - }); - }; - if ( document.readyState !== 'complete' && /\bcomplete\b/.test(behavior) ) { - self.addEventListener('load', start, { once: true }); - } else if ( document.readyState === 'loading' ) { - self.addEventListener('DOMContentLoaded', start, { once: true }); - } else { - start(); - } -})(); - - -/// no-requestAnimationFrame-if.js -/// alias norafif.js -(function() { - let needle = '{{1}}'; - if ( needle === '{{1}}' ) { needle = ''; } - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1, -1); - } else if ( needle !== '' ) { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const log = needleNot === false && needle === '' ? console.log : undefined; - const reNeedle = new RegExp(needle); - window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - let defuse = false; - if ( log !== undefined ) { - log('uBO: requestAnimationFrame("%s")', a); - } else { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse ) { - args[0] = function(){}; - } - return target.apply(thisArg, args); - } - }); -})(); - - -/// set-constant.js -/// alias set.js -(function() { - const chain = '{{1}}'; - let cValue = '{{2}}'; - const thisScript = document.currentScript; - if ( cValue === 'undefined' ) { - cValue = undefined; - } else if ( cValue === 'false' ) { - cValue = false; - } else if ( cValue === 'true' ) { - cValue = true; - } else if ( cValue === 'null' ) { - cValue = null; - } else if ( cValue === "''" ) { - cValue = ''; - } else if ( cValue === '[]' ) { - cValue = []; - } else if ( cValue === '{}' ) { - cValue = {}; - } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; - } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; - } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; - } else if ( /^\d+$/.test(cValue) ) { - cValue = parseFloat(cValue); - if ( isNaN(cValue) ) { return; } - if ( Math.abs(cValue) > 0x7FFF ) { return; } - } else { - return; - } - let aborted = false; - const mustAbort = function(v) { - if ( aborted ) { return true; } - aborted = - (v !== undefined && v !== null) && - (cValue !== undefined && cValue !== null) && - (typeof v !== typeof cValue); - return aborted; - }; - // https://github.com/uBlockOrigin/uBlock-issues/issues/156 - // Support multiple trappers for the same property. - const trapProp = function(owner, prop, configurable, handler) { - if ( handler.init(owner[prop]) === false ) { return; } - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if ( odesc instanceof Object ) { - owner[prop] = cValue; - if ( odesc.get instanceof Function ) { - prevGetter = odesc.get; - } - if ( odesc.set instanceof Function ) { - prevSetter = odesc.set; - } - } - try { - Object.defineProperty(owner, prop, { - configurable, - get() { - if ( prevGetter !== undefined ) { - prevGetter(); - } - return handler.getter(); // cValue - }, - set(a) { - if ( prevSetter !== undefined ) { - prevSetter(a); - } - handler.setter(a); - } - }); - } catch(ex) { - } - }; - const trapChain = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - trapProp(owner, chain, false, { - v: undefined, - init: function(v) { - if ( mustAbort(v) ) { return false; } - this.v = v; - return true; - }, - getter: function() { - return document.currentScript === thisScript - ? this.v - : cValue; - }, - setter: function(a) { - if ( mustAbort(a) === false ) { return; } - cValue = a; - } - }); - return; - } - const prop = chain.slice(0, pos); - const v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v instanceof Object || typeof v === 'object' && v !== null ) { - trapChain(v, chain); - return; - } - trapProp(owner, prop, true, { - v: undefined, - init: function(v) { - this.v = v; - return true; - }, - getter: function() { - return this.v; - }, - setter: function(a) { - this.v = a; - if ( a instanceof Object ) { - trapChain(a, chain); - } - } - }); - }; - trapChain(window, chain); -})(); - - -/// no-setInterval-if.js -/// alias nosiif.js -(function() { - let needle = '{{1}}'; - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - let delay = '{{2}}'; - if ( delay === '{{2}}' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - if ( needle === '' || needle === '{{1}}' ) { - needle = ''; - } else if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1,-1); - } else { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const log = needleNot === false && needle === '' && delay === undefined - ? console.log - : undefined; - const reNeedle = new RegExp(needle); - window.setInterval = new Proxy(window.setInterval, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - const b = args[1]; - if ( log !== undefined ) { - log('uBO: setInterval("%s", %s)', a, b); - } else { - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } - } - return target.apply(thisArg, args); - } - }); -})(); - - -/// no-setTimeout-if.js -/// alias nostif.js -/// alias setTimeout-defuser.js -(function() { - let needle = '{{1}}'; - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - let delay = '{{2}}'; - if ( delay === '{{2}}' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - if ( needle === '' || needle === '{{1}}' ) { - needle = ''; - } else if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1,-1); - } else { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const log = needleNot === false && needle === '' && delay === undefined - ? console.log - : undefined; - const reNeedle = new RegExp(needle); - window.setTimeout = new Proxy(window.setTimeout, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - const b = args[1]; - if ( log !== undefined ) { - log('uBO: setTimeout("%s", %s)', a, b); - } else { - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } - } - return target.apply(thisArg, args); - } - }); -})(); - - -/// webrtc-if.js -(function() { - let good = '{{1}}'; - if ( good.startsWith('/') && good.endsWith('/') ) { - good = good.slice(1, -1); - } else { - good = good.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - let reGood; - try { - reGood = new RegExp(good); - } catch(ex) { - return; - } - const rtcName = window.RTCPeerConnection - ? 'RTCPeerConnection' - : (window.webkitRTCPeerConnection ? 'webkitRTCPeerConnection' : ''); - if ( rtcName === '' ) { return; } - const log = console.log.bind(console); - const neuteredPeerConnections = new WeakSet(); - const isGoodConfig = function(instance, config) { - if ( neuteredPeerConnections.has(instance) ) { return false; } - if ( config instanceof Object === false ) { return true; } - if ( Array.isArray(config.iceServers) === false ) { return true; } - for ( const server of config.iceServers ) { - const urls = typeof server.urls === 'string' - ? [ server.urls ] - : server.urls; - if ( Array.isArray(urls) ) { - for ( const url of urls ) { - if ( reGood.test(url) ) { return true; } - } - } - if ( typeof server.username === 'string' ) { - if ( reGood.test(server.username) ) { return true; } - } - if ( typeof server.credential === 'string' ) { - if ( reGood.test(server.credential) ) { return true; } - } - } - neuteredPeerConnections.add(instance); - return false; - }; - const peerConnectionCtor = window[rtcName]; - const peerConnectionProto = peerConnectionCtor.prototype; - peerConnectionProto.createDataChannel = - new Proxy(peerConnectionProto.createDataChannel, { - apply: function(target, thisArg, args) { - if ( isGoodConfig(target, args[1]) === false ) { - log('uBO:', args[1]); - return Reflect.apply(target, thisArg, args.slice(0, 1)); - } - return Reflect.apply(target, thisArg, args); - }, - }); - window[rtcName] = - new Proxy(peerConnectionCtor, { - construct: function(target, args) { - if ( isGoodConfig(target, args[0]) === false ) { - log('uBO:', args[0]); - return Reflect.construct(target); - } - return Reflect.construct(target, args); - } - }); -})(); - - -/// no-xhr-if.js -(function() { - const xhrInstances = new WeakMap(); - let arg1 = '{{1}}'; - if ( arg1 === '{{1}}' ) { arg1 = ''; } - const needles = []; - for ( const condition of arg1.split(/\s+/) ) { - if ( condition === '' ) { continue; } - const pos = condition.indexOf(':'); - let key, value; - if ( pos !== -1 ) { - key = condition.slice(0, pos); - value = condition.slice(pos + 1); - } else { - key = 'url'; - value = condition; - } - if ( value === '' ) { - value = '^'; - } else if ( value.startsWith('/') && value.endsWith('/') ) { - value = value.slice(1, -1); - } else { - value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needles.push({ key, re: new RegExp(value) }); - } - const log = needles.length === 0 ? console.log.bind(console) : undefined; - self.XMLHttpRequest = class extends self.XMLHttpRequest { - open(...args) { - if ( log !== undefined ) { - log(`uBO: xhr.open(${args.join(', ')})`); - } else { - const argNames = [ 'method', 'url' ]; - const haystack = new Map(); - for ( let i = 0; i < args.length && i < argNames.length; i++ ) { - haystack.set(argNames[i], args[i]); - } - if ( haystack.size !== 0 ) { - let matches = true; - for ( const { key, re } of needles ) { - matches = re.test(haystack.get(key) || ''); - if ( matches === false ) { break; } - } - if ( matches ) { - xhrInstances.set(this, haystack); - } - } - } - return super.open(...args); - } - send(...args) { - const haystack = xhrInstances.get(this); - if ( haystack === undefined ) { - return super.send(...args); - } - Object.defineProperties(this, { - readyState: { value: 4, writable: false }, - response: { value: '', writable: false }, - responseText: { value: '', writable: false }, - responseURL: { value: haystack.get('url'), writable: false }, - responseXML: { value: '', writable: false }, - status: { value: 200, writable: false }, - statusText: { value: 'OK', writable: false }, - }); - this.dispatchEvent(new Event('readystatechange')); - this.dispatchEvent(new Event('load')); - this.dispatchEvent(new Event('loadend')); - } - }; -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/10323#issuecomment-992312847 -// https://github.com/AdguardTeam/Scriptlets/issues/158 -// https://github.com/uBlockOrigin/uBlock-issues/discussions/2270 -/// window-close-if.js -(function() { - const arg1 = '{{1}}'; - let reStr; - let subject = ''; - if ( arg1 === '{{1}}' || arg1 === '' ) { - reStr = '^'; - } else if ( /^\/.*\/$/.test(arg1) ) { - reStr = arg1.slice(1, -1); - subject = window.location.href; - } else { - reStr = arg1.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - subject = `${window.location.pathname}${window.location.search}`; - } - try { - const re = new RegExp(reStr); - if ( re.test(subject) ) { - window.close(); - } - } catch(ex) { - console.log(ex); - } -})(); - - -// https://github.com/gorhill/uBlock/issues/1228 -/// window.name-defuser.js -(function() { - if ( window === window.top ) { - window.name = ''; - } -})(); - - -// Experimental: Generic nuisance overlay buster. -// if this works well and proves to be useful, this may end up -// as a stock tool in uBO's popup panel. -/// overlay-buster.js -(function() { - if ( window !== window.top ) { - return; - } - var tstart; - var ttl = 30000; - var delay = 0; - var delayStep = 50; - var buster = function() { - var docEl = document.documentElement, - bodyEl = document.body, - vw = Math.min(docEl.clientWidth, window.innerWidth), - vh = Math.min(docEl.clientHeight, window.innerHeight), - tol = Math.min(vw, vh) * 0.05, - el = document.elementFromPoint(vw/2, vh/2), - style, rect; - for (;;) { - if ( el === null || el.parentNode === null || el === bodyEl ) { - break; - } - style = window.getComputedStyle(el); - if ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) { - rect = el.getBoundingClientRect(); - if ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) { - el.parentNode.removeChild(el); - tstart = Date.now(); - el = document.elementFromPoint(vw/2, vh/2); - bodyEl.style.setProperty('overflow', 'auto', 'important'); - docEl.style.setProperty('overflow', 'auto', 'important'); - continue; - } - } - el = el.parentNode; - } - if ( (Date.now() - tstart) < ttl ) { - delay = Math.min(delay + delayStep, 1000); - setTimeout(buster, delay); - } - }; - var domReady = function(ev) { - if ( ev ) { - document.removeEventListener(ev.type, domReady); - } - tstart = Date.now(); - setTimeout(buster, delay); - }; - if ( document.readyState === 'loading' ) { - document.addEventListener('DOMContentLoaded', domReady); - } else { - domReady(); - } -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/8 -/// alert-buster.js -(function() { - window.alert = new Proxy(window.alert, { - apply: function(a) { - console.info(a); - }, - }); -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/58 -/// gpt-defuser.js -(function() { - const noopfn = function() { - }; - let props = '_resetGPT resetGPT resetAndLoadGPTRecovery _resetAndLoadGPTRecovery setupGPT setupGPTuo'; - props = props.split(/\s+/); - while ( props.length ) { - var prop = props.pop(); - if ( typeof window[prop] === 'function' ) { - window[prop] = noopfn; - } else { - Object.defineProperty(window, prop, { - get: function() { return noopfn; }, - set: noopfn - }); - } - } -})(); - - -// Prevent web pages from using RTCPeerConnection(), and report attempts in console. -/// nowebrtc.js -(function() { - var rtcName = window.RTCPeerConnection ? 'RTCPeerConnection' : ( - window.webkitRTCPeerConnection ? 'webkitRTCPeerConnection' : '' - ); - if ( rtcName === '' ) { return; } - var log = console.log.bind(console); - var pc = function(cfg) { - log('Document tried to create an RTCPeerConnection: %o', cfg); - }; - const noop = function() { - }; - pc.prototype = { - close: noop, - createDataChannel: noop, - createOffer: noop, - setRemoteDescription: noop, - toString: function() { - return '[object RTCPeerConnection]'; - } - }; - var z = window[rtcName]; - window[rtcName] = pc.bind(window); - if ( z.prototype ) { - z.prototype.createDataChannel = function() { - return { - close: function() {}, - send: function() {} - }; - }.bind(null); - } -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/88 -/// golem.de.js -(function() { - const rael = window.addEventListener; - window.addEventListener = function(a, b) { - rael(...arguments); - let haystack; - try { - haystack = b.toString(); - } catch(ex) { - } - if ( - typeof haystack === 'string' && - /^\s*function\s*\(\)\s*\{\s*window\.clearTimeout\(r\)\s*\}\s*$/.test(haystack) - ) { - b(); - } - }.bind(window); -})(); - - -// https://forums.lanik.us/viewtopic.php?f=64&t=32278 -// https://www.reddit.com/r/chrome/comments/58eix6/ublock_origin_not_working_on_certain_sites/ -/// upmanager-defuser.js -(function() { - var onerror = window.onerror; - window.onerror = function(msg, source, lineno, colno, error) { - if ( typeof msg === 'string' && msg.indexOf('upManager') !== -1 ) { - return true; - } - if ( onerror instanceof Function ) { - onerror.call(window, msg, source, lineno, colno, error); - } - }; - Object.defineProperty(window, 'upManager', { value: function() {} }); -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/110 -/// smartadserver.com.js -(function() { - Object.defineProperties(window, { - SmartAdObject: { value: function(){} }, - SmartAdServerAjax: { value: function(){} }, - smartAd: { value: { LoadAds: function() {}, Register: function() {} } } - }); -})(); - - -// https://github.com/reek/anti-adblock-killer/issues/3774#issuecomment-348536138 -// https://github.com/uBlockOrigin/uAssets/issues/883 -/// adfly-defuser.js -(function() { - // Based on AdsBypasser - // License: - // https://github.com/adsbypasser/adsbypasser/blob/master/LICENSE - var isDigit = /^\d$/; - var handler = function(encodedURL) { - var var1 = "", var2 = "", i; - for (i = 0; i < encodedURL.length; i++) { - if (i % 2 === 0) { - var1 = var1 + encodedURL.charAt(i); - } else { - var2 = encodedURL.charAt(i) + var2; - } - } - var data = (var1 + var2).split(""); - for (i = 0; i < data.length; i++) { - if (isDigit.test(data[i])) { - for (var ii = i + 1; ii < data.length; ii++) { - if (isDigit.test(data[ii])) { - var temp = parseInt(data[i],10) ^ parseInt(data[ii],10); - if (temp < 10) { - data[i] = temp.toString(); - } - i = ii; - break; - } - } - } - } - data = data.join(""); - var decodedURL = window.atob(data).slice(16, -16); - window.stop(); - window.onbeforeunload = null; - window.location.href = decodedURL; - }; - try { - var val; - var flag = true; - window.Object.defineProperty(window, "ysmm", { - configurable: false, - set: function(value) { - if (flag) { - flag = false; - try { - if (typeof value === "string") { - handler(value); - } - } catch (err) { } - } - val = value; - }, - get: function() { - return val; - } - }); - } catch (err) { - window.console.error("Failed to set up Adfly bypasser!"); - } -})(); - - -// https://github.com/uBlockOrigin/uAssets/issues/913 -/// disable-newtab-links.js -(function() { - document.addEventListener('click', function(ev) { - var target = ev.target; - while ( target !== null ) { - if ( target.localName === 'a' && target.hasAttribute('target') ) { - ev.stopPropagation(); - ev.preventDefault(); - break; - } - target = target.parentNode; - } - }); -})(); - - -/// damoh-defuser.js -(function() { - const handled = new WeakSet(); - let asyncTimer; - const cleanVideo = function() { - asyncTimer = undefined; - const v = document.querySelector('video'); - if ( v === null ) { return; } - if ( handled.has(v) ) { return; } - handled.add(v); - v.pause(); - v.controls = true; - let el = v.querySelector('meta[itemprop="contentURL"][content]'); - if ( el === null ) { return; } - v.src = el.getAttribute('content'); - el = v.querySelector('meta[itemprop="thumbnailUrl"][content]'); - if ( el !== null ) { v.poster = el.getAttribute('content'); } - }; - const cleanVideoAsync = function() { - if ( asyncTimer !== undefined ) { return; } - asyncTimer = window.requestAnimationFrame(cleanVideo); - }; - const observer = new MutationObserver(cleanVideoAsync); - observer.observe(document, { childList: true, subtree: true }); -})(); - - -/// twitch-videoad.js -// https://github.com/uBlockOrigin/uAssets/issues/5184 -// https://github.com/pixeltris/TwitchAdSolutions/commit/6be4c5313035 -// https://github.com/pixeltris/TwitchAdSolutions/commit/3d2883ea9e3a -// https://github.com/pixeltris/TwitchAdSolutions/commit/7233b5fd2284 -// https://github.com/pixeltris/TwitchAdSolutions/commit/aad8946dab2b -(function() { - if ( /(^|\.)twitch\.tv$/.test(document.location.hostname) === false ) { return; } - window.fetch = new Proxy(window.fetch, { - apply: function(target, thisArg, args) { - const [ url, init ] = args; - if ( - typeof url === 'string' && - url.includes('gql') && - init instanceof Object && - init.headers instanceof Object && - typeof init.body === 'string' && - init.body.includes('PlaybackAccessToken') && - init.body.includes('"isVod":true') === false - ) { - const { headers } = init; - if ( typeof headers['X-Device-Id'] === 'string' ) { - headers['X-Device-Id'] = 'twitch-web-wall-mason'; - } - if ( typeof headers['Device-ID'] === 'string' ) { - headers['Device-ID'] = 'twitch-web-wall-mason'; - } - } - return Reflect.apply(target, thisArg, args); - } - }); -})(); - - -// https://github.com/NanoAdblocker/NanoFilters/issues/149 -/// cookie-remover.js -(function() { - const needle = '{{1}}'; - let reName = /./; - if ( /^\/.+\/$/.test(needle) ) { - reName = new RegExp(needle.slice(1,-1)); - } else if ( needle !== '' && needle !== '{{1}}' ) { - reName = new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); - } - const removeCookie = function() { - document.cookie.split(';').forEach(cookieStr => { - let pos = cookieStr.indexOf('='); - if ( pos === -1 ) { return; } - let cookieName = cookieStr.slice(0, pos).trim(); - if ( !reName.test(cookieName) ) { return; } - let part1 = cookieName + '='; - let part2a = '; domain=' + document.location.hostname; - let part2b = '; domain=.' + document.location.hostname; - let part2c, part2d; - let domain = document.domain; - if ( domain ) { - if ( domain !== document.location.hostname ) { - part2c = '; domain=.' + domain; - } - if ( domain.startsWith('www.') ) { - part2d = '; domain=' + domain.replace('www', ''); - } - } - let part3 = '; path=/'; - let part4 = '; Max-Age=-1000; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - document.cookie = part1 + part4; - document.cookie = part1 + part2a + part4; - document.cookie = part1 + part2b + part4; - document.cookie = part1 + part3 + part4; - document.cookie = part1 + part2a + part3 + part4; - document.cookie = part1 + part2b + part3 + part4; - if ( part2c !== undefined ) { - document.cookie = part1 + part2c + part3 + part4; - } - if ( part2d !== undefined ) { - document.cookie = part1 + part2d + part3 + part4; - } - }); - }; - removeCookie(); - window.addEventListener('beforeunload', removeCookie); -})(); - - - -/// xml-prune.js -(function() { - let selector = '{{1}}'; - if ( selector === '{{1}}' ) { - selector = ''; - } - if ( selector === '' ) { return; } - let selectorCheck = '{{2}}'; - if ( selectorCheck === '{{2}}' ) { - selectorCheck = ''; - } - let urlPattern = '{{3}}'; - if ( urlPattern === '{{3}}' ) { - urlPattern = ''; - } - let reUrl; - if ( urlPattern === '' ) { - reUrl = /^/; - } else if ( /^\/.*\/$/.test(urlPattern) ) { - reUrl = new RegExp(urlPattern.slice(1, -1)); - } else { - reUrl = new RegExp(urlPattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); - } - const pruner = text => { - if ( (/^\s*\s*$/.test(text)) === false ) { - return text; - } - try { - const xmlParser = new DOMParser(); - const xmlDoc = xmlParser.parseFromString(text, 'text/xml'); - if ( selectorCheck !== '' && xmlDoc.querySelector(selectorCheck) === null ) { - return text; - } - const elems = xmlDoc.querySelectorAll(selector); - if ( elems.length !== 0 ) { - for ( const elem of elems ) { - elem.remove(); - } - const serializer = new XMLSerializer(); - text = serializer.serializeToString(xmlDoc); - } - } catch(ex) { - } - return text; - }; - const urlFromArg = arg => { - if ( typeof arg === 'string' ) { return arg; } - if ( arg instanceof Request ) { return arg.url; } - return String(arg); - }; - const realFetch = self.fetch; - self.fetch = new Proxy(self.fetch, { - apply: function(target, thisArg, args) { - if ( reUrl.test(urlFromArg(args[0])) === false ) { - return Reflect.apply(target, thisArg, args); - } - return realFetch(...args).then(realResponse => - realResponse.text().then(text => - new Response(pruner(text), { - status: realResponse.status, - statusText: realResponse.statusText, - headers: realResponse.headers, - }) - ) - ); - } - }); -})(); - - - -/// m3u-prune.js -// https://en.wikipedia.org/wiki/M3U -(function() { - let m3uPattern = '{{1}}'; - if ( m3uPattern === '{{1}}' ) { - m3uPattern = ''; - } - let urlPattern = '{{2}}'; - if ( urlPattern === '{{2}}' ) { - urlPattern = ''; - } - const regexFromArg = arg => { - if ( arg === '' ) { return /^/; } - if ( /^\/.*\/$/.test(arg) ) { return new RegExp(arg.slice(1, -1)); } - return new RegExp( - arg.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*+/g, '.*?') - ); - }; - const reM3u = regexFromArg(m3uPattern); - const reUrl = regexFromArg(urlPattern); - const pruneSpliceoutBlock = (lines, i) => { - if ( lines[i].startsWith('#EXT-X-CUE:TYPE="SpliceOut"') === false ) { - return false; - } - lines[i] = undefined; i += 1; - if ( lines[i].startsWith('#EXT-X-ASSET:CAID') ) { - lines[i] = undefined; i += 1; - } - if ( lines[i].startsWith('#EXT-X-SCTE35:') ) { - lines[i] = undefined; i += 1; - } - if ( lines[i].startsWith('#EXT-X-CUE-IN') ) { - lines[i] = undefined; i += 1; - } - if ( lines[i].startsWith('#EXT-X-SCTE35:') ) { - lines[i] = undefined; i += 1; - } - return true; - }; - const pruneInfBlock = (lines, i) => { - if ( lines[i].startsWith('#EXTINF') === false ) { return false; } - if ( reM3u.test(lines[i+1]) === false ) { return false; } - lines[i] = lines[i+1] = undefined; i += 2; - if ( lines[i].startsWith('#EXT-X-DISCONTINUITY') ) { - lines[i] = undefined; i += 1; - } - return true; - }; - const pruner = text => { - if ( (/^\s*#EXTM3U/.test(text)) === false ) { return text; } - const lines = text.split(/\n\r|\n|\r/); - for ( let i = 0; i < lines.length; i++ ) { - if ( lines[i] === undefined ) { continue; } - if ( pruneSpliceoutBlock(lines, i) ) { continue; } - if ( pruneInfBlock(lines, i) ) { continue; } - } - return lines.filter(l => l !== undefined).join('\n'); - }; - const urlFromArg = arg => { - if ( typeof arg === 'string' ) { return arg; } - if ( arg instanceof Request ) { return arg.url; } - return String(arg); - }; - const realFetch = self.fetch; - self.fetch = new Proxy(self.fetch, { - apply: function(target, thisArg, args) { - if ( reUrl.test(urlFromArg(args[0])) === false ) { - return Reflect.apply(target, thisArg, args); - } - return realFetch(...args).then(realResponse => - realResponse.text().then(text => - new Response(pruner(text), { - status: realResponse.status, - statusText: realResponse.statusText, - headers: realResponse.headers, - }) - ) - ); - } - }); - self.XMLHttpRequest.prototype.open = new Proxy(self.XMLHttpRequest.prototype.open, { - apply: async (target, thisArg, args) => { - if ( reUrl.test(urlFromArg(args[1])) === false ) { - return Reflect.apply(target, thisArg, args); - } - thisArg.addEventListener('readystatechange', function() { - if ( thisArg.readyState !== 4 ) { return; } - const type = thisArg.responseType; - if ( type !== '' && type !== 'text' ) { return; } - const textin = thisArg.responseText; - const textout = pruner(textin); - if ( textout === textin ) { return; } - Object.defineProperty(thisArg, 'response', { value: textout }); - Object.defineProperty(thisArg, 'responseText', { value: textout }); - }); - return Reflect.apply(target, thisArg, args); - } - }); -})(); - - - -// These lines below are skipped by the resource parser. -// <<<< end of private namespace -})(); diff -Nru ublock-origin-1.46.0+dfsg/debian/changelog ublock-origin-1.67.0+dfsg/debian/changelog --- ublock-origin-1.46.0+dfsg/debian/changelog 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/changelog 2025-10-31 13:21:24.000000000 +0000 @@ -1,3 +1,86 @@ +ublock-origin (1.67.0+dfsg-1~deb12u1) bookworm; urgency=medium + + * Backport version 1.67.0 to bookworm to improve user experience and + add new filter capabilities. (Closes: #1059545) + * Fix CVE-2025-4215: Regular Expression Denial of Service (ReDoS) + (Closes: #1104635) + + -- Markus Koschany Fri, 31 Oct 2025 14:21:24 +0100 + +ublock-origin (1.67.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.67.0+dfsg. + + -- Markus Koschany Sat, 25 Oct 2025 21:37:39 +0200 + +ublock-origin (1.62.0+dfsg-2) unstable; urgency=medium + + * Fix CVE-2025-4215: + A remote attacker could abuse an inefficient regular expression in + ublock-origin's filters to cause a denial-of-service and freeze a web + browser. (Closes: #1104635) + + -- Markus Koschany Tue, 10 Jun 2025 17:49:10 +0200 + +ublock-origin (1.62.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.62.0+dfsg. + + -- Markus Koschany Sun, 09 Feb 2025 19:20:16 +0100 + +ublock-origin (1.60.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.60.0+dfsg. (Closes: #1078943) + + -- Markus Koschany Wed, 02 Oct 2024 09:10:25 +0200 + +ublock-origin (1.57.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.57.0+dfsg. + + -- Markus Koschany Sat, 06 Apr 2024 16:19:34 +0200 + +ublock-origin (1.55.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.55.0+dfsg. + + -- Markus Koschany Sun, 21 Jan 2024 21:18:52 +0100 + +ublock-origin (1.54.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.54.0+dfsg. + + -- Markus Koschany Sun, 03 Dec 2023 19:00:28 +0100 + +ublock-origin (1.53.3rc0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.53.3rc0+dfsg. (Closes: #1055315) + + -- Markus Koschany Fri, 10 Nov 2023 05:24:39 +0100 + +ublock-origin (1.52.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.52.0+dfsg. (Closes: #1052658) + + -- Markus Koschany Wed, 27 Sep 2023 01:39:18 +0200 + +ublock-origin (1.51.0+dfsg-2) unstable; urgency=medium + + * Replace js-beautify and csstree Javascript libraries with system libraries. + Document the licenses of js-beautify, csstree and hsluv in debian/copyright. + Add the missing source file of hsluv.js to debian/missing-sources. + Thanks to Bastien Roucariès for the report. (Closes: #1042757) + + -- Markus Koschany Sat, 19 Aug 2023 01:01:05 +0200 + +ublock-origin (1.51.0+dfsg-1) unstable; urgency=medium + + * New upstream version 1.51.0+dfsg. (Closes: #1039061) + * Build the minified asset filters from source. Build-depend on nodejs. + * d/control: Remove obsolete Breaks and Replaces. + + -- Markus Koschany Sat, 22 Jul 2023 00:43:04 +0200 + ublock-origin (1.46.0+dfsg-1) unstable; urgency=medium * New upstream version 1.46.0+dfsg. diff -Nru ublock-origin-1.46.0+dfsg/debian/control ublock-origin-1.67.0+dfsg/debian/control --- ublock-origin-1.46.0+dfsg/debian/control 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/control 2025-10-31 13:21:24.000000000 +0000 @@ -8,9 +8,12 @@ Build-Depends: binaryen, debhelper-compat (= 13), + node-css-tree, + node-js-beautify, + nodejs, python3, wabt -Standards-Version: 4.6.2 +Standards-Version: 4.7.2 Homepage: https://github.com/gorhill/uBlock Vcs-Git: https://salsa.debian.org/webext-team/ublock-origin.git Vcs-Browser: https://salsa.debian.org/webext-team/ublock-origin @@ -36,13 +39,9 @@ Depends: ${misc:Depends} Recommends: - firefox (>= 50) | firefox-esr (>= 50) + firefox | firefox-esr Suggests: ublock-origin-doc -Breaks: - webext-ublock-origin (<< 1.29.0) -Replaces: - webext-ublock-origin (<< 1.29.0) Description: lightweight and efficient ads, malware, trackers blocker (Firefox) uBlock is a small footprint blocker for against web ads, malware, trackers, analytics and similar invasive items. @@ -61,10 +60,6 @@ chromium Suggests: ublock-origin-doc -Breaks: - webext-ublock-origin (<< 1.29.0) -Replaces: - webext-ublock-origin (<< 1.29.0) Description: lightweight and efficient ads, malware, trackers blocker (Chromium) uBlock is a small footprint blocker for against web ads, malware, trackers, analytics and similar invasive items. diff -Nru ublock-origin-1.46.0+dfsg/debian/copyright ublock-origin-1.67.0+dfsg/debian/copyright --- ublock-origin-1.46.0+dfsg/debian/copyright 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/copyright 2025-10-31 13:21:24.000000000 +0000 @@ -22,12 +22,11 @@ uAssets/thirdparties/someonewhocares.org Files: * -Copyright: (C) 2014-2022 The uBlock Origin authors - (C) 2014-2022 Raymond Hill +Copyright: (C) 2014-2025 The uBlock Origin authors + (C) 2014-2025 Raymond Hill License: GPL-3+ -Files: uAssets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt - uAssets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt +Files: uAssets/thirdparties/easylist/* Copyright: (C) 2015 The EasyList authors (https://easylist.adblockplus.org/) License: GPL-3+ or CC-BY-SA-3.0+ @@ -44,14 +43,31 @@ Copyright: Swatinem License: LGPL-3 +Files: src/lib/hsluv/* +Copyright: 2012-2022 Alexei Boronine + 2016 Florian Dormont +License: MIT + +Files: src/lib/js-beautify/* +Copyright: 2007-2018 Einar Lielmanis, Liam Newman, and contributors +License: MIT + Files: src/js/codemirror/* Copyright: by Marijn Haverbeke and others License: MIT Files: src/lib/lz4/* -Copyright: 2018-2021, Raymond Hill +Copyright: 2018-2023, Raymond Hill License: BSD-2-clause +Files: src/lib/csstree/* +Copyright: 2016-2022 by Roman Dvornov +License: MIT + +Files: src/lib/punycode.js +Copyright: Mathias Bynens +License: MIT + Files: src/css/fonts/Inter/* Copyright: 2016-2020 The Inter Project Authors License: SIL-OFL-1.1 @@ -95,17 +111,33 @@ . Copy Left +Files: src/img/flags-of-the-world/* +Copyright: no-copyright +License: public-domain + Flag images are in the public domain (exempt from copyright). + They are completely free for non-commercial and even commercial use. + You can also download all flags." + +Files: src/img/fontawesome/* +Copyright: Dave Gandy +License: SIL-OFL-1.1 Files: debian/* Copyright: 2015 Matthew Bekkema 2016 Sean Whitton - 2018-2022, Markus Koschany + 2018-2025, Markus Koschany License: GPL-3+ Files: debian/upstream/* Copyright: (C) 2014-2016 The uBlock Origin authors License: GPL-3+ +Files: debian/missing-sources/hsluv.ts +Copyright: 2012-2022 Alexei Boronine + 2016 Florian Dormont +License: MIT + + License: GPL-3+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -644,4 +676,3 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff -Nru ublock-origin-1.46.0+dfsg/debian/missing-sources/hsluv.ts ublock-origin-1.67.0+dfsg/debian/missing-sources/hsluv.ts --- ublock-origin-1.46.0+dfsg/debian/missing-sources/hsluv.ts 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/missing-sources/hsluv.ts 2025-10-31 13:21:24.000000000 +0000 @@ -0,0 +1,374 @@ +export class Hsluv { + private static hexChars: string = "0123456789abcdef"; + private static refY: number = 1.0; + private static refU: number = 0.19783000664283; + private static refV: number = 0.46831999493879; + private static kappa: number = 903.2962962; + private static epsilon: number = 0.0088564516; + private static m_r0: number = 3.240969941904521; + private static m_r1: number = -1.537383177570093; + private static m_r2: number = -0.498610760293; + private static m_g0: number = -0.96924363628087; + private static m_g1: number = 1.87596750150772; + private static m_g2: number = 0.041555057407175; + private static m_b0: number = 0.055630079696993; + private static m_b1: number = -0.20397695888897; + private static m_b2: number = 1.056971514242878; + + // RGB + public hex: string = '#000000'; + public rgb_r: number = 0; + public rgb_g: number = 0; + public rgb_b: number = 0; + + // CIE XYZ + public xyz_x: number = 0; + public xyz_y: number = 0; + public xyz_z: number = 0; + + // CIE LUV + public luv_l: number = 0; + public luv_u: number = 0; + public luv_v: number = 0; + + // CIE LUV LCh + public lch_l: number = 0; + public lch_c: number = 0; + public lch_h: number = 0; + + // HSLuv + public hsluv_h: number = 0; + public hsluv_s: number = 0; + public hsluv_l: number = 0; + + // HPLuv + public hpluv_h: number = 0; + public hpluv_p: number = 0; + public hpluv_l: number = 0; + + // 6 lines in slope-intercept format: R < 0, R > 1, G < 0, G > 1, B < 0, B > 1 + public r0s: number = 0; + public r0i: number = 0; + public r1s: number = 0; + public r1i: number = 0; + + public g0s: number = 0; + public g0i: number = 0; + public g1s: number = 0; + public g1i: number = 0; + + public b0s: number = 0; + public b0i: number = 0; + public b1s: number = 0; + public b1i: number = 0; + + private static fromLinear(c: number): number { + if (c <= 0.0031308) { + return 12.92 * c; + } else { + return 1.055 * Math.pow(c, 1 / 2.4) - 0.055; + } + } + + private static toLinear(c: number): number { + if (c > 0.04045) { + return Math.pow((c + 0.055) / 1.055, 2.4); + } else { + return c / 12.92; + } + } + + private static yToL(Y: number): number { + if (Y <= Hsluv.epsilon) { + return Y / Hsluv.refY * Hsluv.kappa; + } else { + return 116 * Math.pow(Y / Hsluv.refY, 1 / 3) - 16; + } + } + + private static lToY(L: number): number { + if (L <= 8) { + return Hsluv.refY * L / Hsluv.kappa; + } else { + return Hsluv.refY * Math.pow((L + 16) / 116, 3); + } + } + + private static rgbChannelToHex(chan: number): string { + const c = Math.round(chan * 255); + const digit2 = c % 16; + const digit1 = (c - digit2) / 16 | 0; + return Hsluv.hexChars.charAt(digit1) + Hsluv.hexChars.charAt(digit2); + } + + private static hexToRgbChannel(hex: string, offset: number): number { + const digit1 = Hsluv.hexChars.indexOf(hex.charAt(offset)); + const digit2 = Hsluv.hexChars.indexOf(hex.charAt(offset + 1)); + const n = digit1 * 16 + digit2; + return n / 255.0; + } + + private static distanceFromOriginAngle(slope: number, intercept: number, angle: number): number { + const d = intercept / (Math.sin(angle) - slope * Math.cos(angle)); + if (d < 0) { + return Infinity; + } else { + return d; + } + } + + private static distanceFromOrigin(slope: number, intercept: number): number { + return Math.abs(intercept) / Math.sqrt(Math.pow(slope, 2) + 1); + } + + private static min6(f1: number, f2: number, f3: number, f4: number, f5: number, f6: number): number { + return Math.min(f1, Math.min(f2, Math.min(f3, Math.min(f4, Math.min(f5, f6))))); + } + + public rgbToHex(): void { + this.hex = "#"; + this.hex += Hsluv.rgbChannelToHex(this.rgb_r); + this.hex += Hsluv.rgbChannelToHex(this.rgb_g); + this.hex += Hsluv.rgbChannelToHex(this.rgb_b); + } + + public hexToRgb(): void { + this.hex = this.hex.toLowerCase(); + this.rgb_r = Hsluv.hexToRgbChannel(this.hex, 1); + this.rgb_g = Hsluv.hexToRgbChannel(this.hex, 3); + this.rgb_b = Hsluv.hexToRgbChannel(this.hex, 5); + } + + public xyzToRgb(): void { + this.rgb_r = Hsluv.fromLinear(Hsluv.m_r0 * this.xyz_x + Hsluv.m_r1 * this.xyz_y + Hsluv.m_r2 * this.xyz_z); + this.rgb_g = Hsluv.fromLinear(Hsluv.m_g0 * this.xyz_x + Hsluv.m_g1 * this.xyz_y + Hsluv.m_g2 * this.xyz_z); + this.rgb_b = Hsluv.fromLinear(Hsluv.m_b0 * this.xyz_x + Hsluv.m_b1 * this.xyz_y + Hsluv.m_b2 * this.xyz_z); + } + + public rgbToXyz(): void { + const lr = Hsluv.toLinear(this.rgb_r); + const lg = Hsluv.toLinear(this.rgb_g); + const lb = Hsluv.toLinear(this.rgb_b); + this.xyz_x = 0.41239079926595 * lr + 0.35758433938387 * lg + 0.18048078840183 * lb; + this.xyz_y = 0.21263900587151 * lr + 0.71516867876775 * lg + 0.072192315360733 * lb; + this.xyz_z = 0.019330818715591 * lr + 0.11919477979462 * lg + 0.95053215224966 * lb; + } + + public xyzToLuv(): void { + const divider = this.xyz_x + 15 * this.xyz_y + 3 * this.xyz_z; + let varU = 4 * this.xyz_x; + let varV = 9 * this.xyz_y; + if (divider !== 0) { + varU /= divider; + varV /= divider; + } else { + varU = NaN; + varV = NaN; + } + this.luv_l = Hsluv.yToL(this.xyz_y); + if (this.luv_l === 0) { + this.luv_u = 0; + this.luv_v = 0; + } else { + this.luv_u = 13 * this.luv_l * (varU - Hsluv.refU); + this.luv_v = 13 * this.luv_l * (varV - Hsluv.refV); + } + } + + public luvToXyz(): void { + if (this.luv_l === 0) { + this.xyz_x = 0; + this.xyz_y = 0; + this.xyz_z = 0; + return; + } + const varU = this.luv_u / (13 * this.luv_l) + Hsluv.refU; + const varV = this.luv_v / (13 * this.luv_l) + Hsluv.refV; + this.xyz_y = Hsluv.lToY(this.luv_l); + this.xyz_x = 0 - 9 * this.xyz_y * varU / ((varU - 4) * varV - varU * varV); + this.xyz_z = (9 * this.xyz_y - 15 * varV * this.xyz_y - varV * this.xyz_x) / (3 * varV); + } + + public luvToLch(): void { + this.lch_l = this.luv_l; + this.lch_c = Math.sqrt(this.luv_u * this.luv_u + this.luv_v * this.luv_v); + if (this.lch_c < 0.00000001) { + this.lch_h = 0; + } else { + const hrad = Math.atan2(this.luv_v, this.luv_u); + this.lch_h = hrad * 180.0 / Math.PI; + if (this.lch_h < 0) { + this.lch_h = 360 + this.lch_h; + } + } + } + + + public lchToLuv(): void { + const hrad = this.lch_h / 180.0 * Math.PI; + this.luv_l = this.lch_l; + this.luv_u = Math.cos(hrad) * this.lch_c; + this.luv_v = Math.sin(hrad) * this.lch_c; + } + + public calculateBoundingLines(l: number): void { + const sub1 = Math.pow(l + 16, 3) / 1560896; + const sub2 = sub1 > Hsluv.epsilon ? sub1 : l / Hsluv.kappa; + const s1r = sub2 * (284517 * Hsluv.m_r0 - 94839 * Hsluv.m_r2); + const s2r = sub2 * (838422 * Hsluv.m_r2 + 769860 * Hsluv.m_r1 + 731718 * Hsluv.m_r0); + const s3r = sub2 * (632260 * Hsluv.m_r2 - 126452 * Hsluv.m_r1); + const s1g = sub2 * (284517 * Hsluv.m_g0 - 94839 * Hsluv.m_g2); + const s2g = sub2 * (838422 * Hsluv.m_g2 + 769860 * Hsluv.m_g1 + 731718 * Hsluv.m_g0); + const s3g = sub2 * (632260 * Hsluv.m_g2 - 126452 * Hsluv.m_g1); + const s1b = sub2 * (284517 * Hsluv.m_b0 - 94839 * Hsluv.m_b2); + const s2b = sub2 * (838422 * Hsluv.m_b2 + 769860 * Hsluv.m_b1 + 731718 * Hsluv.m_b0); + const s3b = sub2 * (632260 * Hsluv.m_b2 - 126452 * Hsluv.m_b1); + this.r0s = s1r / s3r; + this.r0i = s2r * l / s3r; + this.r1s = s1r / (s3r + 126452); + this.r1i = (s2r - 769860) * l / (s3r + 126452); + this.g0s = s1g / s3g; + this.g0i = s2g * l / s3g; + this.g1s = s1g / (s3g + 126452); + this.g1i = (s2g - 769860) * l / (s3g + 126452); + this.b0s = s1b / s3b; + this.b0i = s2b * l / s3b; + this.b1s = s1b / (s3b + 126452); + this.b1i = (s2b - 769860) * l / (s3b + 126452); + } + + public calcMaxChromaHpluv(): number { + const r0 = Hsluv.distanceFromOrigin(this.r0s, this.r0i); + const r1 = Hsluv.distanceFromOrigin(this.r1s, this.r1i); + const g0 = Hsluv.distanceFromOrigin(this.g0s, this.g0i); + const g1 = Hsluv.distanceFromOrigin(this.g1s, this.g1i); + const b0 = Hsluv.distanceFromOrigin(this.b0s, this.b0i); + const b1 = Hsluv.distanceFromOrigin(this.b1s, this.b1i); + return Hsluv.min6(r0, r1, g0, g1, b0, b1); + } + + public calcMaxChromaHsluv(h: number): number { + const hueRad = h / 360 * Math.PI * 2; + const r0 = Hsluv.distanceFromOriginAngle(this.r0s, this.r0i, hueRad); + const r1 = Hsluv.distanceFromOriginAngle(this.r1s, this.r1i, hueRad); + const g0 = Hsluv.distanceFromOriginAngle(this.g0s, this.g0i, hueRad); + const g1 = Hsluv.distanceFromOriginAngle(this.g1s, this.g1i, hueRad); + const b0 = Hsluv.distanceFromOriginAngle(this.b0s, this.b0i, hueRad); + const b1 = Hsluv.distanceFromOriginAngle(this.b1s, this.b1i, hueRad); + return Hsluv.min6(r0, r1, g0, g1, b0, b1); + } + + public hsluvToLch(): void { + if (this.hsluv_l > 99.9999999) { + this.lch_l = 100; + this.lch_c = 0; + } else if (this.hsluv_l < 0.00000001) { + this.lch_l = 0; + this.lch_c = 0; + } else { + this.lch_l = this.hsluv_l; + this.calculateBoundingLines(this.hsluv_l); + const max = this.calcMaxChromaHsluv(this.hsluv_h); + this.lch_c = max / 100 * this.hsluv_s; + } + this.lch_h = this.hsluv_h; + } + + public lchToHsluv(): void { + if (this.lch_l > 99.9999999) { + this.hsluv_s = 0; + this.hsluv_l = 100; + } else if (this.lch_l < 0.00000001) { + this.hsluv_s = 0; + this.hsluv_l = 0; + } else { + this.calculateBoundingLines(this.lch_l); + const max = this.calcMaxChromaHsluv(this.lch_h); + this.hsluv_s = this.lch_c / max * 100; + this.hsluv_l = this.lch_l; + } + this.hsluv_h = this.lch_h; + } + + public hpluvToLch(): void { + if (this.hpluv_l > 99.9999999) { + this.lch_l = 100; + this.lch_c = 0; + } else if (this.hpluv_l < 0.00000001) { + this.lch_l = 0; + this.lch_c = 0; + } else { + this.lch_l = this.hpluv_l; + this.calculateBoundingLines(this.hpluv_l); + const max = this.calcMaxChromaHpluv(); + this.lch_c = max / 100 * this.hpluv_p; + } + this.lch_h = this.hpluv_h; + } + + public lchToHpluv(): void { + if (this.lch_l > 99.9999999) { + this.hpluv_p = 0; + this.hpluv_l = 100; + } else if (this.lch_l < 0.00000001) { + this.hpluv_p = 0; + this.hpluv_l = 0; + } else { + this.calculateBoundingLines(this.lch_l); + const max = this.calcMaxChromaHpluv(); + this.hpluv_p = this.lch_c / max * 100; + this.hpluv_l = this.lch_l; + } + this.hpluv_h = this.lch_h; + } + + public hsluvToRgb(): void { + this.hsluvToLch(); + this.lchToLuv(); + this.luvToXyz(); + this.xyzToRgb(); + } + + public hpluvToRgb(): void { + this.hpluvToLch(); + this.lchToLuv(); + this.luvToXyz(); + this.xyzToRgb(); + } + + public hsluvToHex(): void { + this.hsluvToRgb(); + this.rgbToHex(); + } + + public hpluvToHex(): void { + this.hpluvToRgb(); + this.rgbToHex(); + } + + public rgbToHsluv(): void { + this.rgbToXyz(); + this.xyzToLuv(); + this.luvToLch(); + this.lchToHpluv(); + this.lchToHsluv(); + } + + public rgbToHpluv(): void { + this.rgbToXyz(); + this.xyzToLuv(); + this.luvToLch(); + this.lchToHpluv(); + this.lchToHpluv(); + } + + public hexToHsluv(): void { + this.hexToRgb(); + this.rgbToHsluv(); + } + + public hexToHpluv(): void { + this.hexToRgb(); + this.rgbToHpluv(); + } +} diff -Nru ublock-origin-1.46.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch ublock-origin-1.67.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch --- ublock-origin-1.46.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch 2025-10-31 13:21:24.000000000 +0000 @@ -7,10 +7,10 @@ 1 file changed, 1 insertion(+) diff --git a/assets/assets.json b/assets/assets.json -index 8d31169..1dd44ff 100644 +index 6cd042e..4b920b1 100644 --- a/assets/assets.json +++ b/assets/assets.json -@@ -349,6 +349,7 @@ +@@ -491,6 +491,7 @@ "supportURL": "https://someonewhocares.org/hosts/" }, "plowe-0": { diff -Nru ublock-origin-1.46.0+dfsg/debian/patches/make-assets.patch ublock-origin-1.67.0+dfsg/debian/patches/make-assets.patch --- ublock-origin-1.46.0+dfsg/debian/patches/make-assets.patch 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/patches/make-assets.patch 2025-10-31 13:21:24.000000000 +0000 @@ -1,16 +1,16 @@ From: Markus Koschany -Date: Mon, 23 Jan 2023 22:24:29 +0100 +Date: Sat, 22 Jul 2023 00:42:40 +0200 Subject: make assets --- - tools/make-assets.sh | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) + tools/make-assets.sh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/make-assets.sh b/tools/make-assets.sh -index f26d2fa..b23d66e 100755 +index 139abbf..1564313 100755 --- a/tools/make-assets.sh +++ b/tools/make-assets.sh -@@ -13,15 +13,14 @@ cp -R ./assets $DES/ +@@ -22,16 +22,15 @@ fi mkdir $DES/thirdparties @@ -24,8 +24,10 @@ cp -R $ASSETS_MAIN/thirdparties/urlhaus-filter $DES/thirdparties/ mkdir -p $DES/thirdparties/easylist --cp $ASSETS_PROD/thirdparties/easy*.txt $DES/thirdparties/easylist/ -+cp $ASSETS_PROD/thirdparties/easylist-downloads.adblockplus.org/*.txt $DES/thirdparties/easylist/ +-cp $ASSETS_PROD/thirdparties/easylist.txt $DES/thirdparties/easylist/ +-cp $ASSETS_PROD/thirdparties/easyprivacy.txt $DES/thirdparties/easylist/ ++cp $ASSETS_PROD/thirdparties/easylist/easylist.txt $DES/thirdparties/easylist/ ++cp $ASSETS_PROD/thirdparties/easylist/easyprivacy.txt $DES/thirdparties/easylist/ mkdir $DES/ublock - cp $ASSETS_PROD/filters/* $DES/ublock/ + cp $ASSETS_PROD/filters/badlists.txt $DES/ublock/badlists.txt diff -Nru ublock-origin-1.46.0+dfsg/debian/rules ublock-origin-1.67.0+dfsg/debian/rules --- ublock-origin-1.46.0+dfsg/debian/rules 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/rules 2025-10-31 13:21:24.000000000 +0000 @@ -11,6 +11,12 @@ wat2wasm src/js/wasm/biditrie.wat -o src/js/wasm/biditrie.wasm wat2wasm src/lib/publicsuffixlist/wasm/publicsuffixlist.wat -o src/lib/publicsuffixlist/wasm/publicsuffixlist.wasm wasm-opt src/lib/lz4/lz4-block-codec.wasm -O4 -o src/lib/lz4/lz4-block-codec.wasm + # Replace embedded copy of csstree.esm.js with corresponding Debian file from src:node-css-tree + cp /usr/share/nodejs/css-tree/dist/csstree.esm.js src/lib/csstree/css-tree.js + # Replace embedded copy of js-beautify with Debian's system library node-js-beautify + cp /usr/share/nodejs/js-beautify/js/lib/beautifier.min.js src/lib/js-beautify/beautifier.min.js + # Build the minified asset filters + cd uAssets && ./tools/make-ublock.sh # Build the browser-specific versions of ublock-origin ./tools/make-firefox.sh ./tools/make-chromium.sh diff -Nru ublock-origin-1.46.0+dfsg/debian/watch ublock-origin-1.67.0+dfsg/debian/watch --- ublock-origin-1.46.0+dfsg/debian/watch 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/watch 2025-10-31 13:21:24.000000000 +0000 @@ -1,3 +1,3 @@ -version=3 -opts=repacksuffix=+dfsg,dversionmangle=s/\+(repack|dfsg|ds|deb)\d*$// \ -https://github.com/gorhill/uBlock/releases .*/(\d.*)\.tar\.gz +version=4 +opts=dversionmangle=s/(\da?)[\+\.\-~](?:dfsg|debian|ds|repack|repacked)\.?\d*$/$1/,uversionmangle=s/-beta/~beta/;s/-rc/~rc/ \ +https://github.com/gorhill/uBlock/tags .*/@ANY_VERSION@@ARCHIVE_EXT@ diff -Nru ublock-origin-1.46.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides --- ublock-origin-1.46.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides 2023-01-23 21:02:37.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides 2025-10-31 13:21:24.000000000 +0000 @@ -1,2 +1,3 @@ # This is a false-positive. privacy-breach-google-adsense + diff -Nru ublock-origin-1.46.0+dfsg/dist/README.md ublock-origin-1.67.0+dfsg/dist/README.md --- ublock-origin-1.46.0+dfsg/dist/README.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/README.md 2025-10-25 19:32:51.000000000 +0000 @@ -1,81 +1,103 @@ -## INSTALL +# INSTALL -### Chromium +## Chromium -- Download and unzip `ublock0.chromium.zip` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). -- Rename the unzipped directory to `ublock` - - When you later update manually, replace the **content** of the `ublock` folder with the **content** of the latest zipped version. - - This will ensure that all the extension settings will be preserved - - As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved. -- Go to chromium/chrome *Extensions*. -- Click to check *Developer mode*. -- Click *Load unpacked extension...*. -- In the file selector dialog: - - Select the directory `ublock` which was created above. - - Click *Open*. +1. Download and unzip `ublock0.chromium.zip` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). +2. Rename the unzipped directory to `ublock`. + - When you update manually, replace the **content** of the `ublock` folder with the **content** of the latest zipped version. This ensures all extension settings are preserved. + - As long as the extension loads from the same folder path as it was originally installed, your settings will be kept. +3. Open Chromium/Chrome and go to *Extensions*. +4. Click to enable *Developer mode*. +5. Click *Load unpacked extension...*. +6. In the file selector dialog: + - Select the `ublock` directory you created. + - Click *Open*. -The extension will now be available in your chromium/chromium-based browser. +The extension will now be available in your Chromium/Chromium-based browser. -Remember that you have to update manually also. For some users, updating manually is actually an advantage because: -- You can update when **you** want -- If ever a new version sucks, you can easily just re-install the previous one +**Note:** You must update manually. For some users, manual updates are beneficial because: +- You can update when **you** want. +- If a new version is unsatisfactory, you can easily reinstall the previous one. -### Firefox +## Firefox -Compatible with Firefox 52 and beyond. +Compatible with Firefox 52 and beyond. -#### For stable release version +### For Stable Release Version -This works only if you set `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) +This method only works if you set `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) -- Download `ublock0.firefox.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). - - Right-click and choose _"Save As..."_. -- Drag and drop the previously downloaded `ublock0.firefox.xpi` into Firefox +1. Download `ublock0.firefox.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). + - Right-click and choose _"Save As..."_. +2. Drag and drop the downloaded `ublock0.firefox.xpi` into Firefox. -#### For beta version +### For Beta Version - Click on `ublock0.firefox.signed.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). -#### Location of uBO settings +### Location of uBO Settings -On Linux, the settings are saved in a JSON file located at `~/.mozilla/firefox/[profile name]/browser-extension-data/uBlock0@raymondhill.net/storage.js`. - -When you uninstall the extension, Firefox deletes that file, so all your settings are lost when you uninstall. - -### Firefox legacy - -Compatible with Firefox 24-56, [Pale Moon](https://www.palemoon.org/) and [SeaMonkey](http://www.seamonkey-project.org/). - -- Download `ublock0.firefox-legacy.xpi` ([latest release desirable](https://github.com/gorhill/uBlock-for-firefox-legacy/releases)). - - Right-click and select "Save Link As..." -- Drag and drop the previously downloaded `ublock0.firefox-legacy.xpi` into Firefox - -With Firefox 43 and beyond, you may need to toggle the setting `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) - -Your uBlock Origin settings are kept intact even after you uninstall the addon. - -On Linux, the settings are saved in a SQlite file located at `~/.mozilla/firefox/[profile name]/extension-data/ublock0.sqlite`. - -On Windows, the settings are saved in a SQlite file located at `%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\ublock0.sqlite`. - -### Build instructions (for developers) - -- Clone [uBlock repo](https://github.com/gorhill/uBlock): `git clone https://github.com/gorhill/uBlock.git` -- Set path to uBlock: `cd uBlock` -- The official version of uBO is in the `master` branch - - `git checkout master` -- Build the plugin: - - Chromium: `make chromium` - - Firefox: `make firefox` - - NPM package: `make npm` -- Load the result of the build into your browser: - - Chromium: - - Navigate to `chrome://extensions/` - - Check _"Developer mode"_ - - Click _"Load unpacked"_ - - Select `/uBlock/dist/build/uBlock0.chromium/` - - Firefox: - - Navigate to `about:debugging#/runtime/this-firefox` - - Click _"Load Temporary Add-on..."_ - - Select `/uBlock/dist/build/uBlock0.firefox/` - +On Linux, the settings are saved in a JSON file located at: +``` +~/.mozilla/firefox/[profile name]/browser-extension-data/uBlock0@raymondhill.net/storage.js +``` +When you uninstall the extension, Firefox deletes this file, and all your settings will be lost. + +### Firefox Legacy + +Compatible with Firefox 24-56, [Pale Moon](https://www.palemoon.org/), and [SeaMonkey](https://www.seamonkey-project.org/). + +1. Download `ublock0.firefox-legacy.xpi` ([latest release desirable](https://github.com/gorhill/uBlock-for-firefox-legacy/releases)). + - Right-click and select "Save Link As..." +2. Drag and drop the downloaded `ublock0.firefox-legacy.xpi` into Firefox. + +For Firefox 43 and beyond, you may need to toggle the setting `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) + +Your uBlock Origin settings are preserved even after uninstalling the addon. + +- On Linux, settings are saved in a SQLite file located at: +``` +~/.mozilla/firefox/[profile name]/extension-data/ublock0.sqlite +``` +- On Windows, settings are saved in a SQLite file located at: +``` +%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\ublock0.sqlite +``` + +## Build Instructions (for Developers) + +1. Clone the [uBlock repository](https://github.com/gorhill/uBlock): + ```bash + git clone https://github.com/gorhill/uBlock.git + ``` +2. Set the path to uBlock: + ```bash + cd uBlock + ``` +3. The official version of uBO is in the `master` branch: + ```bash + git checkout master + ``` +4. Build the plugin: + - Chromium: + ```bash + make chromium + ``` + - Firefox: + ```bash + make firefox + ``` + - NPM package: + ```bash + make npm + ``` +5. Load the result of the build into your browser: + - **Chromium:** + - Navigate to `chrome://extensions/` + - Check _"Developer mode"_ + - Click _"Load unpacked"_ + - Select `/uBlock/dist/build/uBlock0.chromium/` + - **Firefox:** + - Navigate to `about:debugging#/runtime/this-firefox` + - Click _"Load Temporary Add-on..."_ + - Select `/uBlock/dist/build/uBlock0.firefox/` diff -Nru ublock-origin-1.46.0+dfsg/dist/chromium/publish-beta.py ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py --- ublock-origin-1.46.0+dfsg/dist/chromium/publish-beta.py 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import os -import re -import requests -import shutil -import subprocess -import sys -import tempfile -import time -import zipfile - -from string import Template - -# - Download target (raw) uBlock0.chromium.zip from GitHub -# - This is referred to as "raw" package -# - This will fail if not a dev build -# - Upload uBlock0.chromium.zip to Chrome store -# - Publish uBlock0.chromium.zip to Chrome store - -# Find path to project root -projdir = os.path.split(os.path.abspath(__file__))[0] -while not os.path.isdir(os.path.join(projdir, '.git')): - projdir = os.path.normpath(os.path.join(projdir, '..')) - -# We need a version string to work with -if len(sys.argv) >= 2 and sys.argv[1]: - version = sys.argv[1] -else: - version = input('Github release version: ') -version.strip() -if not re.search('^\d+\.\d+\.\d+(b|rc)\d+$', version): - print('Error: Invalid version string.') - exit(1) - -cs_extension_id = 'cgbcahbpdhpcegmbfconppldiemgcoii' -tmpdir = tempfile.TemporaryDirectory() -raw_zip_filename = 'uBlock0_' + version + '.chromium.zip' -raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename) -github_owner = 'gorhill' -github_repo = 'uBlock' - -# Load/save auth secrets -# The build directory is excluded from git -ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') -if os.path.isfile(ubo_secrets_filename): - with open(ubo_secrets_filename) as f: - ubo_secrets = json.load(f) - -def input_secret(prompt, token): - if token in ubo_secrets: - prompt += ' ✔' - prompt += ': ' - value = input(prompt).strip() - if len(value) == 0: - if token not in ubo_secrets: - print('Token error:', token) - exit(1) - value = ubo_secrets[token] - elif token not in ubo_secrets or value != ubo_secrets[token]: - ubo_secrets[token] = value - exists = os.path.isfile(ubo_secrets_filename) - with open(ubo_secrets_filename, 'w') as f: - json.dump(ubo_secrets, f, indent=2) - if not exists: - os.chmod(ubo_secrets_filename, 0o600) - return value - - -# GitHub API token -github_token = input_secret('Github token', 'github_token') -github_auth = 'token ' + github_token - -# -# Get metadata from GitHub about the release -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release -print('Downloading release info from GitHub...') -release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version) -headers = { 'Authorization': github_auth, } -response = requests.get(release_info_url, headers=headers) -if response.status_code != 200: - print('Error: Release not found: {0}'.format(response.status_code)) - exit(1) -release_info = response.json() - -# -# Extract URL to raw package from metadata -# - -# Find url for uBlock0.chromium.zip -raw_zip_url = '' -for asset in release_info['assets']: - if asset['name'] == raw_zip_filename: - raw_zip_url = asset['url'] -if len(raw_zip_url) == 0: - print('Error: Release asset URL not found') - exit(1) - -# -# Download raw package from GitHub -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset -print('Downloading raw zip package from GitHub...') -headers = { - 'Authorization': github_auth, - 'Accept': 'application/octet-stream', -} -response = requests.get(raw_zip_url, headers=headers) -# Redirections are transparently handled: -# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history -if response.status_code != 200: - print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code)) - exit(1) -with open(raw_zip_filepath, 'wb') as f: - f.write(response.content) -print('Downloaded raw package saved as {0}'.format(raw_zip_filepath)) - -# -# Upload to Chrome store -# - -# Auth tokens -cs_id = input_secret('Chrome store id', 'cs_id') -cs_secret = input_secret('Chrome store secret', 'cs_secret') -cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh') - -print('Uploading to Chrome store...') -with open(raw_zip_filepath, 'rb') as f: - print('Generating access token...') - auth_url = 'https://accounts.google.com/o/oauth2/token' - auth_payload = { - 'client_id': cs_id, - 'client_secret': cs_secret, - 'grant_type': 'refresh_token', - 'refresh_token': cs_refresh, - } - auth_response = requests.post(auth_url, data=auth_payload) - if auth_response.status_code != 200: - print('Error: Auth failed -- server error {0}'.format(auth_response.status_code)) - print(auth_response.text) - exit(1) - response_dict = auth_response.json() - if 'access_token' not in response_dict: - print('Error: Auth failed -- no access token') - exit(1) - # Prepare access token - cs_auth = 'Bearer ' + response_dict['access_token'] - headers = { - 'Authorization': cs_auth, - 'x-goog-api-version': '2', - } - # Upload - print('Uploading package...') - upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id) - upload_response = requests.put(upload_url, headers=headers, data=f) - f.close() - if upload_response.status_code != 200: - print('Upload failed -- server error {0}'.format(upload_response.status_code)) - print(upload_response.text) - exit(1) - response_dict = upload_response.json(); - if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS': - print('Upload failed -- server error {0}'.format(response_dict['uploadState'])) - exit(1) - print('Upload succeeded.') - # Publish - print('Publishing package...') - publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id) - headers = { - 'Authorization': cs_auth, - 'x-goog-api-version': '2', - 'Content-Length': '0', - } - publish_response = requests.post(publish_url, headers=headers) - if publish_response.status_code != 200: - print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code)) - exit(1) - response_dict = publish_response.json(); - if 'status' not in response_dict or response_dict['status'][0] != 'OK': - print('Publishing failed -- server error {0}'.format(response_dict['status'])) - exit(1) - print('Publishing succeeded.') - -print('All done.') diff -Nru ublock-origin-1.46.0+dfsg/dist/description/description-am.txt ublock-origin-1.67.0+dfsg/dist/description/description-am.txt --- ublock-origin-1.46.0+dfsg/dist/description/description-am.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/description/description-am.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -Amharic - -Illustrated overview of its efficiency: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared - -Usage: The big power button in the popup is to permanently disable/enable uBlock for the current web site. It applies to the current web site only, it is not a global power button. - -*** - -Flexible, it's more than an "ad blocker": it can also read and create filters from hosts files. - -Out of the box, these lists of filters are loaded and enforced: - -- EasyList -- Peter Lowe’s Ad server list -- EasyPrivacy -- Malware domains - -More lists are available for you to select if you wish: - -- Fanboy’s Enhanced Tracking List -- Dan Pollock’s hosts file -- hpHosts’s Ad and tracking servers -- MVPS HOSTS -- Spam404 -- And many others - -Of course, the more filters enabled, the higher the memory footprint. Yet, even after adding Fanboy's two extra lists, hpHosts’s Ad and tracking servers, uBlock still has a lower memory footprint than other very popular blockers out there. - -Also, be aware that selecting some of these extra lists may lead to higher likelihood of web site breakage -- especially those lists which are normally used as hosts file. - -*** - -Without the preset lists of filters, this extension is nothing. So if ever you really do want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free. - -*** - -Free. -Open source with public license (GPLv3) -For users by users. - -Contributors @ Github: https://github.com/gorhill/uBlock/graphs/contributors -Contributors @ Crowdin: https://crowdin.net/project/ublock - -*** - -It's quite an early version, keep this in mind when you review. - -Project change log: -https://github.com/gorhill/uBlock/releases diff -Nru ublock-origin-1.46.0+dfsg/dist/description/description-en.txt ublock-origin-1.67.0+dfsg/dist/description/description-en.txt --- ublock-origin-1.46.0+dfsg/dist/description/description-en.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/description/description-en.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,14 +1,10 @@ -uBlock Origin (uBO) is **NOT** an "ad blocker"; it is a wide-spectrum content blocker with CPU and memory efficiency as primary features. - -*** - -Out of the box, uBO blocks ads, trackers, coin miners, popups, etc. through the following lists of filters, enabled by default: +uBlock Origin (uBO) is a CPU and memory-efficient wide-spectrum content blocker that blocks ads, trackers, coin miners, popups, annoying anti-blockers, etc., using the following list of filters, enabled by default: - EasyList (ads) - EasyPrivacy (tracking) -- Peter Lowe’s Ad and tracking server list +- Peter Lowe's Blocklist - Online Malicious URL Blocklist -- uBO owned lists +- uBO filter lists More lists are available for you to select if you wish: @@ -22,16 +18,16 @@ *** -Free. -Open source with public license (GPLv3). -For users by users. +Free. Open source with public license (GPLv3). For users by users. No donations sought. If you ever want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free. +You can help contribute by translating uBO on Crowdin. + *** - [Documentation](https://github.com/gorhill/uBlock#ublock-origin) + [Documentation](https://github.com/gorhill/uBlock#ublock-origin-ubo) [Release Notes](https://github.com/gorhill/uBlock/releases) - [Community Support on Reddit](https://www.reddit.com/r/uBlockOrigin/) + [Support Forum on Reddit](https://www.reddit.com/r/uBlockOrigin/) [Contributors on GitHub](https://github.com/gorhill/uBlock/graphs/contributors) - [Contributors on Crowdin](https://crowdin.com/project/ublock) + [Contribute on Crowdin](https://crowdin.com/project/ublock) diff -Nru ublock-origin-1.46.0+dfsg/dist/description/description-ga.txt ublock-origin-1.67.0+dfsg/dist/description/description-ga.txt --- ublock-origin-1.46.0+dfsg/dist/description/description-ga.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/description/description-ga.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -An efficient blocker: easy on memory and CPU footprint, and yet can load and enforce thousands more filters than other popular blockers out there. - -Illustrated overview of its efficiency: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared - -Usage: The big power button in the popup is to permanently disable/enable uBlock for the current web site. It applies to the current web site only, it is not a global power button. - -*** - -Flexible, it's more than an "ad blocker": it can also read and create filters from hosts files. - -Out of the box, these lists of filters are loaded and enforced: - -- EasyList -- Peter Lowe’s Ad server list -- EasyPrivacy -- Malware domains - -More lists are available for you to select if you wish: - -- Fanboy’s Enhanced Tracking List -- Dan Pollock’s hosts file -- hpHosts’s Ad and tracking servers -- MVPS HOSTS -- Spam404 -- And many others - -Of course, the more filters enabled, the higher the memory footprint. Yet, even after adding Fanboy's two extra lists, hpHosts’s Ad and tracking servers, uBlock still has a lower memory footprint than other very popular blockers out there. - -Also, be aware that selecting some of these extra lists may lead to higher likelihood of web site breakage -- especially those lists which are normally used as hosts file. - -*** - -Without the preset lists of filters, this extension is nothing. So if ever you really do want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free. - -*** - -Free. -Open source with public license (GPLv3) -For users by users. - -Contributors @ Github: https://github.com/gorhill/uBlock/graphs/contributors -Contributors @ Crowdin: https://crowdin.net/project/ublock - -*** - -It's quite an early version, keep this in mind when you review. - -Project change log: -https://github.com/gorhill/uBlock/releases diff -Nru ublock-origin-1.46.0+dfsg/dist/firefox/publish-signed-beta.py ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py --- ublock-origin-1.46.0+dfsg/dist/firefox/publish-signed-beta.py 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,331 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import jwt -import os -import re -import requests -import shutil -import subprocess -import sys -import tempfile -import time -import zipfile - -from string import Template - -# - Download target (raw) uBlock0.firefox.xpi from GitHub -# - This is referred to as "raw" package -# - This will fail if not a dev build -# - Modify raw package to make it self-hosted -# - This is referred to as "unsigned" package -# - Ask AMO to sign uBlock0.firefox.xpi -# - Generate JWT to be used for communication with server -# - Upload unsigned package to AMO -# - Wait for a valid download URL for signed package -# - Download signed package as uBlock0.firefox.signed.xpi -# - This is referred to as "signed" package -# - Upload uBlock0.firefox.signed.xpi to GitHub -# - Remove uBlock0.firefox.xpi from GitHub -# - Modify updates.json to point to new version -# - Commit changes to repo - -# Find path to project root -projdir = os.path.split(os.path.abspath(__file__))[0] -while not os.path.isdir(os.path.join(projdir, '.git')): - projdir = os.path.normpath(os.path.join(projdir, '..')) -# Check that found project root is valid -version_filepath = os.path.join(projdir, 'dist', 'version') -if not os.path.isfile(version_filepath): - print('Version file not found.') - exit(1) - -# We need a version string to work with -if len(sys.argv) >= 2 and sys.argv[1]: - tag_version = sys.argv[1] -else: - tag_version = input('Github release version: ') -tag_version.strip() -match = re.search('^(\d+\.\d+\.\d+)(?:(b|rc)(\d+))?$', tag_version) -if not match: - print('Error: Invalid version string.') - exit(1) -ext_version = match.group(1); -if match.group(2): - revision = int(match.group(3)) - if match.group(2) == 'rc': - revision += 100; - ext_version += '.' + str(revision) - -extension_id = 'uBlock0@raymondhill.net' -tmpdir = tempfile.TemporaryDirectory() -raw_xpi_filename = 'uBlock0_' + tag_version + '.firefox.xpi' -raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename) -unsigned_xpi_filepath = os.path.join(tmpdir.name, 'uBlock0.firefox.unsigned.xpi') -signed_xpi_filename = 'uBlock0_' + tag_version + '.firefox.signed.xpi' -signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename) -github_owner = 'gorhill' -github_repo = 'uBlock' - -# Load/save auth secrets -# The build directory is excluded from git -ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') -if os.path.isfile(ubo_secrets_filename): - with open(ubo_secrets_filename) as f: - ubo_secrets = json.load(f) - -def input_secret(prompt, token): - if token in ubo_secrets: - prompt += ' ✔' - prompt += ': ' - value = input(prompt).strip() - if len(value) == 0: - if token not in ubo_secrets: - print('Token error:', token) - exit(1) - value = ubo_secrets[token] - elif token not in ubo_secrets or value != ubo_secrets[token]: - ubo_secrets[token] = value - exists = os.path.isfile(ubo_secrets_filename) - with open(ubo_secrets_filename, 'w') as f: - json.dump(ubo_secrets, f, indent=2) - if not exists: - os.chmod(ubo_secrets_filename, 0o600) - return value - -# GitHub API token -github_token = input_secret('Github token', 'github_token') -github_auth = 'token ' + github_token - -# -# Get metadata from GitHub about the release -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release -print('Downloading release info from GitHub...') -release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, tag_version) -headers = { 'Authorization': github_auth, } -response = requests.get(release_info_url, headers=headers) -if response.status_code != 200: - print('Error: Release not found: {0}'.format(response.status_code)) - exit(1) -release_info = response.json() - -# -# Extract URL to raw package from metadata -# - -# Find url for uBlock0.firefox.xpi -raw_xpi_url = '' -for asset in release_info['assets']: - if asset['name'] == signed_xpi_filename: - print('Error: Found existing signed self-hosted package.') - exit(1) - if asset['name'] == raw_xpi_filename: - raw_xpi_url = asset['url'] -if len(raw_xpi_url) == 0: - print('Error: Release asset URL not found') - exit(1) - -# -# Download raw package from GitHub -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset -print('Downloading raw xpi package from GitHub...') -headers = { - 'Authorization': github_auth, - 'Accept': 'application/octet-stream', -} -response = requests.get(raw_xpi_url, headers=headers) -# Redirections are transparently handled: -# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history -if response.status_code != 200: - print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code)) - exit(1) -with open(raw_xpi_filepath, 'wb') as f: - f.write(response.content) -print('Downloaded raw package saved as {0}'.format(raw_xpi_filepath)) - -# -# Convert the package to a self-hosted one: add `update_url` to the manifest -# -min_browser_version = '68'; - -print('Converting raw xpi package into self-hosted xpi package...') -with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin: - with zipfile.ZipFile(unsigned_xpi_filepath, 'w') as zipout: - for item in zipin.infolist(): - data = zipin.read(item.filename) - if item.filename == 'manifest.json': - manifest = json.loads(bytes.decode(data)) - min_browser_version = manifest['browser_specific_settings']['gecko']['strict_min_version'] - manifest['browser_specific_settings']['gecko']['update_url'] = 'https://raw.githubusercontent.com/{0}/{1}/master/dist/firefox/updates.json'.format(github_owner, github_repo) - data = json.dumps(manifest, indent=2, separators=(',', ': '), sort_keys=True).encode() - zipout.writestr(item, data) - -# -# Ask AMO to sign the self-hosted package -# - https://developer.mozilla.org/en-US/Add-ons/Distribution#Distributing_your_add-on -# - https://pyjwt.readthedocs.io/en/latest/usage.html -# - https://addons-server.readthedocs.io/en/latest/topics/api/auth.html -# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html -# - -amo_api_key = '' -amo_secret = '' - -def get_jwt_auth(): - global amo_api_key - if amo_api_key == '': - amo_api_key = input_secret('AMO API key', 'amo_api_key') - global amo_secret - if amo_secret == '': - amo_secret = input_secret('AMO API secret', 'amo_secret') - amo_nonce = os.urandom(8).hex() - jwt_payload = { - 'iss': amo_api_key, - 'jti': amo_nonce, - 'iat': datetime.datetime.utcnow(), - 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15), - } - return 'JWT ' + jwt.encode(jwt_payload, amo_secret) - -print('Ask AMO to sign self-hosted xpi package...') -with open(unsigned_xpi_filepath, 'rb') as f: - # https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/ - # "We recommend allowing up to 15 minutes." - interval = 60 # check every 60 seconds - countdown = 60 * 60 / interval # for at most 60 minutes - headers = { 'Authorization': get_jwt_auth(), } - data = { 'channel': 'unlisted' } - files = { 'upload': f, } - signing_url = 'https://addons.mozilla.org/api/v4/addons/{0}/versions/{1}/'.format(extension_id, ext_version) - print('Submitting package to be signed...') - response = requests.put(signing_url, headers=headers, data=data, files=files) - if response.status_code != 202: - print('Error: Creating new version failed -- server error {0}'.format(response.status_code)) - print(response.text) - exit(1) - print('Request for signing self-hosted xpi package succeeded.') - signing_request_response = response.json(); - f.close() - print('Waiting for AMO to process the request to sign the self-hosted xpi package...') - # Wait for signed package to be ready - signing_check_url = signing_request_response['url'] - while True: - time.sleep(interval) - sys.stdout.write('.') - sys.stdout.flush() - countdown -= 1 - if countdown <= 0: - print('Error: AMO signing timed out') - exit(1) - headers = { 'Authorization': get_jwt_auth(), } - response = requests.get(signing_check_url, headers=headers) - if response.status_code != 200: - print('Error: AMO signing failed -- server error {0}'.format(response.status_code)) - print(response.text) - exit(1) - signing_check_response = response.json() - if not signing_check_response['processed']: - continue - if not signing_check_response['valid']: - print('Error: AMO validation failed') - print(response.text) - exit(1) - if not signing_check_response['files'] or len(signing_check_response['files']) == 0: - continue - if not signing_check_response['files'][0]['signed']: - continue - if not signing_check_response['files'][0]['download_url']: - print('Error: AMO signing failed') - print(response.text) - exit(1) - print('\r') - print('Self-hosted xpi package successfully signed.') - download_url = signing_check_response['files'][0]['download_url'] - print('Downloading signed self-hosted xpi package from {0}...'.format(download_url)) - response = requests.get(download_url, headers=headers) - if response.status_code != 200: - print('Error: Download signed package failed -- server error {0}'.format(response.status_code)) - print(response.text) - exit(1) - with open(signed_xpi_filepath, 'wb') as f: - f.write(response.content) - f.close() - print('Signed self-hosted xpi package downloaded.') - break - -# -# Upload signed package to GitHub -# - -# https://developer.github.com/v3/repos/releases/#upload-a-release-asset -print('Uploading signed self-hosted xpi package to GitHub...') -with open(signed_xpi_filepath, 'rb') as f: - url = release_info['upload_url'].replace('{?name,label}', '?name=' + signed_xpi_filename) - headers = { - 'Authorization': github_auth, - 'Content-Type': 'application/zip', - } - response = requests.post(url, headers=headers, data=f.read()) - if response.status_code != 201: - print('Error: Upload signed package failed -- server error: {0}'.format(response.status_code)) - exit(1) - -# -# Remove raw package from GitHub -# - -# https://developer.github.com/v3/repos/releases/#delete-a-release-asset -print('Remove raw xpi package from GitHub...') -headers = { 'Authorization': github_auth, } -response = requests.delete(raw_xpi_url, headers=headers) -if response.status_code != 204: - print('Error: Deletion of raw package failed -- server error: {0}'.format(response.status_code)) - -# -# Update updates.json to point to new package -- but only if just-signed -# package is higher version than current one. -# - -# Be sure we are in sync with potentially modified files on remote -r = subprocess.run(['git', 'pull', 'origin', 'master'], stdout=subprocess.PIPE) -rout = bytes.decode(r.stdout).strip() - -def int_from_version(version): - parts = version.split('.') - if len(parts) == 3: - parts.append('0') - return int(parts[0])*10e9 + int(parts[1])*10e6 + int(parts[2])*10e3 + int(parts[3]) - -print('Update GitHub to point to newly signed self-hosted xpi package...') -updates_json_filepath = os.path.join(projdir, 'dist', 'firefox', 'updates.json') -with open(updates_json_filepath) as f: - updates_json = json.load(f) - f.close() - previous_version = updates_json['addons'][extension_id]['updates'][0]['version'] - if int_from_version(ext_version) > int_from_version(previous_version): - with open(os.path.join(projdir, 'dist', 'firefox', 'updates.template.json')) as f: - template_json = Template(f.read()) - f.close() - updates_json = template_json.substitute(ext_version=ext_version, tag_version=tag_version, min_browser_version=min_browser_version) - with open(updates_json_filepath, 'w') as f: - f.write(updates_json) - f.close() - # - Stage the changed file - r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE) - rout = bytes.decode(r.stdout).strip() - if len(rout) >= 2 and rout[1] == 'M': - subprocess.run(['git', 'add', updates_json_filepath]) - # - Commit the staged file - r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE) - rout = bytes.decode(r.stdout).strip() - if len(rout) >= 2 and rout[0] == 'M': - subprocess.run(['git', 'commit', '-m', 'Make Firefox dev build auto-update', updates_json_filepath]) - subprocess.run(['git', 'push', 'origin', 'HEAD']) - -print('All done.') diff -Nru ublock-origin-1.46.0+dfsg/dist/firefox/updates.json ublock-origin-1.67.0+dfsg/dist/firefox/updates.json --- ublock-origin-1.46.0+dfsg/dist/firefox/updates.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/firefox/updates.json 2025-10-25 19:32:51.000000000 +0000 @@ -1,13 +1,17 @@ { - "addons": { - "uBlock0@raymondhill.net": { - "updates": [ - { - "version": "1.45.3.106", - "browser_specific_settings": { "gecko": { "strict_min_version": "68.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.45.3rc6/uBlock0_1.45.3rc6.firefox.signed.xpi" + "addons": { + "uBlock0@raymondhill.net": { + "updates": [ + { + "version": "1.66.5.2", + "browser_specific_settings": { + "gecko": { + "strict_min_version": "92.0" + } + }, + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.66.5b2/uBlock0_1.66.5b2.firefox.signed.xpi" + } + ] } - ] } - } -} +} \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/dist/firefox/updates.template.json ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json --- ublock-origin-1.46.0+dfsg/dist/firefox/updates.template.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -{ - "addons": { - "uBlock0@raymondhill.net": { - "updates": [ - { - "version": "$ext_version", - "browser_specific_settings": { "gecko": { "strict_min_version": "$min_browser_version" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/$tag_version/uBlock0_$tag_version.firefox.signed.xpi" - } - ] - } - } -} diff -Nru ublock-origin-1.46.0+dfsg/dist/mv3/log.txt ublock-origin-1.67.0+dfsg/dist/mv3/log.txt --- ublock-origin-1.46.0+dfsg/dist/mv3/log.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/mv3/log.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3005 +0,0 @@ -Version: 0.1.22.12166 -============================ -Listset for 'default': - Fetching remote https://ublockorigin.github.io/uAssets/filters/filters.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/badware.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/privacy.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/resource-abuse.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/unbreak.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt - Fetching remote https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt - Fetching remote https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt - Fetching remote https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext - Fetching remote https://ublockorigin.github.io/uAssets/filters/filters-2020.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/filters-2021.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/filters-2022.txt -Input filter count: 78892 - Accepted filter count: 76448 - Rejected filter count: 158 -Output rule count: 21541 - Plain good: 20206 - Maybe good (regexes): 128 - redirect=: 292 - removeparams= (accepted/discarded): 25/12 - csp=: 60 - Unsupported: 830 - Could not salvage rule with only entity-based domain= option: megalink.* - Could not salvage rule with only entity-based domain= option: samehadaku.* - Could not salvage rule with only entity-based domain= option: oploverz.* - Could not salvage rule with only entity-based domain= option: mangaku.* - Could not salvage rule with only entity-based domain= option: vinaurl.* - Could not salvage rule with only entity-based domain= option: komikcast.* - Could not salvage rule with only entity-based domain= option: movs4u.* - Could not salvage rule with only entity-based domain= option: movieon21.* - Could not salvage rule with only entity-based domain= option: aagmaal.* - Could not salvage rule with only entity-based domain= option: otakudesu.* - Could not salvage rule with only entity-based domain= option: myflixer.* - Could not salvage rule with only entity-based domain= option: ouo.* - Could not salvage rule with only entity-based domain= option: dewimg.*|imgtown.*|imgviu.*|mazpic.*|outletpic.*|picrok.* - Could not salvage rule with only entity-based domain= option: povvldeo.* - Could not salvage rule with only entity-based domain= option: vinaurl.* - Could not salvage rule with only entity-based domain= option: mirrorace.* - Could not salvage rule with only entity-based domain= option: the-voice-of-germany.* - Could not salvage rule with only entity-based domain= option: linkvertise.* - regexFilter is not RE2-compatible: ^https:\/\/a\.[-0-9a-z]{4,16}\.(?:club|com?|cyou|info|net|ru|site|top?|xxx|xyz)\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - Could not salvage rule with only entity-based domain= option: 1movies.* - Could not salvage rule with only entity-based domain= option: 1movies.* - Could not salvage rule with only entity-based domain= option: vizcloud.*|vizcloud2.* - Could not salvage rule with only entity-based domain= option: slreamplay.* - Could not salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Could not salvage rule with only entity-based domain= option: sexwebvideo.* - Could not salvage rule with only entity-based domain= option: dutchycorp.* - regexFilter is not RE2-compatible: ^https?:\/\/((?!www)[a-z]{3,}|\d{2})?\.?[-0-9a-z]{6,}\.[a-z]{2,6}\/(?:[a-z]{6,8}\/)?\/?\?u=[0-9a-z]{7}&o=[0-9a-z]{7} - regexFilter is not RE2-compatible: ^https?:\/\/((?!www)[a-z]{3,}|\d{2})?\.?[-0-9a-z]{6,}\.[a-z]{2,6}\/(?:[a-z]{6,8}\/)?\/?\?o=[0-9a-z]{7}&u=[0-9a-z]{7} - Could not salvage rule with only entity-based domain= option: the-voice-of-germany.* - Could not salvage rule with only entity-based domain= option: pobre.* - regexFilter is not RE2-compatible: ^https?:\/\/((?!www)[a-z]{3,}|\d{2})?\.?[-0-9a-z]{6,}\.[a-z]{2,6}\/(?:[a-z]{6,8}\/)?\/?\?u=[0-9a-z]{7}&o=[0-9a-z]{7} - regexFilter is not RE2-compatible: ^https?:\/\/((?!www)[a-z]{3,}|\d{2})?\.?[-0-9a-z]{6,}\.[a-z]{2,6}\/(?:[a-z]{6,8}\/)?\/?\?o=[0-9a-z]{7}&u=[0-9a-z]{7} - regexFilter is not RE2-compatible: ^https:\/\/(?:www\d\.)?[-a-z]{6,}\.(?:com|info|net|org)\/(?=[-_a-zA-Z]{0,42}\d)(?=[-_0-9a-z]{0,42}[A-Z])[-_0-9a-zA-Z]{43}\/\?cid=[-_0-9a-zA-Z]{16,36}(?:&qs\d=\S+)?&sid=[_0-9a-f]{1,32}$ - regexFilter is not RE2-compatible: ^https:\/\/(?:www\d\.)?[-a-z]{6,}\.(?:com|info|net|org)\/(?=[-_a-zA-Z]{0,42}\d)(?=[-_0-9a-z]{0,42}[A-Z])[-_0-9a-zA-Z]{43}\/\?sid=[_0-9a-f]{1,32}(?:&qs\d=\S+)?&cid=[-_0-9a-zA-Z]{16,36}$ - Could not salvage rule with only entity-based domain= option: 1337x.*|1337x.g3g.*|unblockit.*|x1337x.* - Could not salvage rule with only entity-based domain= option: pussyspace.* - regexFilter is not RE2-compatible: \/img\/(?!new).+\.gif - Could not salvage rule with only entity-based domain= option: slreamplay.* - regexFilter is not RE2-compatible: \/[a-z]{4,}\/(?!holly7)[0-9a-z]{3,}\d\.\d\.\d{1,2}\.[0-9a-f]{32}\.js$ - Could not salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Could not salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - regexFilter is not RE2-compatible: ^http:\/\/img[a-z]+\.(?:buzz|site|store|xyz)\/(?!shrinker).* - Could not salvage rule with only entity-based domain= option: strcloud.*|streamta.*|streamtape.*|strtape.*|strtapeadblock.*|strtpe.* - Could not salvage rule with only entity-based domain= option: bigkickass.*|kat.*|kat2.*|katbay.*|katfreak.*|kathydra.*|katkickass.*|katkickass.*|kattracker.*|kick4ss.*|kickass-usa.*|kickass.*|kickass2.*|kickassaustralia.*|kickassbay.*|kickassdb.*|kickassfull.*|kickassgo.*|kickasshydra.*|kickassindia.*|kickasskat.*|kickassminds.*|kickassmovies.*|kickasspk.*|kickasst.*|kickasstorrents.*|kickasstorrents2.*|kickasstracker.*|kickasstrusty.*|kickassuk.*|kickassunlocked.*|kickassz.*|kkat.*|kkickass.*|thekat.*|thekickass.*|topkickass.*|torrentkat.*|torrentskickass.* - Could not salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - FilterStrictParty: Strict partyness strict3p not supported - Could not salvage rule with only entity-based domain= option: torrentproject2.* - Could not salvage rule with only entity-based domain= option: upvid.* - Could not salvage rule with only entity-based domain= option: uptomega.* - Could not salvage rule with only entity-based domain= option: clicknupload.* - Could not salvage rule with only entity-based domain= option: uplinkto.* - Could not salvage rule with only entity-based domain= option: link1s.* - Could not salvage rule with only entity-based domain= option: moviesda1.* - Could not salvage rule with only entity-based domain= option: dloader.* - Could not salvage rule with only entity-based domain= option: isaidub.* - Could not salvage rule with only entity-based domain= option: direct-cloud.* - Could not salvage rule with only entity-based domain= option: databasegdriveplayer.* - Could not salvage rule with only entity-based domain= option: 10starhd.* - Could not salvage rule with only entity-based domain= option: earnload.* - Could not salvage rule with only entity-based domain= option: databasegdriveplayer.* - Could not salvage rule with only entity-based domain= option: vipleague.* - Could not salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Could not salvage rule with only entity-based domain= option: sxyprn.* - Could not salvage rule with only entity-based domain= option: palimas.* - Could not salvage rule with only entity-based domain= option: vjav.* - Could not salvage rule with only entity-based domain= option: linkshorts.* - Could not salvage rule with only entity-based domain= option: mazpic.* - Could not salvage rule with only entity-based domain= option: picrok.* - Could not salvage rule with only entity-based domain= option: imgviu.* - Could not salvage rule with only entity-based domain= option: outletpic.* - Could not salvage rule with only entity-based domain= option: dewimg.* - Could not salvage rule with only entity-based domain= option: imgtown.* - Could not salvage rule with only entity-based domain= option: oploverz.* - Could not salvage rule with only entity-based domain= option: readcomiconline.* - Could not salvage rule with only entity-based domain= option: adsrt.* - Could not salvage rule with only entity-based domain= option: animeflv.* - Could not salvage rule with only entity-based domain= option: povvldeo.* - Could not salvage rule with only entity-based domain= option: kiss-anime.* - Could not salvage rule with only entity-based domain= option: japscan.* - Could not salvage rule with only entity-based domain= option: downloadhub.* - Could not salvage rule with only entity-based domain= option: 9xbuddy.* - Could not salvage rule with only entity-based domain= option: viprow.* - Could not salvage rule with only entity-based domain= option: anitube.* - Could not salvage rule with only entity-based domain= option: dramacool9.* - Could not salvage rule with only entity-based domain= option: hdfriday.* - Could not salvage rule with only entity-based domain= option: extramovies.* - Could not salvage rule with only entity-based domain= option: atomixhq.*|pctfenix.* - Could not salvage rule with only entity-based domain= option: shortearn.* - Could not salvage rule with only entity-based domain= option: lookmovie.* - Could not salvage rule with only entity-based domain= option: okstream.* - Could not salvage rule with only entity-based domain= option: megavideo.* - Could not salvage rule with only entity-based domain= option: tmearn.* - Could not salvage rule with only entity-based domain= option: leechall.* - Could not salvage rule with only entity-based domain= option: torrentgalaxy.* - Could not salvage rule with only entity-based domain= option: allcalidad.* - Could not salvage rule with only entity-based domain= option: movieshub.* - Could not salvage rule with only entity-based domain= option: dailysport.* - Could not salvage rule with only entity-based domain= option: mkvcinemas.* - Could not salvage rule with only entity-based domain= option: pelispedia.* - Could not salvage rule with only entity-based domain= option: linkviet.* - Could not salvage rule with only entity-based domain= option: btdb.* - Could not salvage rule with only entity-based domain= option: animesvision.* - Could not salvage rule with only entity-based domain= option: miniurl.* - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.website\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - Could not salvage rule with only entity-based domain= option: uploadhub.* - Could not salvage rule with only entity-based domain= option: bollyflix.* - Could not salvage rule with only entity-based domain= option: veranime.*|verhentai.* - Could not salvage rule with only entity-based domain= option: shortzzy.* - Could not salvage rule with only entity-based domain= option: xtits.* - Could not salvage rule with only entity-based domain= option: shorttey.* - Could not salvage rule with only entity-based domain= option: hdmovieplus.* - Could not salvage rule with only entity-based domain= option: img4fap.* - Could not salvage rule with only entity-based domain= option: elitetorrent.* - Could not salvage rule with only entity-based domain= option: lite-link.* - Could not salvage rule with only entity-based domain= option: adcorto.* - Could not salvage rule with only entity-based domain= option: 720pstream.* - Could not salvage rule with only entity-based domain= option: toonanime.* - Could not salvage rule with only entity-based domain= option: hog.* - Could not salvage rule with only entity-based domain= option: samehadaku.* - Could not salvage rule with only entity-based domain= option: atishmkv.* - Could not salvage rule with only entity-based domain= option: hdhub4u.* - Could not salvage rule with only entity-based domain= option: 10starhd.* - Could not salvage rule with only entity-based domain= option: livetvon.* - Could not salvage rule with only entity-based domain= option: mazpic.* - Could not salvage rule with only entity-based domain= option: picrok.* - Could not salvage rule with only entity-based domain= option: imgviu.* - Could not salvage rule with only entity-based domain= option: outletpic.* - Could not salvage rule with only entity-based domain= option: dewimg.* - Could not salvage rule with only entity-based domain= option: imgtown.* - Could not salvage rule with only entity-based domain= option: btdb.* - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.website\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - Could not salvage rule with only entity-based domain= option: databasegdriveplayer.* - Could not salvage rule with only entity-based domain= option: 10starhd.* - Could not salvage rule with only entity-based domain= option: sxyprn.* - Could not salvage rule with only entity-based domain= option: txxx.* - Could not salvage rule with only entity-based domain= option: mazpic.* - Could not salvage rule with only entity-based domain= option: picrok.* - Could not salvage rule with only entity-based domain= option: imgviu.* - Could not salvage rule with only entity-based domain= option: outletpic.* - Could not salvage rule with only entity-based domain= option: dewimg.* - Could not salvage rule with only entity-based domain= option: imgtown.* - Could not salvage rule with only entity-based domain= option: povvldeo.* - Could not salvage rule with only entity-based domain= option: btdb.* - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.website\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - Could not salvage rule with only entity-based domain= option: databasegdriveplayer.* - Could not salvage rule with only entity-based domain= option: xtits.* - Could not salvage rule with only entity-based domain= option: animesa.* - Could not salvage rule with only entity-based domain= option: 10starhd.* - Could not salvage rule with only entity-based domain= option: hqq.* - Could not salvage rule with only entity-based domain= option: bloomberg.* - Could not salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Could not salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Could not salvage rule with only entity-based domain= option: hqq.* - Could not salvage rule with only entity-based domain= option: einthusan.* - Could not salvage rule with only entity-based domain= option: pasty.* - Could not salvage rule with only entity-based domain= option: pasty.* - Could not salvage rule with only entity-based domain= option: sms24.* - Could not salvage rule with only entity-based domain= option: viafree.* - Could not salvage rule with only entity-based domain= option: hotfrog.* - Could not salvage rule with only entity-based domain= option: goodstream.* - Could not salvage rule with only entity-based domain= option: bloomberg.* - Could not salvage rule with only entity-based domain= option: bloomberg.* - Could not salvage rule with only entity-based domain= option: bloomberg.* - Could not salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Could not salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Could not salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Could not salvage rule with only entity-based domain= option: tube8.* - Could not salvage rule with only entity-based domain= option: tvnow.* - Could not salvage rule with only entity-based domain= option: tvnow.* - Could not salvage rule with only entity-based domain= option: audible.* - Could not salvage rule with only entity-based domain= option: savethechildren.* - Could not salvage rule with only entity-based domain= option: sms24.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: viafree.* - Could not salvage rule with only entity-based domain= option: viafree.* - Could not salvage rule with only entity-based domain= option: streamingcommunity.* - Could not salvage rule with only entity-based domain= option: streamingcommunity.* - Could not salvage rule with only entity-based domain= option: filepress.* - Could not salvage rule with only entity-based domain= option: bloomberg.* - Could not salvage rule with only entity-based domain= option: itesco.*|tesco.* - Could not salvage rule with only entity-based domain= option: soap2day.* - Could not salvage rule with only entity-based domain= option: 2embed.* - Could not salvage rule with only entity-based domain= option: pussyspace.* - Could not salvage rule with only entity-based domain= option: soap2day.* - Could not salvage rule with only entity-based domain= option: slreamplay.* - Could not salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content/ - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content/ - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content/ - Unsupported regex-based removeParam: /ad/ - Unsupported regex-based removeParam: /u_h|u_his|u_w|u_ah|u_aw|u_cd|u_sd|u_tz|cookie/ - Unsupported regex-based removeParam: /^\/_ui\/desktop\/common\/js\/uiAnalytics\// - Could not salvage rule with only entity-based domain= option: 1movies.* - Could not salvage rule with only entity-based domain= option: 1movies.* - Unsupported regex-based removeParam: /^ad/ - Unsupported regex-based removeParam: /^ad/ - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Unsupported regex-based removeParam: /^((?!SMIL|formats).)*$/ - Unsupported modifier exception - Unsupported modifier exception - Could not salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - Could not salvage rule with only entity-based domain= option: torrentproject2.* - Unsupported regex-based removeParam: /^(?:correlator|f[cr-w]|p[e-sv]|[abdeg-or-x])/ - Unsupported regex-based removeParam: /^(?:correlator|f[cr-w]|p[e-sv]|u_|ga_|url|dt|adk)/ - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Could not salvage rule with only entity-based domain= option: the-voice-of-germany.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: pobre.* - Unsupported modifier exception - Could not salvage rule with only entity-based domain= option: bigkickass.*|kat.*|kat2.*|katbay.*|katfreak.*|kathydra.*|katkickass.*|katkickass.*|kattracker.*|kick4ss.*|kickass-usa.*|kickass.*|kickass2.*|kickassaustralia.*|kickassbay.*|kickassdb.*|kickassfull.*|kickassgo.*|kickasshydra.*|kickassindia.*|kickasskat.*|kickassminds.*|kickassmovies.*|kickasspk.*|kickasst.*|kickasstorrents.*|kickasstorrents2.*|kickasstracker.*|kickasstrusty.*|kickassuk.*|kickassunlocked.*|kickassz.*|kkat.*|kkickass.*|thekat.*|thekickass.*|topkickass.*|torrentkat.*|torrentskickass.* - Could not salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - Could not salvage rule with only entity-based domain= option: torrentproject2.* - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Invalid network filter in default: ||indiatimes.com^$image,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=linkneverdie.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=web.de - Invalid network filter in default: ||succeedscene.com/ads_*/ads.load.js$script,redirect-rule=noop.js - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=afreesms.com - Invalid network filter in default: *$xhr,redirect-rule=1x1.gif,domain=ign.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ignboards.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=9to5google.com|9to5mac.com|9to5toys.com|dronedj.com|electrek.co|marketrealist.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=playhydrax.com - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=freeplayervideo.com|nazarickol.com|player-cdn.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=kimcartoon.* - Invalid network filter in default: *$3p,script,redirect-rule=noopjs,domain=cbs.com|paramountplus.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=mylink.*|my1ink.*|myl1nk.*|myli3k.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=mp4upload.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=magesy.*|majesy.*|mage.si|magesypro.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=magesy.*|majesy.* - Invalid network filter in default: ||vkcdnservice.com^$script,redirect-rule=noopjs,3p - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=adbull.org - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=simply-hentai.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=arkadium.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ouo.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=viki.com - Invalid network filter in default: ||adservice.google.com^$script,redirect-rule=noopjs,domain=next-episode.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=aternos.org - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=xfreehd.com - Invalid network filter in default: ||thebookee.net^$image,redirect-rule=1x1.gif,1p - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=dubsports.to - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=freeopenvpn.org - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=spiegel.de - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=spiegel.de - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=onlinefreecourse.net - Invalid network filter in default: /ap-plugin-scripteo/frontend/img/728x90.png$image,redirect-rule=1x1.gif - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=megaup.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=strikeout.* - Invalid network filter in default: ||wpfc.ml/b.gif$image,redirect-rule=1x1.gif,domain=satcesc.com - Invalid network filter in default: ||a-ads.com^$frame,redirect-rule=noopframe,domain=dogefaucet.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=vipbox.* - Invalid network filter in default: ||ugdturner.com/xd.sjs$script,redirect-rule=noopjs,domain=nba.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=animedao.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=youmath.it - Invalid network filter in default: ||googlesyndication.com^$image,redirect-rule=1x1.gif,domain=educatiocenter.online - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=o2tvseries.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=faucetcrypto.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=duellinksmeta.com - Invalid network filter in default: *$script,domain=delcotimes.com|macombdaily.com|santacruzsentinel.com|saratogian.com|theoaklandpress.com|trentonian.com,redirect-rule=noopjs - Invalid network filter in default: *$image,domain=delcotimes.com|macombdaily.com|santacruzsentinel.com|saratogian.com|theoaklandpress.com|trentonian.com,redirect-rule=2x2.png - Invalid network filter in default: *$script,domain=ebookdz.com,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=marie-claire.es - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=serpadres.es - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=miarevista.es - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=muyhistoria.es - Invalid network filter in default: ||adblockanalytics.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=muyinteresante.es - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=linkdrop.net - Invalid network filter in default: *$image,1p,redirect-rule=1x1.gif,domain=leechpremium.link - Invalid network filter in default: @@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule,domain=leechpremium.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=mac-torrent-download.net - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=pentafaucet.com - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=3dzip.org - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=fatgirlskinny.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=canaltdt.es - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=amni8.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=audiotools.blog - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=smallseotools.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=hpjav.tv - Invalid network filter in default: *$1p,image,redirect-rule=1x1.gif,domain=rte.ie - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=6play.fr - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=youku.com - Invalid network filter in default: *#$image,domain=freshstuff4you.com,redirect-rule=2x2.png - Invalid network filter in default: *$image,domain=app.trangchu.news|azmath.info|scratch247.info,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=debilizator.tv - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule=noopjs:10,domain=simsdom.com - Invalid network filter in default: ||fautsy.com/adblock.php$xhr,redirect-rule=nooptext,1p - Invalid network filter in default: ||googlesyndication.com/pagead/show_ads.js$script,redirect-rule=noopjs,domain=iblogbox.com - Invalid network filter in default: ||ads-twitter.com/uwt.js$xhr,3p,redirect-rule=noop.txt - Invalid network filter in default: ||link-to.net^$image,redirect-rule=1x1.gif,1p - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=finobe.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=photopea.com - Invalid network filter in default: *$script,3p,domain=gsmturkey.net,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ustream.to - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=thehouseofportable.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=streameast.*|thestreameast.io - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=streameast.*|thestreameast.io - Invalid network filter in default: *$script,3p,redirect-rule=noopjs,domain=freecourseweb.com - Invalid network filter in default: *$image,domain=grafixfather.com,redirect-rule=1x1.gif - Invalid network filter in default: ||googlesyndication.com/pagead/$script,redirect-rule=noopjs,domain=freetutorialseu.com|freetutorialsus.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=linternaute.com - Invalid network filter in default: *$script,domain=vidup.io,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=tf1.fr - Invalid network filter in default: ||mairdumont.com^$script,redirect-rule=noopjs,domain=kachelmannwetter.com - Invalid network filter in default: ||md-nx.com^$script,redirect-rule=noopjs,domain=meteologix.com|weather.us - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=extremereportbot.com - Invalid network filter in default: *$script,xhr,redirect-rule=noopjs,domain=1001tracklists.com - Invalid network filter in default: *$script,3p,redirect-rule=noopjs,domain=leechall.download|leechall.com - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=script-stack.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=wstream.video - Invalid network filter in default: ||newsjizz.in^$image,redirect-rule=1x1.gif,1p - Invalid network filter in default: ||bebi.com^$script,redirect-rule=noopjs,domain=lifestylehack.info - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=unfriend-app.com - Invalid network filter in default: ||flsaudio.com^$image,redirect-rule=1x1.gif,1p - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=bluemediafiles.* - Invalid network filter in default: */assets.sidearmsports.com/$script,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=12thman.com|acusports.com|atlantic10.com|auburntigers.com|baylorbears.com|bceagles.com|bgsufalcons.com|big12sports.com|bigten.org|bradleybraves.com|butlersports.com|cmumavericks.com|conferenceusa.com|cyclones.com|dartmouthsports.com|daytonflyers.com|dbupatriots.com|dbusports.com|denverpioneers.com|fduknights.com|fgcuathletics.com|fightinghawks.com|fightingillini.com|floridagators.com|friars.com|friscofighters.com|gamecocksonline.com|goarmywestpoint.com|gobison.com|goblueraiders.com|gobobcats.com|gocards.com|gocreighton.com|godeacs.com|goexplorers.com|goetbutigers.com|gofrogs.com|gogriffs.com|gogriz.com|golobos.com|gomarquette.com|gopack.com|gophersports.com|goprincetontigers.com|gopsusports.com|goracers.com|goshockers.com|goterriers.com|gotigersgo.com|gousfbulls.com|govandals.com|gowyo.com|goxavier.com|gozags.com|gozips.com|griffinathletics.com|guhoyas.com|gwusports.com|hailstate.com|hamptonpirates.com|hawaiiathletics.com|hokiesports.com|huskers.com|icgaels.com|iuhoosiers.com|jsugamecocksports.com|longbeachstate.com|loyolaramblers.com|lrtrojans.com|lsusports.net|morrisvillemustangs.com|msuspartans.com|muleriderathletics.com|mutigers.com|navysports.com|nevadawolfpack.com|niuhuskies.com|nulakers.ca|nkunorse.com|nuhuskies.com|nusports.com|oceanbreezenyc.org|okstate.com|olemisssports.com|omavs.com|ovcsports.com|owlsports.com|purduesports.com|redstormsports.com|richmondspiders.com|sfajacks.com|shupirates.com|siusalukis.com|smcgaels.com|smumustangs.com|soconsports.com|soonersports.com|themw.com|tulsahurricane.com|txst.com|txstatebobcats.com|ubbulls.com|ucfknights.com|ucirvinesports.com|uconnhuskies.com|uhcougars.com|uicflames.com|umterps.com|uncwsports.com|unipanthers.com|unlvrebels.com|uoflsports.com|usdtoreros.com|utahstateaggies.com|utepathletics.com|utrockets.com|uvmathletics.com|uwbadgers.com|villanova.com|wkusports.com|wmubroncos.com|woffordterriers.com|1pack1goal.com|bcuathletics.com|bubraves.com|goblackbears.com|golightsgo.com|gomcpanthers.com|goutsa.com|mercerbears.com|pirateblue.com|pirateblue.net|pirateblue.org|quinnipiacbobcats.com|towsontigers.com|tribeathletics.com|tribeclub.com|utepminermaniacs.com|utepminers.com|wkutickets.com|aopathletics.org|atlantichockeyonline.com|bigsouthnetwork.com|bigsouthsports.com|chawomenshockey.com|dbupatriots.org|drakerelays.org|ecac.org|ecacsports.com|emueagles.com|emugameday.com|gculopes.com|godrakebulldog.com|godrakebulldogs.com|godrakebulldogs.net|goeags.com|goislander.com|goislanders.com|gojacks.com|gomacsports.com|gseagles.com|hubison.com|iowaconference.com|ksuowls.com|lonestarconference.org|mascac.org|midwestconference.org|mountaineast.org|niu-pack.com|niuhuskies.com|oswegolakers.com|ovcdigitalnetwork.com|pacersports.com|rmacsports.org|rollrivers.com|samfordsports.com|uncpbraves.com|usfdons.com|wiacsports.com|alaskananooks.com|broncathleticfund.com|cameronaggies.com|columbiacougars.com|etownbluejays.com|gobadgers.ca|golancers.ca|gometrostate.com|gothunderbirds.ca|kentstatesports.com|lehighsports.com|lopers.com|lycoathletics.com|lycomingathletics.com|maraudersports.com|mauiinvitational.com|msumavericks.com|nauathletics.com|nueagles.com|nwusports.com|patriotathleticfund.com|pittband.com|principiaathletics.com|roadrunnersathletics.com|sidearmsocial.com|snhupenmen.com|stablerarena.com|stoutbluedevils.com|uwlathletics.com|yumacs.com|collegefootballplayoff.com|csurams.com|cubuffs.com|gobearcats.com|gohuskies.com|mgoblue.com|osubeavers.com|pittsburghpanthers.com|rolltide.com|texassports.com|thesundevils.com|uclabruins.com|wvuathletics.com|wvusports.com|arizonawildcats.com|calbears.com|cuse.com|georgiadogs.com|goducks.com|goheels.com|insidekstatesports.com|insidekstatesports.info|insidekstatesports.net|insidekstatesports.org|k-stateathletics.com|k-statefootball.net|k-statefootball.org|k-statesports.com|k-statesports.net|k-statesports.org|k-statewomenshoops.com|k-statewomenshoops.net|k-statewomenshoops.org|kstateathletics.com|kstatefootball.net|kstatefootball.org|kstatesports.com|kstatewomenshoops.com|kstatewomenshoops.net|kstatewomenshoops.org|ksuathletics.com|ksusports.com|scarletknights.com|showdownforrelief.com|syracusecrunch.com|texastech.com|theacc.com|ukathletics.com|usctrojans.com|utahutes.com|utsports.com|wsucougars.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=animeshouse.net - Invalid network filter in default: *$media,redirect-rule=noop-0.1s.mp3,3p,domain=gmx.*|web.de - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$xhr,redirect-rule=noopjs,domain=adshrink.it - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=turkanime.* - Invalid network filter in default: *$frame,domain=forum.release-apk.com,redirect-rule=noopframe - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=forum.release-apk.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=freevocabulary.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=hentaihaven.xxx - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$redirect-rule=googlesyndication_adsbygoogle.js,script,domain=arabseed.* - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=jmusic.me,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=btik.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=work.ink - Invalid network filter in default: *$script,domain=work.ink,redirect-rule=noopjs - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=sznlink.xyz - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=camera.aeonax.com - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=audioblog.com - Invalid network filter in default: *$script,redirect-rule=empty,domain=streamz.vg|streamzz.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=texviewer.herokuapp.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect-rule=noopjs,domain=881903.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=myschool-eng.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ehubsoft.herokuapp.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=onemanhua.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=laksa19.github.io - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=kurnasional.blogspot.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=puregym.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=tgbeautymedia.blogspot.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=sportif.id - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=motorsport.tv - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=allkaicerteam.com - Invalid network filter in default: *$image,redirect-rule=2x2.png,domain=redbox.com - Invalid network filter in default: *$xhr,redirect-rule=noop.txt,domain=tunein.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=luscious.net - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=vidlii.com - Invalid network filter in default: *$image,redirect-rule=2x2.png,domain=mobilelegends.shop - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=onehack.us - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=savesubs.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=duit.cc|ockles.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=olinevid.com - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$xhr,redirect-rule=noopjs,domain=btgyama.blogspot.com - Invalid network filter in default: *$script,domain=btgyama.blogspot.com,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=thumpertalk.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=promo-visits.site|satoshi-win.xyz|shorterall.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=bigbrothercanada.ca - Invalid network filter in default: *$script,1p,redirect-rule=noopjs,domain=pstream.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=onbatch.my.id - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=fishki.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=pandora.com - Invalid network filter in default: *$xhr,3p,redirect-rule=nooptext,domain=podu.me - Invalid network filter in default: */ads$media,redirect-rule=noopmp3-0.1s,domain=podu.me - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=apps2app.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=download.web.id - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=thisav.com - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,xhr,redirect-rule=googlesyndication_adsbygoogle.js:5,domain=~zipextractor.app - Invalid network filter in default: ||googleads.g.doubleclick.net/$xhr,redirect-rule=nooptext - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=arcai.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=lumiafirmware.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=my-code4you.blogspot.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=made-by.org - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=akunssh.net - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=desktophut.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=desktophut.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=dropgalaxy.com|techthematter.xyz - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=dropgalaxy.com|techthematter.xyz - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=dropgalaxy.*|financemonk.net|techthematter.xyz - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=dropgalaxy.*|financemonk.net|techthematter.xyz - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=runmods.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=minorpatch.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=sythe.org - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=tapetus.pl - Invalid network filter in default: *$media,redirect-rule=noopmp3-0.1s,domain=eroasmr.com - Invalid network filter in default: ||oklivetv.com^$xhr,1p,redirect-rule=nooptext - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=oklivetv.com - Invalid network filter in default: ||doubleclick.net^$frame,redirect-rule=noopframe,domain=cpu-world.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=freebinchecker.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=bandab.com.br - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=animesanka.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=sms24.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=hhkungfu.tv - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=pricez.co.il - Invalid network filter in default: ||tv3play.skaties.lv/static/scripts/ima3.js^$script,redirect-rule=noopjs,domain=skaties.lv - Invalid network filter in default: ||tv3play.skaties.lv/static/scripts/trackdb/events.gif^$image,redirect-rule=1x1.gif,domain=skaties.lv - Invalid network filter in default: ||mssl.fwmrm.net/libs/adm/6.11.0/LinkTag2.js^$redirect-rule=noopjs,script,domain=skaties.lv - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=onlinecoursebay.com,redirect-rule=noopjs - Invalid network filter in default: *$xhr,domain=megainteresting.com,redirect-rule=nooptext - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=pcprogramasymas.* - Invalid network filter in default: ||static.adsafeprotected.com/vans-adapter-google-ima.js$script,redirect-rule=noopjs,domain=motortrend.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=siamblockchain.com - Invalid network filter in default: *$object,redirect-rule=noopframe,domain=larvelfaucet.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=booogle.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=dcode.fr - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=ctrlv.* - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,domain=coursevania.com,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=katholisches.info - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=atozmath.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=supreme-gamers.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=puressh.net - Invalid network filter in default: *$image,redirect-rule=2x2.png,domain=tel-emporio10.blogspot.com - Invalid network filter in default: *$xhr,domain=indianwebseries.*,redirect-rule=nooptext - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=dynast.io - Invalid network filter in default: *$script,domain=outerspace.com.br,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noop.js,domain=flowsoft7.com - Invalid network filter in default: *$xhr,3p,redirect-rule=nooptext,domain=simkl.com - Invalid network filter in default: *$script,3p,redirect-rule=noopjs,domain=simkl.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=sorasi.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=monara.net - Invalid network filter in default: *$script,domain=ad-doge.com,redirect-rule=noopjs - Invalid network filter in default: ||delivery.adrecover.com^$image,redirect-rule=1x1.gif - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=nulleb.com - Invalid network filter in default: *$script,3p,redirect-rule=noopjs,domain=staples.ca - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=iinbinlist.com|osqa.net|vanhawks.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=speedtesting.herokuapp.com|excelviewer.herokuapp.com|exifviewer.herokuapp.com|pdfrecover.herokuapp.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=purposegames.com - Invalid network filter in default: *$image,redirect-rule=32x32.png,domain=bitfly.io - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=downloadrepack.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=danc.uk - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=vuiit.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=seotechman.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=markiza.sk - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=linuxgizmos.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=humannootropicsindex.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=iammagnus.com|dailyvideoreports.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=youneed.win - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=freesslvpn.us|robotvpn.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=maskinbladet.dk|fritidsmarkedet.dk - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=polska-ie.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=vidmoly.me|vidmoly.net|vidmoly.to - Invalid network filter in default: *$script,domain=evoload.io,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ufckhabib.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=muynegociosyeconomia.es - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=unityassets4free.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=lewdninja.com|new.lewd.ninja - Invalid network filter in default: ||advertserve.com/servlet/view/banner/$frame,redirect-rule=noop.html,domain=trk-imps.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=davidbaptistechirot.blogspot.com - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=pngtosvg.com - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=sitarchive.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=telek.top - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=thevideos.ga - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=codimth.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=fiyaplatform.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=taufiqhdyt.com - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=mr9soft.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=getitall.top - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=freemagazines.top - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=anihub.tv - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=konnoznet.xyz - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=examsnet.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=hitbits.io - Invalid network filter in default: ||adsafeprotected.com/vans-adapter-google-ima.js^$redirect-rule=noopjs,script,domain=unilad.co.uk - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=topnewsshow.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=rollercoin.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=windowsmatters.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=masbrooo.com|2ndrun.tv - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=fr.de - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=kursors.lv - Invalid network filter in default: *$script,domain=gainbtc.*,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ghostsnet.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=fashion.noemoda.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=fashion.noemoda.com - Invalid network filter in default: *$script,domain=novelmultiverse.com,redirect-rule=noopjs - Invalid network filter in default: ||api.adinplay.com^$redirect-rule=noopjs,script,domain=taming.io - Invalid network filter in default: *$image,3p,redirect-rule=1x1.gif,domain=world4.eu - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=cybermania.ws - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=pinoyalbums.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=jnckmedia.com - Invalid network filter in default: ||googletagmanager.com/gtag/js^$redirect-rule=google-analytics_analytics.js,domain=guardaserie.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=cryptojunkie.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=vpnstunnel.com - Invalid network filter in default: ||googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule=noop.js,domain=anidraw.net - Invalid network filter in default: ||static.adsafeprotected.com/vans-adapter-google-ima.js^$script,redirect-rule=noopjs,domain=sportbible.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=telegraf.rs|telegraf.tv - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=cozinha.minhasdelicias.com - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/show_ads.js^$script,redirect-rule=noopjs,domain=thetimetube.com - Invalid network filter in default: ||googleads.g.doubleclick.net/pagead/$xhr,redirect-rule=nooptext,domain=danshort.com - Invalid network filter in default: ||evolok.net/*/authorize/*$xhr,redirect-rule=nooptext,domain=nation.africa - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/$redirect-rule=noopjs,script,domain=overbits.herokuapp.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=pewgame.com - Invalid network filter in default: ||raw.githubusercontent.com/*/just-detect-adblock/*$3p,xhr,redirect-rule=nooptext - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$redirect-rule=googlesyndication_adsbygoogle.js,script,domain=crypto-fun-faucet.de - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$redirect-rule=googlesyndication_adsbygoogle.js,script,domain=unityassetcollection.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=claimfreebits.com - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$redirect-rule=googlesyndication_adsbygoogle.js,script,domain=persianhive.com - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$redirect-rule=googlesyndication_adsbygoogle.js,script,domain=andreyex.ru - Invalid network filter in default: ||sentry-cdn.com^$script,redirect-rule=noopjs,domain=mcmfaucets.xyz - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=rechub.tv - Invalid network filter in default: ||googletagmanager.com/gtag/js$script,redirect-rule=noopjs,domain=rotana.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=ver-television.online - Invalid network filter in default: ||antiblock.b-cdn.net/banner_ad.png$image,redirect-rule=1x1.gif,domain=getpaidstock.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=getpaidstock.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=upvideo.to - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=simplebits.io - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=costumbresmexico.com - Invalid network filter in default: ||adsafeprotected.com/$script,redirect-rule=noopjs,domain=gamingbible.co.uk - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=chiemgau24.de|ovb-online.de|rosenheim24.de|bgland24.de|innsalzach24.de|mangfall24.de|wasserburg24.de - Invalid network filter in default: ||iclickcdn.com^$script,redirect-rule=noopjs,domain=gifans.com - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=streamon.to - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=streamon.to - Invalid network filter in default: ||doubleclick.net^$xhr,redirect-rule=nooptext,domain=liveschauen.com - Invalid network filter in default: ||googleads.g.doubleclick.net^$xhr,redirect-rule=nooptext,domain=weltwebcams.com - Invalid network filter in default: ||sentry-cdn.com^$script,redirect-rule=noopjs,domain=freebitz.xyz - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js^$script,redirect-rule=noopjs,domain=gbnews.uk - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=cinemakottaga.ml - Invalid network filter in default: ||explosivemenu.com^$image,redirect-rule=1x1.gif,1p - Invalid network filter in default: host-cdn.net^$image,redirect-rule=32x32.png,domain=maxstream.video - Invalid network filter in default: @@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$xhr,redirect-rule,domain=carousell.* - Invalid network filter in default: ||sentry-cdn.com^$script,redirect-rule=noopjs,domain=phoenixfaucets.xyz|proinfinity.fun - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js^$script,redirect-rule=noopjs,domain=howstuffworks.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=userload.* - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/$script,redirect-rule=noopjs,domain=timesnowhindi.com|tvid.in - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=shaalaa.com - Invalid network filter in default: ||doubleclick.net/tag/js/gpt.js$xhr,redirect-rule=noop.txt,domain=link.rota.cc - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=elahmad.com - Invalid network filter in default: *$redirect-rule=noopjs,script,domain=elahmad.com - Invalid network filter in default: /images/ads.$image,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=rbxscripts.xyz - Invalid network filter in default: ||adbox.lv^$script,redirect-rule=noop.js,domain=mail.ee - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=bowfile.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=bowfile.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=bowfile.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js^$script,redirect-rule=noopjs,domain=plex.tv - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=1cloudfile.com - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=1cloudfile.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect-rule=noopjs,domain=loomi.tv - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=freevpn4you.net - Invalid network filter in default: /px.gif?$image,redirect-rule=1x1.gif - Invalid network filter in default: ||cse.google.com/adsense/search/async-ads.js$xhr,redirect-rule=noop.txt,domain=asiaon.top - Invalid network filter in default: *$script,domain=miraculous.to,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=paraphrasetool.com - Invalid network filter in default: *$image,domain=upshrink.com,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=romania.bz - Invalid network filter in default: /banner.gif?$image,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=wyze.com,redirect-rule=noopjs - Invalid network filter in default: /reclama/ads.js$script,redirect-rule=prebid-ads.js - Invalid network filter in default: *$object,redirect-rule=empty,domain=sonixgvn.net - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=zwielkopolski24.pl - Invalid network filter in default: ||d2klx87bgzngce.cloudfront.net/jquery.swipebox.min.js$xhr,domain=filmisub.com,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=coin-free.com|kienthucrangmieng.com|techmart4u.in|chinhnhacoban.com|chamcuuhoc.com|hocchannuoi.com|thuocdangian.net|hoclamdaubep.com|tai-mui-hong.com|95news.com|vnpttelle.com|dhlgame.com|nhacremix.biz|hynews.biz|fanclup.info - Invalid network filter in default: ||adclixx.net^$script,3p,redirect-rule=nobab2.js:10 - Invalid network filter in default: ||adnetasia.com^$script,3p,redirect-rule=nobab2.js:10 - Invalid network filter in default: ||adtrackers.net^$script,3p,redirect-rule=nobab2.js:10 - Invalid network filter in default: ||bannertrack.net^$script,3p,redirect-rule=nobab2.js:10 - Invalid network filter in default: ||ads.twitter.com/favicon.ico$image,3p,redirect-rule=32x32.png - Invalid network filter in default: ||advertising.yahoo.com/favicon.ico$image,3p,redirect-rule=32x32.png - Invalid network filter in default: ||doubleclickbygoogle.com/favicon.ico$image,3p,redirect-rule=32x32.png - Invalid network filter in default: ||google.com/adsense/start/images/favicon.ico$image,3p,redirect-rule=32x32.png - Invalid network filter in default: ||gstatic.com/adx/doubleclick.ico$image,3p,redirect-rule=32x32.png - Invalid network filter in default: /ads-prebid.js$script,redirect-rule=prebid-ads.js - Invalid network filter in default: /prebid-ads.js$script,redirect-rule=prebid-ads.js,domain=~exey.io - Invalid network filter in default: /prebid-ads/adsensebase.js$script,redirect-rule=prebid-ads.js - Invalid network filter in default: /prebid-article-ad-ad-300x250.js$script,redirect-rule=prebid-ads.js - Invalid network filter in default: ||doubleclick.net^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||media.fastclick.net^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||ads.facebook.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||advice-ads.s3.amazonaws.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||ads.youtube.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||ads.reddit.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||ads-api.twitter.com^$xhr,redirect-rule=nooptext,domain=~twitter.com - Invalid network filter in default: ||ads.pinterest.com^$xhr,redirect-rule=noop.txt - Invalid network filter in default: ||www.sfr.fr^$script,redirect-rule=noop.js,domain=red-by-sfr.fr - Invalid network filter in default: *$image,redirect-rule=2x2.png,domain=searchenginereports.net - Invalid network filter in default: ||geoplugin.net^$xhr,redirect-rule=noop.txt,domain=taotronics.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=upvizzz.xyz - Invalid network filter in default: *$frame,domain=noviny.sk,redirect-rule=noopframe - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=masterduelmeta.com - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=stol.it - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=pinoyfaucet.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=crunchyscan.fr - Invalid network filter in default: ||googletagmanager.com^$script,redirect-rule=noopjs,domain=gainbtc.click|multiclaim.net|proinfinity.fun - Invalid network filter in default: ||googletagmanager.com/gtag/js$script,xhr,redirect-rule=googletagmanager_gtm.js:5 - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=faucetpot.me - Invalid network filter in default: *$xhr,redirect-rule=noop.txt,domain=thingiverse.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=mrlabtest.com - Invalid network filter in default: *$script,domain=multiclaim.net,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=vimm.net - Invalid network filter in default: *$script,domain=surfline.com,redirect-rule=noopjs - Invalid network filter in default: *.png#$image,redirect-rule=1x1.gif - Invalid network filter in default: *.gif#$image,redirect-rule=1x1.gif - Invalid network filter in default: *.jpg#$image,redirect-rule=1x1.gif - Invalid network filter in default: *.svg#$image,redirect-rule=1x1.gif - Invalid network filter in default: ||doubleclick.net^$xhr,redirect-rule=nooptext,domain=soccerstreams-100.* - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=gamingfactor.xyz - Invalid network filter in default: *$image,domain=play.tv3.lv,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=play.tv3.lv,redirect-rule=noopjs - Invalid network filter in default: *$image,domain=play.tv3.lt,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=play.tv3.lt,redirect-rule=noopjs - Invalid network filter in default: *$image,domain=play.tv3.ee,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=play.tv3.ee,redirect-rule=noopjs - Invalid network filter in default: ||vlitag.com^$script,redirect-rule=noopjs,domain=mangasco.com - Invalid network filter in default: ||sumfaucet.com/adblock.php$xhr,redirect-rule=nooptext,1p - Invalid network filter in default: ||media.net^$object,redirect-rule=noopjs - Invalid network filter in default: ||google-analytics.com^$object,redirect-rule=noopjs - Invalid network filter in default: ||doubleclick.net^$object,redirect-rule=noopjs - Invalid network filter in default: ||secure.quantserve.com^$object,redirect-rule=noopjs - Invalid network filter in default: ||amazon-adsystem.com^$object,redirect-rule=noopjs - Invalid network filter in default: ||ssl.geoplugin.net/javascript.gp$xhr,redirect-rule=noopjs - Invalid network filter in default: *#*/ad/$image,redirect-rule=1x1.gif - Invalid network filter in default: ||a-ads.com^$xhr,redirect-rule=nooptext,domain=ezcoin.it - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=elkjop.no - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=madtrx.fun - Invalid network filter in default: *$script,domain=freesolana.top,redirect-rule=noopjs - Invalid network filter in default: ||surfe.pro/js/net.js$script,xhr,redirect-rule=noop.js - Invalid network filter in default: *$media,redirect-rule=noopmp3-0.1s,domain=149.56.24.226 - Invalid network filter in default: ||static.doubleclick.net/instream/ad_status.js$xhr,redirect-rule=noop.js,domain=sshinjector.net - Invalid network filter in default: ||googlesyndication.com^$script,redirect-rule=noopjs,domain=youfiles.herokuapp.com - Invalid network filter in default: /prebid-add.js$script,redirect-rule=prebid-ads.js - Invalid network filter in default: ||cxense.com/cx.$script,redirect-rule=noop.js,domain=japannews.yomiuri.co.jp - Invalid network filter in default: *$script,domain=discuss.com.hk,redirect-rule=noopjs - Invalid network filter in default: @@||g.doubleclick.net/tag/js/gpt.js$script,redirect-rule,domain=pomponik.pl - Invalid network filter in default: *$xhr,script,domain=tamrieltradecentre.com,redirect-rule=noopjs - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=tamrieltradecentre.com - Invalid network filter in default: ||matystudios.github.io/banner_ad.png$image,redirect-rule=2x2.png - Invalid network filter in default: ||www3.doubleclick.net^$xhr,redirect-rule=noop.txt,domain=lineups.fun - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=vogel.de|elektronikpraxis.de - Invalid network filter in default: *$script,domain=tieutietkiem.com,redirect-rule=noopjs - Invalid network filter in default: *$frame,domain=adclickersbot.com,redirect-rule=noopframe - Invalid network filter in default: *$image,domain=adclickersbot.com,redirect-rule=1x1.gif - Invalid network filter in default: ||scripts.cleverwebserver.com^$script,redirect-rule=noop.js - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=allcryptoz.net|crewbase.net|crewus.net|shinbhu.net|shinchu.net|thumb8.net|thumb9.net|topcryptoz.net|uniqueten.net|ultraten.net - Invalid network filter in default: *$script,domain=faucetbtc.net,redirect-rule=noopjs - Invalid network filter in default: ||googletagmanager.com^$xhr,domain=streamingcommunity.*,redirect-rule=noop.js - Invalid network filter in default: ||thaudray.com^$script,xhr,redirect-rule=noop.js,domain=streamingcommunity.* - Invalid network filter in default: *$script,domain=lightnovelworld.com,redirect-rule=noop.js - Invalid network filter in default: ||pagead2.googlesyndication.com/pagead/show_ads.js$xhr,redirect-rule=noop.js,domain=spinbot.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=easymc.io - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=feyorra.site - Invalid network filter in default: *$script,domain=doge25.in,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=btcbunch.com - Invalid network filter in default: *$script,xhr,domain=intibia.com,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=pianoweb.fr,redirect-rule=noopjs - Invalid network filter in default: ||doubleclick.net^$frame,redirect-rule=noopframe,domain=play.aidungeon.io - Invalid network filter in default: ||bmfads.com^$script,redirect-rule=noopjs - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect-rule=noopjs,domain=ksl.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect-rule=noopjs,domain=liveone.com - Invalid network filter in default: *$xhr,script,redirect-rule=noopjs,domain=freemcserver.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=freemcserver.net - Invalid network filter in default: *$3p,xhr,redirect-rule=noop.txt,domain=mangahosted.com - Invalid network filter in default: ||realsrv.com^$xhr,redirect-rule=noop.txt,domain=koushoku.org - Invalid network filter in default: *$3p,script,redirect-rule=noop.js,domain=koushoku.org - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=sprawdzwegiel.pl - Invalid network filter in default: ||nitropay.com/1.gif?$image,3p,redirect-rule=1x1.gif - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=ygosu.com|loawa.com|feedclick.net|algumon.com|sportalkorea.com|ondemandkorea.com - Invalid network filter in default: *$script,xhr,redirect-rule=noopjs,domain=ygosu.com|loawa.com|feedclick.net|algumon.com|sportalkorea.com|ondemandkorea.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=ygosu.com|loawa.com|feedclick.net|algumon.com|sportalkorea.com|ondemandkorea.com - Invalid network filter in default: /player/player_ads.html?advertising_id=$frame,1p,redirect-rule=noop.html - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=cryptowidgets.net|wiki-topia.com - Invalid network filter in default: ||officepoolstop.com/images/ads/*$image,1p,redirect-rule=1x1.gif - Invalid network filter in default: ||nautiljon.com/static/js/adblock_detector.js$script,redirect-rule=noopjs - Invalid network filter in default: ||googlesyndication.com/favicon.ico$image,redirect-rule=1x1.gif - Invalid network filter in default: ||yieldmo.com^$script,redirect-rule=noopjs,domain=cloudcomputingtopics.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=freebinance.top - Invalid network filter in default: ||porno365.bingo^$image,1p,redirect-rule=1x1.gif - Invalid network filter in default: ||thothd.com^$image,1p,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=insurancegold.in - Invalid network filter in default: ||imasdk.googleapis.com^$script,redirect-rule=noopjs,domain=panhandle.newschannelnebraska.com - Invalid network filter in default: ||thisiswaldo.com/static/js$script,redirect-rule=noop.js - Invalid network filter in default: ||cloudfront.net/prebid_$script,redirect-rule=noop.js - Invalid network filter in default: /^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-5]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$/$script,redirect-rule=noop.js - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=haxina.com - Invalid network filter in default: ||coinzillatag.com^$script,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=bitcotasks.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=freelitecoin.top|freetron.top - Invalid network filter in default: *$script,domain=faucetcrypto.net,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=short.freeltc.top,redirect-rule=noopjs - Invalid network filter in default: *$image,domain=my.optikservers.com,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=criptoshark.com,redirect-rule=noopjs - Invalid network filter in default: *$script,xhr,domain=hatecoin.me,redirect-rule=noopjs - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=anydebrid.com|hotdebrid.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=anydebrid.com|hotdebrid.com - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=hacksnation.com - Invalid network filter in default: ||imasdk.googleapis.com^$script,redirect-rule=noopjs,domain=mynorthwest.com - Invalid network filter in default: *$script,domain=adshnk.com,redirect-rule=noopjs - Invalid network filter in default: ||npttech.com/advertising.js$script,redirect-rule=noop.js - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=ssbsblg.blogspot.com - Invalid network filter in default: *$3p,script,redirect-rule=noop.js,domain=toolxox.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=nobitafc.com - Invalid network filter in default: ||js.wpadmngr.com/static/adManager.js$script,redirect-rule=noopjs - Invalid network filter in default: ||mail-ads.google.com^$xhr,domain=rxd-mods.xyz,redirect-rule=nooptext - Invalid network filter in default: ||ad.71i.de/somtag/config/$script,redirect-rule=noopjs,domain=sat1.de|wetter.com - Invalid network filter in default: *$script,redirect-rule=noop.js,domain=soranews24.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=soranews24.com - Invalid network filter in default: ||tpc.googlesyndication.com^$image,redirect-rule=1x1.gif,domain=soranews24.com - Invalid network filter in default: @@||amazon-adsystem.com/aax2/apstag.js$script,redirect-rule,domain=youpouch.com - Invalid network filter in default: *$script,domain=termux.xyz,redirect-rule=noopjs - Invalid network filter in default: ||adoto.net/dashboard/display/items.php$xhr,redirect-rule=nooptext - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=cloud-computing-central.com - Invalid network filter in default: *$script,domain=blog.freeoseocheck.com|blog.coinscap.info|blog.cookinguide.net,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=koamnewsnow.com,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=manga-oni.com,redirect-rule=noopjs - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=dobreprogramy.pl,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=grabcrypto.co,redirect-rule=noopjs - Invalid network filter in default: ||mstm.motorsport.com^$script,1p,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=rendimentibtp.it,redirect-rule=noopjs - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=rocketnews24.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=kruidvat.nl - Invalid network filter in default: ||jsdelivr.net^*/fp.min.js$script,redirect-rule=fingerprint3.js:10 - Invalid network filter in default: @@||google-analytics.com/ga.js$script,redirect-rule,domain=download-chromium.appspot.com - Invalid network filter in default: ||googlesyndication.com/safeframe/*/container.html$frame,redirect-rule=noop.html,domain=los40.com - Invalid network filter in default: ||assets.adobedtm.com/*/satelliteLib$script,redirect-rule=noopjs,domain=8world.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,redirect-rule=noopjs,domain=8world.com - Invalid network filter in default: ||player.ooyala.com^$script,redirect-rule=noopjs,domain=8world.com - Invalid network filter in default: ||amazonaws.com^$xhr,redirect-rule=nooptext,domain=viu.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js^$script,redirect-rule=noopjs,domain=ilmeteo.it - Invalid network filter in default: ||px.moatads.com/pixel.gif$image,domain=abcya.com,redirect-rule=1x1.gif - Invalid network filter in default: ||amazon-adsystem.com/*/apstag.js$script,redirect-rule=amazon_apstag.js - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=play.cadenaser.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=corriere.it - Invalid network filter in default: ||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager_gtm.js,domain=asmhentai.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=hopkinssports.com - Invalid network filter in default: *$script,domain=larena.it,redirect-rule=noopjs - Invalid network filter in default: *$xhr,redirect-rule=noopjs,domain=themeslide.com - Invalid network filter in default: ||doubleclick.net/tag/js/gpt.js$script,redirect-rule=googletagservices_gpt.js,domain=aristeguinoticias.com - Invalid network filter in default: ||doubleclick.net/tag/js/gpt.js$script,redirect-rule=googletagservices_gpt.js,domain=usnews.com - Invalid network filter in default: ||otaserve.net^$frame,redirect-rule=noop.html,domain=chan.sankakucomplex.com - Invalid network filter in default: ||securepubads.g.doubleclick.net/tag/js/gpt.js^$script,redirect-rule=googletagservices_gpt.js,domain=pimylifeup.com - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule=google-analytics.com/analytics.js,domain=indigenousoap.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=seeitlive.co - Invalid network filter in default: ||static.adsafeprotected.com/vans-adapter-google-ima.js^$script,redirect-rule=noopjs,domain=tyla.com - Invalid network filter in default: ||epimg.net/t.gif$image,redirect-rule=1x1.gif,domain=as.com - Invalid network filter in default: ||news38.de/resources/*$image,1p,redirect-rule=1x1.gif - Invalid network filter in default: @@||securepubads.g.doubleclick.net/tag/js/gpt.js$script,redirect-rule,domain=golf.com - Invalid network filter in default: ||assets.revistavanityfair.es/images/transparent_pixel.gif$image,1p,redirect-rule=1x1.gif - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=animalchannel.co|homehacks.co|parentingisnteasy.co|seeitlive.co|spotlightstories.co - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=bela.gifts - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=lingvolive.com - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule=google-analytics.com/analytics.js,domain=ultimateclassicrock.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager.com/gtm.js,domain=ultimateclassicrock.com - Invalid network filter in default: ||google-analytics.com/analytics.js$script,redirect-rule=noopjs,domain=hudsonvalleypost.com|seacoastcurrent.com|popcrush.com,important - Invalid network filter in default: ||googletagmanager.com/gtm.js$script,redirect-rule=noopjs,domain=hudsonvalleypost.com|seacoastcurrent.com|popcrush.com,important - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,3p,redirect-rule,domain=k2radio.com|kowb1290.com|koel.com|loudwire.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,3p,redirect-rule,domain=k2radio.com|kowb1290.com|koel.com|loudwire.com - Invalid network filter in default: @@||googletagmanager.com^$redirect-rule,domain=invisibleoranges.com|nj1015.com|tasteofcountry.com|wyrk.com|xxlmag.com - Invalid network filter in default: @@||google-analytics.com^$redirect-rule,domain=invisibleoranges.com|nj1015.com|tasteofcountry.com|wyrk.com|xxlmag.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js^$script,redirect-rule=noopjs,domain=weather.com - Invalid network filter in default: ||clustrmaps.com^$image,redirect-rule=1x1.gif - Invalid network filter in default: @@||amazon-adsystem.com/*/apstag.js$script,redirect-rule=amazon_apstag.js,domain=video.sky.it - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager.com/gtm.js,domain=autotrader.ca - Invalid network filter in default: ||wdr.de/*/tracker/tracker.min.js$script,redirect-rule=noop.js,domain=sportschau.de - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=corsair.com - Invalid network filter in default: @@||securepubads.g.doubleclick.net/tag/js/gpt.js$script,redirect-rule,domain=gamedeveloper.com - Invalid network filter in default: @@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule,domain=heim.jp - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=mf-realty.jp - Invalid network filter in default: ||cloudflare.com/cdn-cgi/trace$xhr,3p,redirect-rule=noop.txt,domain=~funimation.com|~1bit.space|~1bitspace.com - Invalid network filter in default: ||d2r1yp2w7bby2u.cloudfront.net/js/localforage.min.js$script,redirect-rule=noopjs,domain=sonyliv.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule,domain=simon.com - Invalid network filter in default: ||natureetdecouvertes.com^$1p,image,redirect-rule=2x2.png - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule,domain=nordvpn.com - Invalid network filter in default: @@||cloudflare.com/cdn-cgi/trace$xhr,redirect-rule=noop.txt,domain=benchmarkuniverse.com - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=sammobile.com - Invalid network filter in default: ||prebid.elespectador.com^$script,redirect-rule=googletagservices_gpt.js,1p,important - Invalid network filter in default: ||rudaw.net/images/$image,1p,redirect-rule=1x1.gif,important - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule=google-analytics.com/analytics.js,domain=layrite.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager.com/gtm.js,domain=aeriagames.com - Invalid network filter in default: *$script,redirect-rule=noop.js,domain=nissan.co.jp - Invalid network filter in default: ||dan-ball.jp/*.gif$image,redirect-rule=1x1.gif - Invalid network filter in default: *$image,domain=asfan.as.com,redirect-rule=1x1.gif - Invalid network filter in default: ||booking.rm.dk/selvbooking/*/analytics/*$xhr,1p,redirect-rule=nooptext - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule=google-analytics.com/analytics.js:5,domain=stern.de - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager_gtm.js:5,domain=stern.de - Invalid network filter in default: ||elpais.com/t.gif$image,1p,redirect-rule=1x1.gif,important - Invalid network filter in default: ||tag.atom.gamedistribution.com^$xhr,redirect-rule=nooptext,1p - Invalid network filter in default: @@||googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule,domain=html5.gamedistribution.com - Invalid network filter in default: ||hits.informer.com/log.php$image,domain=funny.pho.to,redirect-rule=1x1.gif - Invalid network filter in default: @@/prebid-ads/adsensebase.js$script,redirect-rule=prebid-ads.js,domain=darkreading.com - Invalid network filter in default: *$frame,domain=mcrypto.club|luckydice.net,redirect-rule=noopframe - Invalid network filter in default: ||cryptocoinsad.com/ads/show.php$frame,redirect-rule=noop.html - Invalid network filter in default: ||wpfc.ml^$image,redirect-rule=1x1.gif,domain=thestoryexchange.org - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager_gtm.js:5,domain=ebay-kleinanzeigen.de - Invalid network filter in default: *$image,domain=novelgames.com,redirect-rule=1x1.gif - Invalid network filter in default: *$script,domain=novelgames.com,redirect-rule=noopjs - Invalid network filter in default: *$xhr,domain=novelgames.com,redirect-rule=nooptext - Invalid network filter in default: @@||securepubads.g.doubleclick.net/tag/js/gpt.js$script,redirect-rule=googletagservices_gpt.js:5,domain=olx.pt - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule=google-analytics.com/analytics.js:5,domain=xeroshoes.com - Invalid network filter in default: @@||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager_gtm.js:5,domain=xeroshoes.com - Invalid network filter in default: @@||googletagmanager.com/gtm.js$script,redirect-rule=googletagmanager_gtm.js:5,domain=xeroshoes.com - Invalid network filter in default: @@||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager_gtm.js:5,domain=myshows.me - Invalid network filter in default: @@||googletagservices.com/tag/js/gpt.js$script,redirect-rule,domain=thedailybeast.com - Invalid network filter in default: ||imasdk.googleapis.com/js/sdkloader/ima3.js$script,domain=ultimedia.com,redirect-rule=noopjs - Invalid network filter in default: @@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect-rule,domain=amachamusic.chagasi.com - Invalid network filter in default: @@||amazon-adsystem.com/*/apstag.js$script,redirect-rule,domain=weather.com - Invalid network filter in default: @@||securepubads.g.doubleclick.net/tag/js/gpt.js$script,redirect-rule,domain=honestjohn.co.uk - Invalid network filter in default: @@||googletagmanager.com/gtag/js$script,redirect-rule,domain=contactpoints.org - Invalid network filter in default: ||encar.com/js/*/analytics.js$script,1p,redirect-rule=noop.js - Invalid network filter in default: @@||google-analytics.com/analytics.js$script,redirect-rule,domain=youtube.videodeck.net - Invalid network filter in default: ||samash.com^$script,redirect-rule=noopjs - Invalid network filter in default: ||arcgis.com/apps/instant/node_modules/templates-common-library/structuralFunctionality/telemetry/AppMeasurement.js$script,1p,redirect-rule=noopjs - Invalid network filter in default: *$script,domain=wp.pl|money.pl|o2.pl|parenting.pl|pudelek.pl|autokult.pl|gadzetomania.pl|fotoblogia.pl|komorkomania.pl|polygamia.pl|abczdrowie.pl,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=rjno1.com - Invalid network filter in default: *$image,domain=fcdn.lauta.media,redirect-rule=32x32.png - Invalid network filter in default: ||adform.net^$domain=fcdn.lauta.media,script,xhr,redirect-rule=noopjs - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=promo-visits.site|satoshi-win.xyz|shorterall.com - Invalid network filter in default: ||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager_gtm.js:10,domain=satoshi-win.xyz - Invalid network filter in default: ||id5-sync.com^$image,redirect-rule=1x1.gif,domain=satoshi-win.xyz - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=allcryptoz.net|crewbase.net|crewus.net|shinbhu.net|shinchu.net|thumb8.net|thumb9.net|topcryptoz.net|uniqueten.net|ultraten.net - Invalid network filter in default: *$xhr,redirect-rule=nooptext,domain=allcryptoz.net|crewbase.net|crewus.net|shinbhu.net|shinchu.net|thumb8.net|thumb9.net|topcryptoz.net|uniqueten.net|ultraten.net - Invalid network filter in default: *$image,redirect-rule=1x1.gif,domain=allcryptoz.net|crewbase.net|crewus.net|shinbhu.net|shinchu.net|thumb8.net|thumb9.net|topcryptoz.net|uniqueten.net|ultraten.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=next-episode.net - Invalid network filter in default: *$script,redirect-rule=noopjs,domain=dragontea.ink - Invalid network filter in default: *$frame,redirect-rule=noopframe,domain=dragontea.ink - Invalid network filter in default: *$image,redirect-rule=nooptext,domain=dragontea.ink - Invalid network filter in default: ||googlesyndication.com/safeframe/$frame,redirect-rule=noop.html,domain=rocketnews24.com|youpouch.com - Invalid network filter in default: ||googlesyndication.com/safeframe/$frame,redirect-rule=noop.html,domain=soranews24.com - Invalid network filter in default: *$frame,domain=techcyan.com|kiktu.com|upshrink.com,redirect-rule=noopframe - Invalid network filter in default: *$frame,domain=welt.de,redirect-rule=noopframe - Invalid network filter in default: *$script,domain=welt.de,redirect-rule=noopjs - Invalid network filter in default: $webrtc,domain=ack.net|allthetests.com|azvideo.net|champion.gg|clicknupload.link|colourlovers.com|csgolounge.com|dispatch.com|fastplay.to|go4up.com|gounlimited.to|janjua.pw|janjua.tv|jpost.com|megaup.net|merriam-webster.com|netdna-storage.com|ouo.io|ouo.press|rlslog.net|sourceforge.net|spanishdict.com|telegram.com|torlock.icu|torlock2.com|uptobox.com|videowood.tv|vidtodo.com|yts.gs|yts.mx -Rejected cosmetic filters: 211 - Entity-based filter not supported: div.ellip > span:has-text(/^Ads?$/):upward(2) - Entity-based filter not supported: [href^="https://www.googleadservices.com/pagead/aclk?"][href$="adurl="]:upward(3) - Entity-based filter not supported: :not(:matches-path(/^/search\?.*tbm=shop|^/shopping/)) *:not([class^="sh-sr__shop-result-group"]) [href^="/aclk"][href$="adurl="]:upward(3) - Entity-based filter not supported: .sh-sr__shop-result-group[data-hveid] .sh-sp__btn:matches-css(font-size: 13px):upward(.sh-sr__shop-result-group):has(a[href^="/aclk"][href$="adurl="]) - Entity-based filter not supported: c-wiz div[data-hveid] > div > div > ul:has(> li[style="max-width:200px;"] > div > div[data-hveid] > a[href*="/aclk"]):upward(3) - Entity-based filter not supported: div[data-section-id] > a[href^="/aclk"][href*="placesheetAdFix="][href*="adurl="]:upward(1) - Entity-based filter not supported: :matches-path(/travel/hotels/) div[data-is-promoted="true"] - Entity-based filter not supported: div.container:style(margin-top: 0px !important) - Invalid filter: timesofindia.indiatimes.com##:xpath(//p[contains(text(),"Ad ")]/../..) - Invalid filter: timesofindia.indiatimes.com##[onclick] .btxt:matches-css-before(content:/Ad/):xpath(../../..) - Invalid filter: indiatimes.com##[onclick] .btxt:has-text(/Ad/):xpath(../../..) - Invalid filter: indiatimes.com##[onclick] p:has-text(/Ad/):xpath(../../..) - Invalid filter: indiatimes.com##[onclick] p:matches-css-before(content:/Ad /):xpath(../..):not(p:has-text(/MAHA/i)):not(p:has-text(/Times/i)) - Invalid filter: samayam.com##[onclick] p:matches-css-before(content:/Ad /):xpath(../..):not(p:has-text(/MAHA/i)):not(p:has-text(/Times/i)) - Invalid filter: samayam.com##:xpath(//span[(text()='Ad')]/../../..) - Invalid filter: indiatimes.com##[onclick] h5:has-text(/Ad/):xpath(../../..) - Invalid filter: m.timesofindia.com##.brand_ctn:has-text(/Ad:/):xpath(../..) - Invalid filter: m.timesofindia.com##span:has-text(/Ad:/):xpath(../..) - Invalid filter: m.timesofindia.com##p:has-text(/Ad:/):xpath(../../..) - Invalid filter: indiatimes.com##p:matches-css(background-image: /colombia-icon/):xpath(../..) - Invalid filter: indiatimes.com##div:matches-css(background-image: /colombia_/):xpath(../..) - Invalid filter: economictimes.indiatimes.com##:xpath(//span[contains(text(),"More from ")]/../preceding-sibling::div) - Invalid filter: economictimes.indiatimes.com##:xpath(//span[contains(text(),"Around The")]) - Invalid filter: economictimes.indiatimes.com##:xpath(//p[contains(text(),"Ad:")]/../..) - Entity-based filter not supported: [id^="sas_"]:style(height: 1px !important) - Invalid filter: finanzen.net##:xpath('//*[contains(text(),"Werbung")]') + [class] - Invalid filter: finanzen.net##:xpath(//*[contains(text(),"Werbung")]) + [class] - Entity-based filter not supported: .s-widget > [data-cel-widget^="MAIN"] > [data-cel-widget^="tetris"] > div[id^="CardInstance"][class^="_tetris-"]:upward(3) - Entity-based filter not supported: .a-carousel-card > div > div[cel_widget_id^="adplacements:"]:upward(2):remove() - Entity-based filter not supported: #similarities_feature_div span[id^="ad-feedback-text"]:upward(#similarities_feature_div) - Entity-based filter not supported: .download-links-dontblock > LI:has-text(Anon) - Entity-based filter not supported: .download-links-dontblock > LI:has-text(Stream) - Entity-based filter not supported: .no-top-radius div > a[href]:has-text(VPN) - Invalid filter: quora.com##:xpath(//div[not(@class="ui_qtext_para") and contains(text(), 'ad by')]/parent::div/parent::div/parent::div[@id]) - Invalid filter: quora.com##:xpath(//div[not(@class="ui_qtext_para") and contains(text(), 'promoted') and contains(text(), 'by')]/parent::a/parent::div/parent::div/parent::div[@id]) - Invalid filter: quora.com##:xpath(//div[not(@class="ui_qtext_para") and contains(text(), 'Quora') and contains(text(), 'by') and contains(text(), 'Business')]/parent::a/parent::div/parent::div/parent::div[@id]) - Invalid filter: quora.com##:xpath(//span[contains(text(), 'by')]/ancestor::*[contains(concat(' ', @class, ' '), ' external_link ')]/../../..) - Invalid filter: quora.com##:xpath(//p[(text()='d')]/../../../../..) - Entity-based filter not supported: .adsbyvli:upward(div[style$="width: 610px;"]) - Entity-based filter not supported: #leftside .adsbyvli:upward(div[style$="height: 90px;"]) - Invalid filter: primewire.*##:xpath('//*[contains(text(),"Sponsored")]'):upward(2) - Invalid filter: primewire.*##:xpath(//*[contains(text(),"Sponsored")]):upward(2) - Entity-based filter not supported: .trtbl:has-text(VPN) - Invalid filter: torrentfunk.com##:xpath(//strong[contains(text(),"VPN")]/../../..) - Entity-based filter not supported: [class]:not(body):not(html):has-text(/Protect your privacy/i) - Entity-based filter not supported: [class]:not(body):not(html):has-text(Sponsored) - Invalid filter: torlock.*##:xpath(//strong[contains(text(),"VPN")]/../../..) - Invalid filter: torlock2.*##:xpath(//strong[contains(text(),"VPN")]/../../..) - Entity-based filter not supported: body.modal-open:style(overflow: auto!important) - Entity-based filter not supported: TR:has-text(Stream:) - Entity-based filter not supported: .table2:has-text(Sponsored) - Entity-based filter not supported: div[id][style="width: 728px; height: 90px;"]:upward(#pub1) - Invalid filter: nytimes.com##:xpath(//div[starts-with(@id, "dfp-ad")]/../..) - Invalid filter: nytimes3xbfgragh.onion##:xpath(//div[starts-with(@id, "dfp-ad")]/../..) - Entity-based filter not supported: .btn-danger:has-text(/download/i) - Entity-based filter not supported: .vpn-link:upward(1) - Entity-based filter not supported: .content.page.page-video .video-content > div[class] > div > div[class] > div[class][style^="background-image:"]:style(background-image: none !important;) - Entity-based filter not supported: .page-video > div.video-videos-slider ~ div[class]:matches-css(justify-content: center) - Entity-based filter not supported: .video-content > div[class] > div.text > a[href="#"]:upward(2) - Invalid filter: spankwire.com##:xpath('//*[contains(text(),"Advertisement")]'):upward(1) - Invalid filter: spankwire.com##:xpath(//*[contains(text(),"Advertisement")]):upward(1) - Invalid filter: 1337x.*##:xpath('//*[contains(text(),"Hide your IP")]/..') - Invalid filter: x1337x.*##:xpath('//*[contains(text(),"Hide your IP")]/..') - Invalid filter: 1337x.unblock2.xyz##:xpath('//*[contains(text(),"Hide your IP")]/..') - Invalid filter: 1337x.unblocked.*##:xpath('//*[contains(text(),"Hide your IP")]/..') - Invalid filter: 1337x.unblockit.*##:xpath('//*[contains(text(),"Hide your IP")]/..') - Invalid filter: 1337x.*##:xpath(//*[contains(text(),"Hide your IP")]/..) - Invalid filter: x1337x.*##:xpath(//*[contains(text(),"Hide your IP")]/..) - Invalid filter: 1337x.unblock2.xyz##:xpath(//*[contains(text(),"Hide your IP")]/..) - Invalid filter: 1337x.unblocked.*##:xpath(//*[contains(text(),"Hide your IP")]/..) - Invalid filter: 1337x.unblockit.*##:xpath(//*[contains(text(),"Hide your IP")]/..) - Invalid filter: pussyspace.*##:xpath(//span[contains(text(),"PARTNER")]/..) - Entity-based filter not supported: #web:style(display: block !important;) - Entity-based filter not supported: .adsbyvli:upward(div[style^="width: 300px; height: 250px"]) - Invalid filter: pcbolsa.com##.InfoPcBolsaAdBlock:xpath(..) - Entity-based filter not supported: .position-absolute:style(opacity: 0 !important;) - Entity-based filter not supported: .adsbytrafficjunky:upward(li) - Entity-based filter not supported: div > [href*=".html"]:upward(div) - Entity-based filter not supported: li:has-text(100% Anonym) - Entity-based filter not supported: button[id]:has-text(/High-speed/i) - Invalid filter: ettv.*##:xpath('//*[contains(text(),"VPN")]'):upward(2) - Invalid filter: ettv.*##:xpath(//*[contains(text(),"VPN")]):upward(2) - Entity-based filter not supported: .column > .card > .adv:upward(2) - Entity-based filter not supported: #list-eps:style(display:block!important) - Entity-based filter not supported: .les-title:has-text(HD) - Entity-based filter not supported: [href]:has-text(PLAY) - Entity-based filter not supported: tr:has-text(VPN) - Entity-based filter not supported: .head:has-text(Adv) - Entity-based filter not supported: .uk-card-secondary:has-text(VPN) - Entity-based filter not supported: [class="close ico"]:upward(1) - Entity-based filter not supported: table.movie_version:has-text(Promo) - Entity-based filter not supported: div.row:has-text(in HD) - Entity-based filter not supported: h2.widget-title:has-text(Advertisement) - Entity-based filter not supported: .btn_d:has-text(/high/i) - Entity-based filter not supported: [class^="ad_btn"]:upward(center) - Invalid filter: ndtv.com##.composite-branding.branding:has-text(/sponsored/i):xpath(..) - Invalid filter: ndtv.com##:xpath(//div[contains(text(),"Advert")]) - Invalid filter: extratorrent.*##:xpath(//a[contains(text(),"VPN")]/../../..) - Entity-based filter not supported: .links_table > .fix-table > table > tbody > tr:has-text(Patrocinador) - Entity-based filter not supported: input[value^="http"]:style(width: 70% !important) - Entity-based filter not supported: li.s-item:has(span:has-text(/S[^P]*?P[^O]*?O[^N]*?N[^S]*?S[^O]*?O[^R]*?R[^E]*?E[^D]*?D/)) - Entity-based filter not supported: .s-item__title-tag:has-text(/^SPONSORED$/):upward(.s-item) - Invalid filter: ebay.*##.s-item:has-text(Sponsored):xpath('//*[string-length(@aria-labelledby) = 8]'):upward(.s-item) - Invalid filter: ebay.*##.s-item:has-text(Sponsored):xpath(//*[string-length(@aria-labelledby) = 8]):upward(.s-item) - Entity-based filter not supported: #content-embed:style(display: block!important) - Invalid filter: washingtonpost.com##:xpath('//*[(text()='AD')]/..') - Invalid filter: washingtonpost.com##:xpath(//*[(text()='AD')]/..) - Entity-based filter not supported: div.col-md-4:nth-of-type(1):has-text(Usennet) - Entity-based filter not supported: .panel-featured-success.panel-featured-bottom.panel-featured-top.panel.text-center:has([alt="Usennet.nl"]):upward(1) - Entity-based filter not supported: #adBanner:style(height:25px !important;left:-3000px !important;position:absolute !important) - Entity-based filter not supported: iframe[src^="//sports24.site/"]:upward(div) - Entity-based filter not supported: div[style^="width:300px;height:250px"]:upward(1) - Entity-based filter not supported: div[data-player] > .container:style(max-width: 100% !important;) - Invalid filter: sports24.*##:xpath('//*[contains(text(),"Watch HD")]') - Invalid filter: sports24.*##:xpath(//*[contains(text(),"Watch HD")]) - Entity-based filter not supported: .btn-outline-primary:has-text(/HD$/) - Invalid filter: bitcointalk.org##:xpath(//span[contains(text(),"Advert")]/../..) - Entity-based filter not supported: div.col-xs-12:has-text(MMPORG OYUNLAR) - Entity-based filter not supported: .panel-title:has-text(REKLAM) - Entity-based filter not supported: .table-hover.table > tbody > tr:has-text(Descargar Premium) - Entity-based filter not supported: a[href*=".yabo816."]:remove() - Invalid filter: trakt.tv##:xpath('//*[(text()='Advertisement')]/..') - Invalid filter: trakt.tv##:xpath(//*[(text()='Advertisement')]/..) - Entity-based filter not supported: button:has(span:has-text(Skip)) - Invalid filter: pelis-gratis.com##.holder > li [href*="/descargar.html"]:xpath(../..) - Entity-based filter not supported: main.py-4:style(min-height:0px !important) - Entity-based filter not supported: [style^="font-weight"]:has-text(PREMIUM) - Entity-based filter not supported: .placeholder-content:style(display: inline-block !important) - Invalid filter: akvi.icu##:xpath('//*[contains(text(),"Disable")]') - Invalid filter: akvi.icu##:xpath(//*[contains(text(),"Disable")]) - Entity-based filter not supported: .s-item__sep:matches-css(display: none):remove() - Invalid filter: ebay.*##:xpath(//span[(text()='S')]):upward(.s-item) - Entity-based filter not supported: [id^="cookieConsent"]:upward(1) - Entity-based filter not supported: div#responseads:style(display:block !important) - Entity-based filter not supported: #component_2 > div[class^="_"] > div > div[class^="iab_"][style="min-height:90px"]:upward(2) - Entity-based filter not supported: .ui_container > div[class] > div[class^="_"] > .iab_medRec:only-child:upward(1) - Entity-based filter not supported: #playVideo:style(display: block !important; visibility: visible !important;) - Entity-based filter not supported: #player_embed:style(display: block !important; visibility: visible !important;) - Entity-based filter not supported: .jw-reset.jw-wrapper:style(z-index:2147483647 !important) - Entity-based filter not supported: #f13 > b:has-text(Sponsor):upward(4) - Entity-based filter not supported: td#f13:nth-of-type(3) > table:nth-of-type(4) > tbody > tr > td:upward(3) - Entity-based filter not supported: .g-recaptcha:upward(form > div):style(display: block !important;) - Entity-based filter not supported: [style="display:none"]:style(display: block !important;) - Entity-based filter not supported: div[data-test-id="pin"] span:not([class]):has-text(/Promoted by|広告/):upward([data-grid-item="true"]) - Invalid filter: masterduelmeta.com##:xpath('//*[contains(text(),"adblock")]'):upward(3) - Invalid filter: masterduelmeta.com##:xpath(//*[contains(text(),"adblock")]):upward(3) - Entity-based filter not supported: .adunitContainer:upward(3) - Entity-based filter not supported: table:has-text(VPN) - Entity-based filter not supported: #download_link:style(display: block !important;) - Invalid filter: financerites.*##p:has-text([ad_) - Entity-based filter not supported: h4:has-text(Ads) - Entity-based filter not supported: [style]:has-text(PREMIUM) - Invalid filter: wp.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: money.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: o2.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: parenting.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: pudelek.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: autokult.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: gadzetomania.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: fotoblogia.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: komorkomania.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: polygamia.pl##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: open.fm##:xpath('//*[string-length(@href) > 1600]') - Invalid filter: wp.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: money.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: o2.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: parenting.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: pudelek.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: autokult.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: gadzetomania.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: fotoblogia.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: komorkomania.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: polygamia.pl##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: open.fm##:xpath(//*[string-length(@href) > 1600]) - Invalid filter: haveibeenpwned.com##.actionsBar:-abp-has(.why1Password) - Invalid filter: haveibeenpwned.com##.bodyGradient>:-abp-has(.why1Password) - Invalid filter: pornhub.com##:-abp-properties(height: 300px; width: 315px;) - Invalid filter: pornhub.com##:-abp-properties(float: right; margin-top: 30px; width: 50%;) - Invalid filter: youporn.com##:-abp-properties(float: right; margin-top: 30px; width: 50%;) - Invalid filter: redtube.com##:-abp-properties(*data:image*) - Invalid filter: tube8.com##:-abp-properties(*data:image*) - Invalid filter: tube8.es##:-abp-properties(*data:image*) - Invalid filter: tube8.fr##:-abp-properties(*data:image*) - Invalid filter: xvideos.com##:-abp-properties(*data:image*) - Invalid filter: youjizz.com##:-abp-properties(*data:image*) - Invalid filter: youporn.com##:-abp-properties(*data:image*) - Invalid filter: youporngay.com##:-abp-properties(*data:image*) - Invalid filter: redtube.com##:-abp-properties(base64) - Invalid filter: tube8.com##:-abp-properties(base64) - Invalid filter: tube8.es##:-abp-properties(base64) - Invalid filter: tube8.fr##:-abp-properties(base64) - Invalid filter: xvideos.com##:-abp-properties(base64) - Invalid filter: youjizz.com##:-abp-properties(base64) - Invalid filter: youporn.com##:-abp-properties(base64) - Invalid filter: youporngay.com##:-abp-properties(base64) - Invalid filter: redtube.com##:-abp-properties(data:) - Invalid filter: tube8.com##:-abp-properties(data:) - Invalid filter: tube8.es##:-abp-properties(data:) - Invalid filter: tube8.fr##:-abp-properties(data:) - Invalid filter: xvideos.com##:-abp-properties(data:) - Invalid filter: youjizz.com##:-abp-properties(data:) - Invalid filter: youporn.com##:-abp-properties(data:) - Invalid filter: youporngay.com##:-abp-properties(data:) - Invalid filter: redtube.com##:-abp-properties(image/) - Invalid filter: tube8.com##:-abp-properties(image/) - Invalid filter: tube8.es##:-abp-properties(image/) - Invalid filter: tube8.fr##:-abp-properties(image/) - Invalid filter: xvideos.com##:-abp-properties(image/) - Invalid filter: youjizz.com##:-abp-properties(image/) - Invalid filter: youporn.com##:-abp-properties(image/) - Invalid filter: youporngay.com##:-abp-properties(image/) -CSS-generic: 16592 plain CSS selectors -CSS-specific domain-based: 8192 distinct filters - Combined into 5098 distinct entries -CSS-specific entity-based: 630 distinct filters - Combined into 332 distinct entries -CSS-specific injectable files: 21 - 0m32sq4, 14hqqb4, 1i19tpc, 1hpucno, 0o1ss5o, 0ersnbc, 0dohb2o, 1nujg7c, 0h8tbk4, 1eqq8lg, 047ud3s, 17k3emg, 19oh6ek, 0fm0ue4, 10th3qs, 1an4e88, 0p3j5kk, 04m1gc4, 00hu8d4, 1blq3us, default -Declarative-related distinct filters: 269 distinct combined selectors -Procedural-related distinct filters: 365 distinct combined selectors -Discarded unsupported scriptlet filter: +js(aost, document.body.appendChild) -Discarded unsupported scriptlet filter: +js(aost, Math, onerror) -Discarded unsupported scriptlet filter: +js(aost, Math.random, injectedScript) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /injectedScript.*inlineScript/) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /(?=.*onerror)(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(nobab) -Discarded unsupported scriptlet filter: +js(noeval) -Discarded unsupported scriptlet filter: +js(golem.de) -Discarded unsupported scriptlet filter: +js(aost, open, setPopUnder) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, _0x) -Discarded unsupported scriptlet filter: +js(nowebrtc) -Discarded unsupported scriptlet filter: +js(nano-stb, , 10000) -Discarded unsupported scriptlet filter: +js(nofab) -Discarded unsupported scriptlet filter: +js(popads.net) -Discarded unsupported scriptlet filter: +js(nano-stb, _0x, *) -Discarded unsupported scriptlet filter: +js(nano-sib) -Discarded unsupported scriptlet filter: +js(cookie-remover, video_view_count) -Discarded unsupported scriptlet filter: +js(ra, style, #over) -Discarded unsupported scriptlet filter: +js(ra, data-ad-img|data-ad-target, , stay) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, ai_) -Discarded unsupported scriptlet filter: +js(ra, checked, input#chkIsAdd) -Discarded unsupported scriptlet filter: +js(aost, document.querySelectorAll, /onload inlineScript|onload https/) -Discarded unsupported scriptlet filter: +js(popads-dummy) -Discarded unsupported scriptlet filter: +js(ra, checked, #addon) -Discarded unsupported scriptlet filter: +js(nano-stb, tick()) -Discarded unsupported scriptlet filter: +js(nano-stb, redirect, 4000) -Discarded unsupported scriptlet filter: +js(disable-newtab-links) -Discarded unsupported scriptlet filter: +js(aost, onload, inlineScript) -Discarded unsupported scriptlet filter: +js(ra, onclick) -Discarded unsupported scriptlet filter: +js(nano-sib, , 1200, 0) -Discarded unsupported scriptlet filter: +js(adfly-defuser) -Discarded unsupported scriptlet filter: +js(ra, href|target, a[href="https://imgprime.com/view.php"][target="_blank"], complete) -Discarded unsupported scriptlet filter: +js(nano-stb) -Discarded unsupported scriptlet filter: +js(ra, href, a[href="https://vpn-choice.com"]) -Discarded unsupported scriptlet filter: +js(noeval-if, replace) -Discarded unsupported scriptlet filter: +js(nano-stb, timeUpdater, , 0) -Discarded unsupported scriptlet filter: +js(nano-sib, myTimer, 1500) -Discarded unsupported scriptlet filter: +js(nano-sib, countdown, 2000) -Discarded unsupported scriptlet filter: +js(noeval-if, ExoLoader) -Discarded unsupported scriptlet filter: +js(ra, src, iframe#claimAd) -Discarded unsupported scriptlet filter: +js(nano-sib, downloadTimer) -Discarded unsupported scriptlet filter: +js(aost, Math.random, stackDepth:4) -Discarded unsupported scriptlet filter: +js(aost, Math.random, inlineScript) -Discarded unsupported scriptlet filter: +js(ra, href|target, a[href^="https://tm-offers.gamingadult.com/"]) -Discarded unsupported scriptlet filter: +js(aost, Math, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-sib, , , 0) -Discarded unsupported scriptlet filter: +js(nano-sib, counter, 2000) -Discarded unsupported scriptlet filter: +js(ra, disabled, input) -Discarded unsupported scriptlet filter: +js(nano-sib, , 1800) -Discarded unsupported scriptlet filter: +js(ra, srcdoc, iframe) -Discarded unsupported scriptlet filter: +js(aost, Math, /(?=^(?!.*(api|jquery|inlineScript|form|Progress)))/) -Discarded unsupported scriptlet filter: +js(ra, onclick, button[name="imgContinue"][onclick]) -Discarded unsupported scriptlet filter: +js(ra, target, #continuetoimage > [href]) -Discarded unsupported scriptlet filter: +js(ra, href|target, #continuetoimage > [href][onclick]\, #overlayera > #ajax_load_indicator > #page_effect > [href][onclick]) -Discarded unsupported scriptlet filter: +js(ra, target) -Discarded unsupported scriptlet filter: +js(ra, href, [href*="ccbill"]) -Discarded unsupported scriptlet filter: +js(aost, Math.round, inlineScript) -Discarded unsupported scriptlet filter: +js(rc, hide, .button-checkbox) -Discarded unsupported scriptlet filter: +js(rc, btn-disable, button) -Discarded unsupported scriptlet filter: +js(ra, disabled, button) -Discarded unsupported scriptlet filter: +js(nano-sib, time) -Discarded unsupported scriptlet filter: +js(nano-sib, time, 2500) -Discarded unsupported scriptlet filter: +js(nano-stb, , 1400) -Discarded unsupported scriptlet filter: +js(nano-stb, run) -Discarded unsupported scriptlet filter: +js(nano-stb, , ,0) -Discarded unsupported scriptlet filter: +js(ra, href, #clickfakeplayer) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick^="window.open"]) -Discarded unsupported scriptlet filter: +js(nano-stb, tick) -Discarded unsupported scriptlet filter: +js(nano-stb, "#proceed", 9000) -Discarded unsupported scriptlet filter: +js(ra, onclick, input) -Discarded unsupported scriptlet filter: +js(ra, onclick, button, stay) -Discarded unsupported scriptlet filter: +js(nano-sib, clearInterval, *) -Discarded unsupported scriptlet filter: +js(nano-stb, , , 0.02) -Discarded unsupported scriptlet filter: +js(nano-sib, seconds) -Discarded unsupported scriptlet filter: +js(nano-sib, , ,0.02) -Discarded unsupported scriptlet filter: +js(nano-sib, inner) -Discarded unsupported scriptlet filter: +js(nano-sib, circle_animation) -Discarded unsupported scriptlet filter: +js(nano-stb, CountBack, 990) -Discarded unsupported scriptlet filter: +js(ra, disabled, button[id="invisibleCaptchaShortlink"]) -Discarded unsupported scriptlet filter: +js(ra, onmouseover|onclick|onmouseout, .save-btn.pull-right) -Discarded unsupported scriptlet filter: +js(nano-sib, timer, 1000, 0.6) -Discarded unsupported scriptlet filter: +js(aost, document.getElementById, onLoadEvent) -Discarded unsupported scriptlet filter: +js(refresh-defuser) -Discarded unsupported scriptlet filter: +js(aost, absda) -Discarded unsupported scriptlet filter: +js(ra, onclick, , stay) -Discarded unsupported scriptlet filter: +js(aost, Object, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-stb, , ,0.02) -Discarded unsupported scriptlet filter: +js(noeval-if, tmohentai) -Discarded unsupported scriptlet filter: +js(cookie-remover, ref_cookie) -Discarded unsupported scriptlet filter: +js(nano-stb, seconds) -Discarded unsupported scriptlet filter: +js(aost, Object, mark) -Discarded unsupported scriptlet filter: +js(nano-sib, countdown) -Discarded unsupported scriptlet filter: +js(nano-sib, web_counter) -Discarded unsupported scriptlet filter: +js(nano-sib, video_counter) -Discarded unsupported scriptlet filter: +js(nano-stb, notification_state, 12000) -Discarded unsupported scriptlet filter: +js(ra, oncontextmenu) -Discarded unsupported scriptlet filter: +js(ra, class, div.intAdX) -Discarded unsupported scriptlet filter: +js(ra, class, div[class^="img"][class$="ad"]) -Discarded unsupported scriptlet filter: +js(alert-buster) -Discarded unsupported scriptlet filter: +js(nano-sib,/SplashScreen|BannerAd/) -Discarded unsupported scriptlet filter: +js(nano-stb,/SplashScreen|BannerAd/) -Discarded unsupported scriptlet filter: +js(nano-sib, i--) -Discarded unsupported scriptlet filter: +js(nano-sib, , *, 0) -Discarded unsupported scriptlet filter: +js(ra, data-ff-code) -Discarded unsupported scriptlet filter: +js(aost, document.addEventListener, blocker) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, $) -Discarded unsupported scriptlet filter: +js(ra, style, ins, complete) -Discarded unsupported scriptlet filter: +js(nano-sib, curAd) -Discarded unsupported scriptlet filter: +js(noeval-if, debugger) -Discarded unsupported scriptlet filter: +js(nano-sib, js-btn-skip, 1000) -Discarded unsupported scriptlet filter: +js(nano-sib, clearInterval) -Discarded unsupported scriptlet filter: +js(nano-stb, startDownload, 8000) -Discarded unsupported scriptlet filter: +js(ra, href, .link) -Discarded unsupported scriptlet filter: +js(ra, href, .fake_player > a[href]) -Discarded unsupported scriptlet filter: +js(aost, console.log, stackDepth:2) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, https) -Discarded unsupported scriptlet filter: +js(ra, target, .clickbutton) -Discarded unsupported scriptlet filter: +js(noeval-if, fab) -Discarded unsupported scriptlet filter: +js(ra, onclick, .btn-success.get-link, stay) -Discarded unsupported scriptlet filter: +js(ra, disabled, .btn-primary) -Discarded unsupported scriptlet filter: +js(nano-stb, /.?/, , 0.02) -Discarded unsupported scriptlet filter: +js(ra, oncontextmenu, body) -Discarded unsupported scriptlet filter: +js(aost, atob, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-sib, timer) -Discarded unsupported scriptlet filter: +js(aost, encodeURIComponent, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-stb, , , 0) -Discarded unsupported scriptlet filter: +js(nano-stb, , 10000, 0) -Discarded unsupported scriptlet filter: +js(nano-sib, gotolink) -Discarded unsupported scriptlet filter: +js(rc, hidden, button) -Discarded unsupported scriptlet filter: +js(ra, data-ppcnt_ads, main[onclick]) -Discarded unsupported scriptlet filter: +js(ra, onClick) -Discarded unsupported scriptlet filter: +js(nano-sib, show_download_links) -Discarded unsupported scriptlet filter: +js(nano-stb, downloadbtn) -Discarded unsupported scriptlet filter: +js(nano-sib, , 800) -Discarded unsupported scriptlet filter: +js(nano-sib, , ,0) -Discarded unsupported scriptlet filter: +js(nano-stb, counter) -Discarded unsupported scriptlet filter: +js(rc, twig-body) -Discarded unsupported scriptlet filter: +js(ra, href, [rel^="noopener"]) -Discarded unsupported scriptlet filter: +js(aost, $, /(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(noeval-if, popUnderStage) -Discarded unsupported scriptlet filter: +js(ra, data-item, a[href='']) -Discarded unsupported scriptlet filter: +js(ra, href, a[href][target="_blank"]) -Discarded unsupported scriptlet filter: +js(nano-sib, counter, *) -Discarded unsupported scriptlet filter: +js(aost, Object.assign, bidsBackHandler) -Discarded unsupported scriptlet filter: +js(nano-sib, countDown) -Discarded unsupported scriptlet filter: +js(aost, Math, showModal) -Discarded unsupported scriptlet filter: +js(nano-sib, runDownload) -Discarded unsupported scriptlet filter: +js(aost, EventTarget.prototype.addEventListener, stackDepth:3) -Discarded unsupported scriptlet filter: +js(ra, data-ppcnt_ads|onclick, #main) -Discarded unsupported scriptlet filter: +js(noeval-if, fab_alert) -Discarded unsupported scriptlet filter: +js(ra, href, a[href*="/ads.php"][target="_blank"]) -Discarded unsupported scriptlet filter: +js(nano-sib, , 100, 0) -Discarded unsupported scriptlet filter: +js(cookie-remover, /^/) -Discarded unsupported scriptlet filter: +js(nano-stb, readyToVote, 12000) -Discarded unsupported scriptlet filter: +js(nano-sib, timer, 1500) -Discarded unsupported scriptlet filter: +js(ra, onclick, a[href^="magnet:"][onclick]) -Discarded unsupported scriptlet filter: +js(norafif, getElementById) -Discarded unsupported scriptlet filter: +js(nano-sib, , 1500) -Discarded unsupported scriptlet filter: +js(ra, target, #SafelinkGenerate) -Discarded unsupported scriptlet filter: +js(nano-sib, , , 0.3) -Discarded unsupported scriptlet filter: +js(nano-stb, , 7000, 0) -Discarded unsupported scriptlet filter: +js(nano-sib, sec--) -Discarded unsupported scriptlet filter: +js(nano-stb, timer--) -Discarded unsupported scriptlet filter: +js(ra, onclick, a[href][onclick^="getFullStory"]) -Discarded unsupported scriptlet filter: +js(nano-sib, #timer) -Discarded unsupported scriptlet filter: +js(noeval-if, adsbygoogle) -Discarded unsupported scriptlet filter: +js(nano-sib, timer, 1100) -Discarded unsupported scriptlet filter: +js(ra, onclick, .player > div[onclick]) -Discarded unsupported scriptlet filter: +js(aost, Math, onreadystatechange) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /\st\.[a-zA-Z]*\s/) -Discarded unsupported scriptlet filter: +js(aost, Object, /(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(aost, Object, webpack) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /\st\.[a-zA-Z]*\sinlineScript/) -Discarded unsupported scriptlet filter: +js(aost, Object, /(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(aost, XMLHttpRequest, rocket) -Discarded unsupported scriptlet filter: +js(ra, onclick, body) -Discarded unsupported scriptlet filter: +js(ra, onclick, .previewhd > a) -Discarded unsupported scriptlet filter: +js(aost, Object.prototype.hasOwnProperty, /(?=^(?!.*(Array|Object|facebook|google)))/) -Discarded unsupported scriptlet filter: +js(cookie-remover, PageCount) -Discarded unsupported scriptlet filter: +js(norafif, style.opacity) -Discarded unsupported scriptlet filter: +js(aost, Math.random, ) -Discarded unsupported scriptlet filter: +js(ra, onclick, a.thumb.mvi-cover) -Discarded unsupported scriptlet filter: +js(aost, jQuery, ai_adb) -Discarded unsupported scriptlet filter: +js(aost, JSON.parse, computed) -Discarded unsupported scriptlet filter: +js(nano-stb, timer) -Discarded unsupported scriptlet filter: +js(aost, XMLHttpRequest, onreadystatechange) -Discarded unsupported scriptlet filter: +js(ra, href|target, a[href^="https://tipstertube.com/bookmaker/"][target="_blank"], stay) -Discarded unsupported scriptlet filter: +js(nano-sib, time, , 0) -Discarded unsupported scriptlet filter: +js(nano-stb, countDown) -Discarded unsupported scriptlet filter: +js(aost, localStorage, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-sib, counter) -Discarded unsupported scriptlet filter: +js(nano-stb, countdown, 10000) -Discarded unsupported scriptlet filter: +js(aost, _pop, _init) -Discarded unsupported scriptlet filter: +js(ra, href|target|data-ipshover-target|data-ipshover|data-autolink|rel, a[href^="https://thumpertalk.com/link/click/"][target="_blank"]) -Discarded unsupported scriptlet filter: +js(nano-sib, secs) -Discarded unsupported scriptlet filter: +js(nano-sib, download) -Discarded unsupported scriptlet filter: +js(aost, Math.floor, /computed|\$\./) -Discarded unsupported scriptlet filter: +js(aost, Math.floor, ) -Discarded unsupported scriptlet filter: +js(aost, Math.floor, randStr) -Discarded unsupported scriptlet filter: +js(nano-sib, _0x) -Discarded unsupported scriptlet filter: +js(aost, Math.round, onload) -Discarded unsupported scriptlet filter: +js(aost, document.getElementById, inlineScript) -Discarded unsupported scriptlet filter: +js(rc, hidden, video) -Discarded unsupported scriptlet filter: +js(ra, href, #continue) -Discarded unsupported scriptlet filter: +js(noeval-if, _0x) -Discarded unsupported scriptlet filter: +js(nano-sib, timer.remove) -Discarded unsupported scriptlet filter: +js(noeval-if, deblocker) -Discarded unsupported scriptlet filter: +js(nano-sib, downloadButton) -Discarded unsupported scriptlet filter: +js(aost, $, :1:1) -Discarded unsupported scriptlet filter: +js(nano-sib, timePassed) -Discarded unsupported scriptlet filter: +js(nano-sib, wpsafe-time) -Discarded unsupported scriptlet filter: +js(rc, get-link, .ybtn.get-link[target="_blank"], stay) -Discarded unsupported scriptlet filter: +js(nano-sib, timeleft) -Discarded unsupported scriptlet filter: +js(ra, disabled, input[id="button1"][class="btn btn-primary"][disabled]) -Discarded unsupported scriptlet filter: +js(nano-stb, .fadeIn(), 3000) -Discarded unsupported scriptlet filter: +js(ra, style, div[style="display: none;"]) -Discarded unsupported scriptlet filter: +js(ra, type, [src*="SPOT"], asap stay) -Discarded unsupported scriptlet filter: +js(rc, get-link, .btn-success.get-link[target="_blank"], stay) -Discarded unsupported scriptlet filter: +js(nano-sib, counter--) -Discarded unsupported scriptlet filter: +js(nano-sib, (i-1)) -Discarded unsupported scriptlet filter: +js(ra, class, div#player) -Discarded unsupported scriptlet filter: +js(ra, href|target, a[onclick^="getActionContent"]) -Discarded unsupported scriptlet filter: +js(nano-sib, freeRemind) -Discarded unsupported scriptlet filter: +js(nano-sib, skipOptions) -Discarded unsupported scriptlet filter: +js(ra, onclick, #invisibleCaptchaShortlink) -Discarded unsupported scriptlet filter: +js(ra, onclick, a.btn-success.get-link) -Discarded unsupported scriptlet filter: +js(nano-sib, countDown, 1150, 0.5) -Discarded unsupported scriptlet filter: +js(nano-sib, btn-success) -Discarded unsupported scriptlet filter: +js(aost, Math, ai_) -Discarded unsupported scriptlet filter: +js(nano-stb, load_ads) -Discarded unsupported scriptlet filter: +js(rc, has-sidebar-adz|DashboardPage-inner, div[class^="DashboardPage-inner"], stay) -Discarded unsupported scriptlet filter: +js(rc, hasStickyAd, div.hasStickyAd[class^="SetPage"], stay) -Discarded unsupported scriptlet filter: +js(rc, has-adz, div.has-adz, stay) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, make_rand_div) -Discarded unsupported scriptlet filter: +js(nano-sib, timercounter) -Discarded unsupported scriptlet filter: +js(nano-sib, count, *) -Discarded unsupported scriptlet filter: +js(rc, rekl_test) -Discarded unsupported scriptlet filter: +js(aost, _pop) -Discarded unsupported scriptlet filter: +js(rc, cnx-ad-container|cnx-ad-bid-slot) -Discarded unsupported scriptlet filter: +js(aost, localStorage, stackDepth:1) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick^="pop"]) -Discarded unsupported scriptlet filter: +js(ra, href|target|data-onclick, a[id="dl"][data-onclick^="window.open"], stay) -Discarded unsupported scriptlet filter: +js(aost, foreverJQ, /document.createElement|stackDepth:2/) -Discarded unsupported scriptlet filter: +js(nano-stb, _0x, 15000) -Discarded unsupported scriptlet filter: +js(nano-stb, location.href, 8000) -Discarded unsupported scriptlet filter: +js(aost, Math, ) -Discarded unsupported scriptlet filter: +js(aost, Math.random, computed) -Discarded unsupported scriptlet filter: +js(aost, $, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-sib, sec) -Discarded unsupported scriptlet filter: +js(aost, Math, https) -Discarded unsupported scriptlet filter: +js(rc, disabled, #skip-btn) -Discarded unsupported scriptlet filter: +js(aost, Element.prototype.matches, litespeed) -Discarded unsupported scriptlet filter: +js(aost, HTMLSelectElement, Object) -Discarded unsupported scriptlet filter: +js(nano-stb, aTagChange, 12000) -Discarded unsupported scriptlet filter: +js(aost, fetch, inlineScript) -Discarded unsupported scriptlet filter: +js(ra, onclick, a[onclick^="setTimeout"]) -Discarded unsupported scriptlet filter: +js(rc, vjs-hidden, .vjs-control-bar, stay) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick*="open"]) -Discarded unsupported scriptlet filter: +js(nano-sib, game) -Discarded unsupported scriptlet filter: +js(ra, href, .mvi-cover) -Discarded unsupported scriptlet filter: +js(aost, console, onload) -Discarded unsupported scriptlet filter: +js(nano-sib, hard_work) -Discarded unsupported scriptlet filter: +js(ra, href, .t-out-span [href*="utm_source"], stay) -Discarded unsupported scriptlet filter: +js(ra, src, .t-out-span [src*=".gif"], stay) -Discarded unsupported scriptlet filter: +js(nano-sib, counter, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-sib, , , 0.02) -Discarded unsupported scriptlet filter: +js(rc, hidden, .panel-body > .text-center > button) -Discarded unsupported scriptlet filter: +js(ra, disabled, .panel-body > .text-center > button) -Discarded unsupported scriptlet filter: +js(ra, class, [data-name*="|"], stay) -Discarded unsupported scriptlet filter: +js(nano-stb, isScrexed, 5000) -Discarded unsupported scriptlet filter: +js(nano-sib, timePassed, 1300) -Discarded unsupported scriptlet filter: +js(nano-stb, st2) -Discarded unsupported scriptlet filter: +js(nano-stb, subentry, 4000) -Discarded unsupported scriptlet filter: +js(nano-sib, timer, 1800) -Discarded unsupported scriptlet filter: +js(nano-sib, download_delay) -Discarded unsupported scriptlet filter: +js(aost, document.getElementById, disable) -Discarded unsupported scriptlet filter: +js(nano-stb, /__ez|window.location.href/, *) -Discarded unsupported scriptlet filter: +js(nano-sib, countc) -Discarded unsupported scriptlet filter: +js(aost, XMLHttpRequest, injectedScript) -Discarded unsupported scriptlet filter: +js(ra, href, [href="/"]) -Discarded unsupported scriptlet filter: +js(aost, Math, _0x) -Discarded unsupported scriptlet filter: +js(window-close-if, /protect?) -Discarded unsupported scriptlet filter: +js(nano-sib, distance) -Discarded unsupported scriptlet filter: +js(nano-stb, countdown) -Discarded unsupported scriptlet filter: +js(nano-stb, location.href, 18000) -Discarded unsupported scriptlet filter: +js(ra, href, [onclick], stay) -Discarded unsupported scriptlet filter: +js(nano-sib, timeLeft) -Discarded unsupported scriptlet filter: +js(nano-sib, count) -Discarded unsupported scriptlet filter: +js(ra, disabled, #downloadbtn) -Discarded unsupported scriptlet filter: +js(ra, onmousedown, .ob-dynamic-rec-link, stay) -Discarded unsupported scriptlet filter: +js(aost, onload, /app.js) -Discarded unsupported scriptlet filter: +js(ra, disabled, a#redirect-btn) -Discarded unsupported scriptlet filter: +js(rc, disabled, a#redirect-btn) -Discarded unsupported scriptlet filter: +js(nano-stb, show, 4000) -Discarded unsupported scriptlet filter: +js(ra, onclick, form > button) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, create_ad) -Discarded unsupported scriptlet filter: +js(nano-sib, contador) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, /^(?!.*(jquery|setDocument|inlineScript|gstatic|google|root|cgi).*)/) -Discarded unsupported scriptlet filter: +js(nano-sib, display) -Discarded unsupported scriptlet filter: +js(nano-stb, download_loading, *) -Discarded unsupported scriptlet filter: +js(nano-sib, second) -Discarded unsupported scriptlet filter: +js(nano-stb, submit, 5000) -Discarded unsupported scriptlet filter: +js(ra, href, .unlock-step-link) -Discarded unsupported scriptlet filter: +js(nano-stb, fa-unlock, 3000) -Discarded unsupported scriptlet filter: +js(ra, href, [href*="discord"]) -Discarded unsupported scriptlet filter: +js(cookie-remover) -Discarded unsupported scriptlet filter: +js(nano-sib, updatePercentage, 100, 0.02) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, /(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, /(?=^(?!.*(http)))/) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, /(?=^(?!.*(https|Object)))/) -Discarded unsupported scriptlet filter: +js(nano-sib, current()) -Discarded unsupported scriptlet filter: +js(nano-sib, l, , 0) -Discarded unsupported scriptlet filter: +js(nano-stb, setinteracted, 2000) -Discarded unsupported scriptlet filter: +js(ra, href, .MediaStep, stay) -Discarded unsupported scriptlet filter: +js(nano-stb, waiting, 5000) -Discarded unsupported scriptlet filter: +js(nano-stb, finalButton, *) -Discarded unsupported scriptlet filter: +js(nano-stb, modalTimer, 1500) -Discarded unsupported scriptlet filter: +js(ra, disabled, button#myClickButton) -Discarded unsupported scriptlet filter: +js(ra, style, button#finalButton) -Discarded unsupported scriptlet filter: +js(nano-stb, [native code]) -Discarded unsupported scriptlet filter: +js(nano-stb, recurseMyFunction) -Discarded unsupported scriptlet filter: +js(nano-stb, myCount) -Discarded unsupported scriptlet filter: +js(ra, onclick, .dialogBtnClick) -Discarded unsupported scriptlet filter: +js(ra, onclick, #localpp) -Discarded unsupported scriptlet filter: +js(nano-stb, downloadBtn, *) -Discarded unsupported scriptlet filter: +js(aost, Date.now, afScript) -Discarded unsupported scriptlet filter: +js(ra, onclick, .btn) -Discarded unsupported scriptlet filter: +js(nano-sib, /verify_text|isCompleted/, *) -Discarded unsupported scriptlet filter: +js(nano-stb, document[_0x, *) -Discarded unsupported scriptlet filter: +js(xml-prune, Period[id*="-roll-"][id*="-ad-"], , pubads.g.doubleclick.net/ondemand) -Discarded unsupported scriptlet filter: +js(nano-stb, , 3000) -Discarded unsupported scriptlet filter: +js(window-close-if, /link-) -Discarded unsupported scriptlet filter: +js(window-close-if, /telephone-service) -Discarded unsupported scriptlet filter: +js(window-close-if, /^/) -Discarded unsupported scriptlet filter: +js(aost, document.querySelectorAll, /(?=^(?!.*(https|Parse|Image)))/) -Discarded unsupported scriptlet filter: +js(nano-sib, cnDownloadBtn, 1200, 0.02) -Discarded unsupported scriptlet filter: +js(nano-sib, _0x, , 0.02) -Discarded unsupported scriptlet filter: +js(ra, href, [href="/bestporn.html"]) -Discarded unsupported scriptlet filter: +js(ra, disabled, button#getlink) -Discarded unsupported scriptlet filter: +js(ra, disabled, button#gotolink) -Discarded unsupported scriptlet filter: +js(ra, disabled, .downloadbtn) -Discarded unsupported scriptlet filter: +js(ra, onclick, #direct_link > a[onclick]) -Discarded unsupported scriptlet filter: +js(ra, disabled, .get-link) -Discarded unsupported scriptlet filter: +js(rc, disabled, .get-link) -Discarded unsupported scriptlet filter: +js(nano-stb, shortenbl) -Discarded unsupported scriptlet filter: +js(nano-stb, enbll) -Discarded unsupported scriptlet filter: +js(ra, href, [onclick^="pop"]) -Discarded unsupported scriptlet filter: +js(aost, btoa, /https|stackDepth:3/) -Discarded unsupported scriptlet filter: +js(rc, td-ad-background-link) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick^="track"]) -Discarded unsupported scriptlet filter: +js(ra, onmousedown, [onmousedown^="return enc(this,'https://track.rediff.com"]) -Discarded unsupported scriptlet filter: +js(cookie-remover, realm.cookiesAndJavascript) -Discarded unsupported scriptlet filter: +js(aost, btoa, send) -Discarded unsupported scriptlet filter: +js(aost, Math.floor, injectedScript) -Discarded unsupported scriptlet filter: +js(aost, document.cookie) -Discarded unsupported scriptlet filter: +js(ra, data-outbound-url, .outbound) -Discarded unsupported scriptlet filter: +js(nano-stb, /outboundLink/) -Discarded unsupported scriptlet filter: +js(ra, class|style, div[id^="los40_gpt"]) -Discarded unsupported scriptlet filter: +js(ra, onclick, a[href][onclick^="trackOutboundLink"]) -Discarded unsupported scriptlet filter: +js(fingerprint2) -Discarded unsupported scriptlet filter: +js(ra, data-woman-ex, a[href][data-woman-ex]) -Discarded unsupported scriptlet filter: +js(ra, data-trm-action|data-trm-category|data-trm-label, .trm_event, stay) -Discarded unsupported scriptlet filter: +js(aost, History, /(^(?!.*(Function|HTMLDocument).*))/) -Discarded unsupported scriptlet filter: +js(nano-sib, skipAdSeconds, , 0.02) -Discarded unsupported scriptlet filter: +js(ra, class|id, .breadcrumb + div, asap) -Discarded unsupported scriptlet filter: +js(ra, style|height, amp-img) -Discarded unsupported scriptlet filter: +js(aost, Object, /gdpr.*inlineScript/) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 2003 -Scriptlet-related injectable files: 11 - default.json-prune.js, default.set-constant.js, default.no-settimeout-if.js, default.abort-on-property-read.js, default.no-addeventlistener-if.js, default.no-setinterval-if.js, default.no-fetch-if.js, default.abort-current-script.js, default.no-windowopen-if.js, default.abort-on-property-write.js, default.no-xhr-if.js -Discarded unsupported scriptlet filter: +js(nobab) -Discarded unsupported scriptlet filter: +js(noeval) -Discarded unsupported scriptlet filter: +js(nosiif, nrWrapper) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, _0x) -Discarded unsupported scriptlet filter: +js(nowebrtc) -Discarded unsupported scriptlet filter: +js(nofab) -Discarded unsupported scriptlet filter: +js(popads.net) -Discarded unsupported scriptlet filter: +js(nano-sib) -Discarded unsupported scriptlet filter: +js(cookie-remover, video_view_count) -Discarded unsupported scriptlet filter: +js(nosiif, visibility, 1000) -Discarded unsupported scriptlet filter: +js(nano-stb, grecaptcha.ready, *) -Discarded unsupported scriptlet filter: +js(nosiif, _0x) -Discarded unsupported scriptlet filter: +js(ra, data-ad-img|data-ad-target, , stay) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, ai_) -Discarded unsupported scriptlet filter: +js(ra, checked, input#chkIsAdd) -Discarded unsupported scriptlet filter: +js(nosiif, /devtools|0x/) -Discarded unsupported scriptlet filter: +js(nosiif, /0x|google|ecoded|==/) -Discarded unsupported scriptlet filter: +js(popads-dummy) -Discarded unsupported scriptlet filter: +js(disable-newtab-links) -Discarded unsupported scriptlet filter: +js(no-xhr-if, ads) -Discarded unsupported scriptlet filter: +js(ra, onclick) -Discarded unsupported scriptlet filter: +js(nano-stb) -Discarded unsupported scriptlet filter: +js(noeval-if, replace) -Discarded unsupported scriptlet filter: +js(ra, href, #opfk) -Discarded unsupported scriptlet filter: +js(aost, Math, inlineScript) -Discarded unsupported scriptlet filter: +js(nano-sib, , , 0) -Discarded unsupported scriptlet filter: +js(no-xhr-if, /^(?!.*(einthusan\.io|yahoo|rtnotif|ajax|quantcast|bugsnag))/) -Discarded unsupported scriptlet filter: +js(ra, onmousemove, button) -Discarded unsupported scriptlet filter: +js(ra, onclick, button[id][onclick*=".html"]) -Discarded unsupported scriptlet filter: +js(nano-stb, /.?/, 4000) -Discarded unsupported scriptlet filter: +js(noeval-if, ppu) -Discarded unsupported scriptlet filter: +js(json-prune, urls, urls.0) -Discarded unsupported scriptlet filter: +js(aost, String.fromCharCode, stackDepth:3) -Discarded unsupported scriptlet filter: +js(no-fetch-if, adsbygoogle) -Discarded unsupported scriptlet filter: +js(nano-stb, disabled) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, inlineScript) -Discarded unsupported scriptlet filter: +js(ra, href, #clickfakeplayer) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick^="window.open"]) -Discarded unsupported scriptlet filter: +js(nano-stb, tick) -Discarded unsupported scriptlet filter: +js(nano-sib, seconds) -Discarded unsupported scriptlet filter: +js(nano-sib, time.html, 1000) -Discarded unsupported scriptlet filter: +js(aost, absda) -Discarded unsupported scriptlet filter: +js(aost, Object, inlineScript) -Discarded unsupported scriptlet filter: +js(ra, type, input[value^="http"]) -Discarded unsupported scriptlet filter: +js(nano-stb, seconds) -Discarded unsupported scriptlet filter: +js(nosiif, /^/) -Discarded unsupported scriptlet filter: +js(json-prune, server) -Discarded unsupported scriptlet filter: +js(no-xhr-if, googlesyndication) -Discarded unsupported scriptlet filter: +js(nosiif, .submit) -Discarded unsupported scriptlet filter: +js(nano-sib, i--) -Discarded unsupported scriptlet filter: +js(nosiif, 0x) -Discarded unsupported scriptlet filter: +js(noeval-if, debugger) -Discarded unsupported scriptlet filter: +js(nosiif, visibility) -Discarded unsupported scriptlet filter: +js(ra, href, a#clickfakeplayer) -Discarded unsupported scriptlet filter: +js(ra, href, .fake_player > [href][target]) -Discarded unsupported scriptlet filter: +js(nano-sib, timer) -Discarded unsupported scriptlet filter: +js(no-fetch-if, googlesyndication) -Discarded unsupported scriptlet filter: +js(no-fetch-if, /adtrue\.com|eningspon\.com|freychang\.fun|orquideassp\.com|popunder/) -Discarded unsupported scriptlet filter: +js(no-xhr-if, /a-mo\.net|adnxs\.com|bidder\.criteo\.com|creativecdn\.com|e-planning\.net|quantumdex\.io/) -Discarded unsupported scriptlet filter: +js(nosiif, adblock) -Discarded unsupported scriptlet filter: +js(ra, target, #downloadvideo) -Discarded unsupported scriptlet filter: +js(nano-stb, counter) -Discarded unsupported scriptlet filter: +js(noeval-if, AdBlock) -Discarded unsupported scriptlet filter: +js(rc, preloader, .preloader) -Discarded unsupported scriptlet filter: +js(rc, placeholder-content, h5) -Discarded unsupported scriptlet filter: +js(aost, Math.random, t.pt) -Discarded unsupported scriptlet filter: +js(json-prune, clickAnywhere urls) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick*="window.open"]) -Discarded unsupported scriptlet filter: +js(ra, target|href, a[href^="//"]) -Discarded unsupported scriptlet filter: +js(aost, String.prototype.charCodeAt, _0x) -Discarded unsupported scriptlet filter: +js(json-prune, data.attributes.config.freewheel data.attributes.config.featureFlags.dPlayer) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /\st\.[a-zA-Z]*\s/) -Discarded unsupported scriptlet filter: +js(aost, Object, /(?=^(?!.*(https)))/) -Discarded unsupported scriptlet filter: +js(aost, Math.random, /\st\.[a-zA-Z]*\sinlineScript/) -Discarded unsupported scriptlet filter: +js(aost, XMLHttpRequest, /inlineScript|stackDepth:1/) -Discarded unsupported scriptlet filter: +js(aost, XMLHttpRequest, inlineScript) -Discarded unsupported scriptlet filter: +js(aost, JSON.parse, computed) -Discarded unsupported scriptlet filter: +js(aost, localStorage, inlineScript) -Discarded unsupported scriptlet filter: +js(aost, Math.floor, ) -Discarded unsupported scriptlet filter: +js(ra, href, .button[href^="javascript"]) -Discarded unsupported scriptlet filter: +js(ra, href, a#clickfkplayer) -Discarded unsupported scriptlet filter: +js(ra, uk-sticky, header, stay) -Discarded unsupported scriptlet filter: +js(ra, style, body, stay) -Discarded unsupported scriptlet filter: +js(aost, document.createElement, /(?=^(?!.*(http)))/) -Discarded unsupported scriptlet filter: +js(nano-stb, downloadBtn, *) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 7 - default.no-settimeout-if.js, default.no-addeventlistener-if.js, default.abort-on-property-read.js, default.abort-current-script.js, default.set-constant.js, default.no-windowopen-if.js, default.abort-on-property-write.js -============================ -Listset for 'alb-0': - Fetching remote https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt -Input filter count: 34 - Accepted filter count: 31 - Rejected filter count: 0 -Output rule count: 28 - Plain good: 25 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 3 - Could not salvage rule with only entity-based domain= option: filma24.* - Could not salvage rule with only entity-based domain= option: www.filma24.* - Could not salvage rule with only entity-based domain= option: filma24.* -Rejected cosmetic filters: 4 - Invalid filter: gazetatema.net###content > div > a:has-text() - Invalid filter: lajmifundit.al##.td_block_template_1 > a:has-text() - Invalid filter: lajmifundit.al##.td_block_template_1 > center > a:has-text() - Entity-based filter not supported: div.col-8:style(width: 100% !important) -CSS-generic: 6 plain CSS selectors -CSS-specific domain-based: 226 distinct filters - Combined into 104 distinct entries -CSS-specific entity-based: 13 distinct filters - Combined into 2 distinct entries -CSS-specific injectable files: 2 - 1v508t4, alb-0 -Declarative-related distinct filters: 2 distinct combined selectors -Procedural-related distinct filters: 4 distinct combined selectors -============================ -Listset for 'bgr-0': - Fetching remote https://stanev.org/abp/adblock_bg.txt -Input filter count: 673 - Accepted filter count: 673 - Rejected filter count: 0 -Output rule count: 664 - Plain good: 664 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-generic: 3 plain CSS selectors -CSS-specific domain-based: 361 distinct filters - Combined into 185 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 0nj0u7c -============================ -Listset for 'chn-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/224.txt -Input filter count: 18152 - Accepted filter count: 18104 - Rejected filter count: 0 -Output rule count: 6562 - Plain good: 6498 - Maybe good (regexes): 17 - redirect=: 36 - removeparams= (accepted/discarded): 0/0 - csp=: 6 - Unsupported: 5 - regexFilter is not RE2-compatible: ^(?!.*(bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com)).*$ - Unsupported modifier exception - Unsupported modifier exception - Invalid network filter in chn-0: @@||ad.alimama.com^$genericblock - Invalid network filter in chn-0: @@||cmechina.net^$genericblock -Rejected cosmetic filters: 3 - Invalid filter: theav.xyz##.q-body--prevent-scroll: { position: static !important; } - Invalid filter: 69xx.one##.q-body--prevent-scroll: { position: static !important; } - Invalid filter: theporn.cc##.q-body--prevent-scroll: { position: static !important; } -CSS-generic: 664 plain CSS selectors -CSS-specific domain-based: 6360 distinct filters - Combined into 2623 distinct entries -CSS-specific entity-based: 4 distinct filters - Combined into 2 distinct entries -CSS-specific injectable files: 12 - 10c4t9k, 1epmmac, 0dine18, 1nda2qo, 047b4k4, 1kh0c1s, 0uqr3ec, 0on9dh0, 179qh1c, 069n58c, 0g5sn8o, chn-0 -Declarative-related distinct filters: 50 distinct combined selectors -Procedural-related distinct filters: 90 distinct combined selectors -Discarded unsupported scriptlet filter: +js(abort-on-stack-trace, document.createElement, make_rand_div) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, adhtml, 10005) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, blockText, 1005) -Discarded unsupported scriptlet filter: +js(noeval-if, ADS_BLOCKED) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, _0x, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, adCountDown, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .s--, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, video-ad-timeout, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, r--, , 0.02) -Discarded unsupported scriptlet filter: +js(remove-attr, onclick, a) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, CloseAd, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, /timerAdCountdown|_0x/, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, timerAdCountdown, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, timerAdCountdownCount, , 0.02) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 83 -Scriptlet-related injectable files: 10 - chn-0.set-constant.js, chn-0.no-fetch-if.js, chn-0.no-settimeout-if.js, chn-0.no-addeventlistener-if.js, chn-0.no-setinterval-if.js, chn-0.abort-on-property-read.js, chn-0.abort-current-script.js, chn-0.abort-on-property-write.js, chn-0.json-prune.js, chn-0.no-windowopen-if.js -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 1 - chn-0.abort-current-script.js -============================ -Listset for 'cze-0': - Fetching remote https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt - Fetching remote https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters_ublock.txt -Input filter count: 228 - Accepted filter count: 228 - Rejected filter count: 0 -Output rule count: 124 - Plain good: 117 - Maybe good (regexes): 0 - redirect=: 4 - removeparams= (accepted/discarded): 0/0 - csp=: 1 - Unsupported: 2 - Invalid network filter in cze-0: *$image,redirect-rule=1x1.gif,domain=seznamzpravy.cz|sport.cz|seznam.cz|sbazar.cz|firmy.cz|super.cz|garaz.cz|stream.cz - Invalid network filter in cze-0: *$xhr,redirect-rule=nooptext,domain=seznamzpravy.cz|sport.cz|seznam.cz|sbazar.cz|firmy.cz|super.cz|garaz.cz|stream.cz -Rejected cosmetic filters: 1 - Invalid filter: konzolista.cz##.v-card--link:-abp-has(.ad) -CSS-generic: 36 plain CSS selectors -CSS-specific domain-based: 225 distinct filters - Combined into 146 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 0d34j1c -Declarative-related distinct filters: 7 distinct combined selectors -Procedural-related distinct filters: 5 distinct combined selectors -Discarded unsupported scriptlet filter: +js(nofab) -Discarded unsupported scriptlet filter: +js(nobab) -Discarded unsupported scriptlet filter: +js(nano-sib, ntmt_retest_btn_countdown_do, 1000) -Discarded unsupported scriptlet filter: +js(nano-stb, vendor-load, 3000) -Discarded unsupported scriptlet filter: +js(ra, style, body) -Discarded unsupported scriptlet filter: +js(aost, $.cookie, inlineScript) -Discarded unsupported scriptlet filter: +js(cookie-remover, /^_?adb/) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 27 -Scriptlet-related injectable files: 6 - cze-0.abort-on-property-read.js, cze-0.abort-current-script.js, cze-0.set-constant.js, cze-0.abort-on-property-write.js, cze-0.no-addeventlistener-if.js, cze-0.no-setinterval-if.js -============================ -Listset for 'deu-0': - Fetching remote https://easylist.to/easylistgermany/easylistgermany.txt -Input filter count: 2210 - Accepted filter count: 2210 - Rejected filter count: 0 -Output rule count: 1704 - Plain good: 1700 - Maybe good (regexes): 3 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 1 - Invalid network filter in deu-0: @@||gofeminin.de^$genericblock -Rejected cosmetic filters: 2 - Invalid filter: golem.de##li[data-article-id]:-abp-has(h3:-abp-properties(ANZEIGE)) - Invalid filter: golem.de##li[data-article-id]:-abp-has(span.media__kicker:-abp-properties(ANZEIGE)) -CSS-generic: 351 plain CSS selectors -CSS-specific domain-based: 2070 distinct filters - Combined into 1205 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 5 - 0m96u24, 16h9va8, 16p5lko, 1gpa7kc, 1chdoqs -Procedural-related distinct filters: 53 distinct combined selectors -============================ -Listset for 'fin-0': - Fetching remote https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/master/Finland_adb.txt - Fetching remote https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/master/Finland_adb_uBO_extras.txt -Input filter count: 179 - Accepted filter count: 179 - Rejected filter count: 0 -Output rule count: 157 - Plain good: 148 - Maybe good (regexes): 3 - redirect=: 3 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 3 - regexFilter is not RE2-compatible: telsu\.fi\/(?![^>]*\.\w{3}$).+ - regexFilter is not RE2-compatible: telsu\.fi\/(?![^>].*\.(jpg|png|svg|ico)$).+ - regexFilter is not RE2-compatible: telsu\.fi\/img\/(?!cloudcity|mindmax|navibg|prg|tvohjelmat) -Rejected cosmetic filters: 1 - Invalid filter: fin.afterdawn.com##.header:not(:matches-media((min-width: 750px))) + div[class] + div[class] .mobile-top-ad:not(+ .boxes):style(margin: -10px auto !important) -CSS-generic: 52 plain CSS selectors -CSS-specific domain-based: 988 distinct filters - Combined into 426 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 17u9qi4, 09be90g -Declarative-related distinct filters: 15 distinct combined selectors -Procedural-related distinct filters: 92 distinct combined selectors -Discarded unsupported scriptlet filter: +js(rc, st__hidden, #gamewrapper) -Discarded unsupported scriptlet filter: +js(rc, Profile__TopCard--advertisement, , stay) -Discarded unsupported scriptlet filter: +js(rc, SearchResultList--advertisement, , stay) -Discarded unsupported scriptlet filter: +js(rc, SearchResultList__Row--advertisement, , stay) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 4 -Scriptlet-related injectable files: 3 - fin-0.no-settimeout-if.js, fin-0.abort-current-script.js, fin-0.abort-on-property-read.js -============================ -Listset for 'fra-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/16.txt -Input filter count: 21143 - Accepted filter count: 20582 - Rejected filter count: 546 -Output rule count: 6606 - Plain good: 6553 - Maybe good (regexes): 7 - redirect=: 29 - removeparams= (accepted/discarded): 0/0 - csp=: 6 - Unsupported: 11 - regexFilter is not RE2-compatible: ^https?:\/\/vitamiiin\.com\/(?!wp-content|uploads|plugins|themes)(.*) - regexFilter is not RE2-compatible: ^(?!.*(bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com)).*$ - Could not salvage rule with only entity-based domain= option: downdetector.* - Could not salvage rule with only entity-based domain= option: vidembed.* - Could not salvage rule with only entity-based domain= option: vidembed.* - Could not salvage rule with only entity-based domain= option: fmovies.* - Could not salvage rule with only entity-based domain= option: fmovies.* - Unsupported modifier exception - Unsupported modifier exception - Invalid network filter in fra-0: @@$webrtc,domain=stream4free.live - Invalid network filter in fra-0: $webrtc,domain=11anim.com|1337x.st|1337x.to|2ddl.ms|ajplugins.com|allitebooks.com|androidadult.com|animeid.tv|animekb.net|animeland.tv|animezone.pl|avametrie.fr|avgle.com|bindassbros.com|blizzboygames.net|bonstreams.net|catrumahminimalis.me|centrum-dramy.pl|cestpasbien.pro|chatytvgratis.net|cinemitas.com|cinestrenostv.tv|clik.pw|cmacapps.com|cocostreaming.com|crictime.com|crictime.is|daclips.com|datpiff.com|ddl.to|ddmix.net|ddownload.com|deltabit.co|deportesmax.info|descargas2020.com|djs.sk|dl-protect.info|dompl3.info|doodstream.co|doodstream.com|draculastream.org|drakula.top|dropapk.com|dropapk.to|dualpaste.net|earnwithshortlink.com|ebook-planete.org|ebookdz.com|fileone.tv|filmeserialeonline.org|filmtelecharger.net|flashx.net|flashx.tv|fluvore.com|free-telecharger.com|free-telecharger.net|free-telecharger.org|free-telecharger.xyz|freecardano.com|freenem.com|fullmatchesandshows.com|gamestorrent.co|ganol.ru|ganool.im|ganool123.com|gtaall.com|gum-gum-streaming.com|hdvid.online|healthoptimizer.net|heapfiles.com|hq-porns.com|ianimes.org|iegy.best|imagenesmy.com|imgazure.com|immunicity.st|istream2watch.com|ithepiratebay.com|javher.com|jheberg.net|jkanime.net|kinohabr.net|kinokrad.co|kinoprofi.org|kinostuff.com|kinox.me|kinox.tv|kiss-anime.ws|kissasian.ch|kissasian.sh|kooralive.info|kora-live.tv|lafmacun.net|larati.net|latino-webtv.com|leggendaweb.com|leitor.net|lemondedekevin.fr|lewd.ninja|liketvw.com|liveflashplayer.org|lordhd.com|love-drama.pl|ma-famille-dabord-streaming.com|mangaku.in|mejortorrent.org|mejortorrent1.com|mkvcage.com|modsbase.com|monova.org|movie4k.is|movie4k.org|movies123.ac|mp4mania.xyz|multiimg.com|myfeed4u.com|mywatchseries.stream|netiap.com|nicoblog.org|nonpiusolo.com|o2tvseries.com|oasivip.com|oceanoffgames.com|oipeirates.online|onion.ly|onion.pet|openload.cc|openload.ch|openload.fun|opensubtitles.org|ovid.online|ovid.tv|papstream.info|pastehere.xyz|pcgamestorrents.com|pdf-giant.com|peeplink.in|pelislatino3gp.biz|pinoybay.ch|piratebayblocked.com|planet-streaming.net|planete-bd.org|planetfools.com|povwideo.cc|powvideo.cc|powvideo.net|putload.tv|radiofly.ws|reactor.cc|readmanga.today|regarder-le-bureau-des-legendes-streaming.com|regarder-malcolm-streaming.com|regarder-peaky-blinders-streaming.xyz|rivosport.co|rojadirecta.fr|sawlive.tv|scuseami.net|senmanga.com|sharemods.com|sherlockonline.ru|shippuden.tv|short.pe|shrink-service.it|sintelevisor.com|sleeptimer.org|slyid.com|solarmovie.one|sorteosrd.com|srt.am|starmusiq.one|strdef.world|stream2watch.org|stream4free.live|streambeam.io|streamcdn.to|streamcloud.eu|streamhunter.net|streamhunter.top|streamplay.me|streamplay.to|subswiki.com|supervideo.tv|tamilmv.cz|tarjetarojatvonline.com|telerium.tv|teleriumtv.net|theappguruz.com|thepiratebay.cr|thepiratebay.vip|thevid.net|thevid.tv|thevideo.ch|thevideo.io|thevideo.me|thevideo.us|tomadivx.tv|topsimages.com|torlock.com|torlock2.com|tpbprox.com|tubetitties.com|tvshqiphd.com|uii.io|ukpass.co|unblocked2.fun|unblocked2.vip|unblocksites.co|up-4.net|upbom.com|upbom.net|upload.ee|uploadfiles.eu|uploadocean.com|uppom.live|uptostream.com|upvid.host|vcrypt.net|veehd.com|vergol.com|verliga1.net|vertelevisor.com|vev.io|vev.red|videobin.co|videowood.tv|vidfile.net|vidoza.co|vidoza.net|vidshare.tv|vidup.io|vidup.tv|viewasian.tv|vup.to|watchonline.to|watchpornfree.ws|wstream.to|wstream.video|x1337x.eu|x1337x.se|x1337x.ws|xclusivejams.com|xfilesharing.com|xrivonet.info|xvideosharing.com|yify-torrent.org|zeroshare.me|zipansion.com|zone-ebook.com -CSS-generic: 2406 plain CSS selectors -CSS-specific domain-based: 2052 distinct filters - Combined into 1165 distinct entries -CSS-specific entity-based: 3 distinct filters - Combined into 2 distinct entries -CSS-specific injectable files: 6 - 0uu5nhk, 16ab7r0, 05k9bg4, 0unu1ek, 1rh6ilk, fra-0 -Declarative-related distinct filters: 32 distinct combined selectors -Procedural-related distinct filters: 74 distinct combined selectors -Discarded unsupported scriptlet filter: +js(abort-on-stack-trace, document.createEvent, Object.trigger) -Discarded unsupported scriptlet filter: +js(remove-attr, href, a[href]#clickfakeplayer) -Discarded unsupported scriptlet filter: +js(remove-class, with-ad, div) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, #regarder, 7000, 0.02) -Discarded unsupported scriptlet filter: +js(remove-attr, href|target, a[href]#clickfakeplayer) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 58 -Scriptlet-related injectable files: 10 - fra-0.no-fetch-if.js, fra-0.abort-current-script.js, fra-0.set-constant.js, fra-0.abort-on-property-read.js, fra-0.abort-on-property-write.js, fra-0.no-settimeout-if.js, fra-0.no-setinterval-if.js, fra-0.no-addeventlistener-if.js, fra-0.json-prune.js, fra-0.no-windowopen-if.js -============================ -Listset for 'grc-0': - Fetching remote https://www.void.gr/kargig/void-gr-filters.txt -Input filter count: 455 - Accepted filter count: 455 - Rejected filter count: 0 -Output rule count: 434 - Plain good: 434 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-generic: 1 plain CSS selectors -CSS-specific domain-based: 492 distinct filters - Combined into 165 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 1s6equc -Declarative-related distinct filters: 5 distinct combined selectors -Procedural-related distinct filters: 2 distinct combined selectors -============================ -Listset for 'hun-0': - Fetching remote https://raw.githubusercontent.com/hufilter/hufilter/master/hufilter-ublock.txt -Input filter count: 326 - Accepted filter count: 326 - Rejected filter count: 0 -Output rule count: 202 - Plain good: 201 - Maybe good (regexes): 1 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -Rejected cosmetic filters: 2 - Invalid filter: autosjog.hu##p + center:-abp-has(iframe[data-src*="facebook"]) - Invalid filter: hirado.hu##.hover_bkgr_fricc:-abp-has(.facebookPopupCloseButton) -CSS-generic: 60 plain CSS selectors -CSS-specific domain-based: 1118 distinct filters - Combined into 457 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 1k6d35o, 0q1b0fo -Declarative-related distinct filters: 15 distinct combined selectors -Procedural-related distinct filters: 8 distinct combined selectors -Discarded unsupported scriptlet filter: +js(ra, style, body, stay) -Discarded unsupported scriptlet filter: +js(rc, modal-open, body) -Discarded unsupported scriptlet filter: +js(window.open-defuser.js) -Discarded unsupported scriptlet filter: +js(ra, class, section[class="life-section l-section-main article-section l-section-article"]) -Discarded unsupported scriptlet filter: +js(ra, oncontextmenu) -Discarded unsupported scriptlet filter: +js(rc, bottom-l, body, stay) -Discarded unsupported scriptlet filter: +js(rc, bottom-s, body, stay) -Discarded unsupported scriptlet filter: +js(rc, modal-open, body, stay) -Discarded unsupported scriptlet filter: +js(rc, have-ad, body) -Discarded unsupported scriptlet filter: +js(ra, style, body) -Discarded unsupported scriptlet filter: +js(rc, darken, body) -Discarded unsupported scriptlet filter: +js(rc, blurry, body > :not(.m-fbPopup), stay) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 16 -Scriptlet-related injectable files: 5 - hun-0.abort-current-script.js, hun-0.set-constant.js, hun-0.no-settimeout-if.js, hun-0.abort-on-property-write.js, hun-0.no-addeventlistener-if.js -============================ -Listset for 'idn-0': - Fetching remote https://raw.githubusercontent.com/ABPindo/indonesianadblockrules/master/subscriptions/abpindo.txt -Input filter count: 4279 - Accepted filter count: 4279 - Rejected filter count: 0 -Output rule count: 3035 - Plain good: 3035 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -Rejected cosmetic filters: 1 - Invalid filter: neonime.net##[data-src^="https://neonime.net/wp-content/"]:xpath(..) -CSS-generic: 228 plain CSS selectors -CSS-specific domain-based: 748 distinct filters - Combined into 418 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 16j1s2c, 1p8jqt8 -Declarative-related distinct filters: 2 distinct combined selectors -============================ -Listset for 'ind-0': - Fetching remote https://easylist-downloads.adblockplus.org/indianlist.txt -Input filter count: 5355 - Accepted filter count: 5355 - Rejected filter count: 0 -Output rule count: 5317 - Plain good: 5317 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -Rejected cosmetic filters: 1 - Invalid filter: cricketkhabara.com##div[id^="AS_O_LHS_"] > div:nth-child(15 + n) -CSS-specific domain-based: 3381 distinct filters - Combined into 2342 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 10 - 1uep4cc, 108kan8, 0o7s4c8, 1lma5p4, 1kas0f0, 0reeku0, 0o3egto, 0qet990, 0tkm29g, 1uhnbf4 -Procedural-related distinct filters: 51 distinct combined selectors -============================ -Listset for 'irn-0': - Fetching remote https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt -Input filter count: 1427 - Accepted filter count: 1427 - Rejected filter count: 0 -Output rule count: 550 - Plain good: 515 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 8/26 - csp=: 0 - Unsupported: 27 - FilterStrictParty: Strict partyness strict3p not supported - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /itm/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ -CSS-generic: 14 plain CSS selectors -CSS-specific domain-based: 687 distinct filters - Combined into 333 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 1ajokus, 1bs0jro -Declarative-related distinct filters: 40 distinct combined selectors -Procedural-related distinct filters: 62 distinct combined selectors -Discarded unsupported scriptlet filter: +js(nano-sib) -Discarded unsupported scriptlet filter: +js(nano-stb) -Discarded unsupported scriptlet filter: +js(ra, onselectstart|oncopy|oncontextmenu, body) -Discarded unsupported scriptlet filter: +js(rc, ads-track, , stay) -Discarded unsupported scriptlet filter: +js(nano-stb, document.getElementById, *, 0.01) -Discarded unsupported scriptlet filter: +js(window-close-if, /[Ss][Mm][Oo][Ss][Tt][Aa][Ff][Aa][Mm][Oo][Oo][Ss][Aa][Vv][Ii]/) -Discarded unsupported scriptlet filter: +js(cookie-remover, tracker_visitor_id) -Discarded unsupported scriptlet filter: +js(ra, draggable, , stay) -Discarded unsupported scriptlet filter: +js(nano-stb, , , 0) -Discarded unsupported scriptlet filter: +js(ra, disabled, , stay) -Discarded unsupported scriptlet filter: +js(nano-sib, , , 0) -Discarded unsupported scriptlet filter: +js(cookie-remover, captcha_key) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 39 -Scriptlet-related injectable files: 7 - irn-0.no-windowopen-if.js, irn-0.no-xhr-if.js, irn-0.set-constant.js, irn-0.abort-current-script.js, irn-0.abort-on-property-read.js, irn-0.no-addeventlistener-if.js, irn-0.no-settimeout-if.js -============================ -Listset for 'isl-0': - Fetching remote https://adblock.gardar.net/is.abp.txt -Input filter count: 68 - Accepted filter count: 68 - Rejected filter count: 0 -Output rule count: 68 - Plain good: 68 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -Rejected cosmetic filters: 1 - Invalid filter: pressan.is###13_3623 -CSS-specific domain-based: 121 distinct filters - Combined into 43 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 10m5bbk -============================ -Listset for 'isr-0': - Fetching remote https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt - Fetching remote https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew-uBO.txt -Input filter count: 708 - Accepted filter count: 707 - Rejected filter count: 1 -Output rule count: 283 - Plain good: 250 - Maybe good (regexes): 4 - redirect=: 10 - removeparams= (accepted/discarded): 0/0 - csp=: 1 - Unsupported: 18 - regexFilter is not RE2-compatible: haaretz\.co\.il\/(?!.*\.(js)($|\?)).* - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+(api-mail|dal|dcx|isc|iscwne|6days|animals|astrology|b|buzzit|calendar|cars|celebs|e|elections|euro|fashion|finance|food|forums|fun|healthy|home|judaism|kids|mag|maps|milon|movies|mundial|nadlan|news|nick|olympics|search|sports|tags|tech|translate|travel|tv-guide|tv|usaelections|viva|vod|weather|www)\.walla\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+walla\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+www\.sheee\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+sheee\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+www\.(walla(news|shops|tours|art|print)|hamal|sheee)\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+(walla(news|shops|tours|art|print)|hamal|sheee)\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+(www\.(walla(news|shops|tours|art|print)|hamal)|(api-mail|dal|dcx|isc|iscwne|www)\.walla)\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+(walla(news|shops|tours|art|print)?|hamal)\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*((gov|idf|muni|ac|k12|net)\.il|(google|blogspot|phpbb|minifier|enable|nagich|nagishplus|nagishly|livedns|user-a|emap|23tv|glz|icast|ecast|mediacast|live1|siz|gif|meduzot|telesport|teleline|livegames|2net|weather2day|mekorotapp|e-vrit|fav|slash|rabbi|kaplanopensource|systematics|israelcoronamap|icdn|wcdn|wallanews|wallashops|wallatours|wallaart|wallaprint|hamal|sheee|globes|madlan|yad2|mipo|b144|bezeq|yes|fxp|nick|d|maariv|iol|dominos|magazineitsuv|doctors|mishpati|lawguide|arcdb|zebarur|wlcdn|linicom|erate)\.co\.il|(kan|kankids|makan|iba|oref|iaf|parks|imj|nli|bh|isoc|hebrew-academy|kineret|teva|zavit|ip6|profile)\.org\.il)\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.il\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(facebook|fbcdn|dmcdn|slideshare|cloudfront|cloudflare|fastly|fastlylb|gammacdn|edgecastcdn|footprint|incapdns|cloudapp|brightcove|jsdelivr|akamai|akamaihd|akamaized|akamaiedge|akahost|ctedgecdn|2mdn|edgesuite|azurewebsites|azureedge|windows|hwcdn|zencdn|llnwd|llnwi|boltdns|msecnd|bitsngo|nocookie|datatables|docdroid|algolia|anvato|maphub|dwcdn|typekit|edgefonts|recaptcha|ampproject|yastatic|behance|darksky|twitchcdn|ttvnw|jtvnw|dailyuploads|deviantart|8ch|b-cdn|vodgc|hlsplayer|streamlock|web-view|streamgates|cdnwz|playgorithm|vidiom|radwarecloud|f-static|chartbeat|doubleclick|advsnx|sc-static|artipbox)\.net\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.net\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(flowplayer|amara|h5p|d3js|ampproject|promisejs|backbonejs|angularjs|dojotoolkit|openstreetmap|wmflabs|wikimapia|wikimedia|wikipedia|w3|schema|archive|mozilla|documentcloud|w|mathjax|userway|pannellum|tmdb|muses|openweathermap|uploadimage|postimages|postimage|imgsafe|4chan|4channel|4cdn|telegram|olympic|pbs|pbskids|npr|ntp|gnu|creativecommons|eff|icann|iana|ietf|wikileaks|ourworldindata|cdn77|browser-update|consensu|wp-accessibility|covid19maps|coronaisrael)\.org\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.org\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(google|gstatic|googleapis|jquery|youtube|ytimg|facebook|fbsbx|twitter|twimg|instagram|cdninstagram|pinterest|pinimg|tumblr|giphy|vimeo|vimeocdn|dailymotion|flickr|staticflickr|soundcloud|sndcdn|scribd|scribdassets|sharethis|addthis|addthisedge|addthiscdn|reddit|redditmedia|redditstatic|redditgifts|linkedin|licdn|fontawesome|image-maps|cloudflare|bootstrapcdn|unpkg|cdnjs|stackpathdns|stackpathcdn|maxcdn|maxcdn-edge|netdna-ssl|netdna-cdn|kxcdn|ssl-cdn|muicss|tinymce|createjs|github|githubusercontent|aspnetcdn|azure|amazonaws|elasticbeanstalk|rackcdn|netlify|jwplayer|jwpcdn|jwpltx|jwpsrv|jwplatform|brightcove|brightcovecdn|flowplayer|foliovision|streamable|omnystudio|omnycontent|mixcloud|iheart|bandcamp|bcbits|podbean|buzzsprout|nobexpartners|podtail|spreaker|simplecast|spotify|vocaroo|embedly|iframely|snapwidget|thinglink|infogram|highcharts|printfriendly|algolianet|gravatar|imgur|imgflip|gifer|gfycat|tenor|unsplash|freepik|svgur|svgshare|icons8|iconfinder|iconarchive|iconscout|flaticon|kindpng|pngitem|disqus|disquscdn|disqusservice|oneall|oneallcdn|tapatalk|tapatalk-cdn|mapbox|maptiler|mapquest|arcgis|arcgisonline|esri|here|ted|tedcdn|kickstarter|riddle|strawpoll|9gag|9cache|imageshack|tinypic|photobox|photobucket|imgbox|imagebam|gifyu|makeagif|reactiongifs|gifbin|gif-finder|kym-cdn|gyazo|prntscr|pastebin|rawgit|rawgithub|knockoutjs|gridstackjs|ravenjs|liveleak|metacafe|mcstatic|ign|ignimgs|365scores|buzzfeed|digg|stumbleupon|mix|getpocket|blogspot|wordpress|wp|videopress|wptavern|livejournal|withgoogle|googlegroups|googleusercontent|googlevideo|ggpht|youtube-nocookie|appspot|firebaseio|firebaseapp|libring|hcaptcha|paypal|paypalobjects|amazon|media-amazon|media-imdb|ebay|apple|microsoft|live|bing|msn|yahoo|yimg|yahooapis|duckduckgo|yandex|webflow|rtlcss|dropbox|dropboxusercontent|dropboxstatic|dropbox-dns|timeanddate|momentjs|weather|accuweather|theweathernetwork|windy|sat24|rainviewer|uvlens|statcounter|adobe|onesignal|livefyre|pushwoosh|tinypass|addtoany|addthisevent|addevent|addtocalendar|sumo|sumome|chatango|bitly|tinyurl|ipcamlive|playstation|discord|discordapp|mixer|tiktok|tiktokcdn|ttwstatic|muscdn|ibytedtos|rumble|bitchute|parler|gab|deviantart|firefoxusercontent|box|feedly|feedburner|phpbb|vk|userapi|whatsapp|vroptimal-3dx-assets|bbc|cnn|go|nytimes|nyt|today|gofundme|fifa|uefa|nba|turner|xkcd|mtvnservices|cc|tmz|bugsnag|zoro|hebcal|fontsproject|kayma|kayma-dashboards|kayma-insights|kampyle|vicomi|openweb|kaltura|cincopa|avplayer|vidnt|peer5|h-cdn|bynetcdn|cdnwiz|best-tv|viewbix|streamrail|smv-cdn|cloudvideoplatform|waze|hunchbots|jeeng|cloudinary|sphereup|poloriz|applicaster|cloudwm|cloudwm-waf|negishim|accessibe|accessibeapp|acsbap|vollotech|mk-sense|allyable|shortaudition|spaceil|clear-map|segmanta|opinionstage|playbuzz|apester|qmerce|outbrain|taboola|taboolasyndication|googleoptimize|google-analytics|googletagservices|googletagmanager|googleadservices|googlesyndication|dynamicyield|scorecardresearch|serving-sys|chartbeat|exposebox|coralogix|browsiprod|ip-api|petametrics|cooladata|hotjar|pusher|carto|fortvision|fortcdn|getsentry|trackjs|gamezhero|nick|nickjr|teennick|travelriskmap|sinclairstoryline|fresnobee|nbcchicago|magazina-il|raxcdn|pagewiz|pas-rahav|aniview|adnxs|sekindo)\.com\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.com\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:]+\.(il|com|net|org|gov|mil|edu|int|(ac|nhs)\.uk)|[0-9\.]+|([^\/\:\.]+\.)*(omny\.fm|github\.io|socket\.io|codepen\.io|polyfill\.io|embed\.ly|iframe\.ly|infogr\.am|flourish\.studio|flourish\.rocks|uri\.sh|po\.st|plyr\.io|piano\.io|spot\.im|spots\.im|periscope\.tv|pscp\.tv|vine\.co|popkey\.co|tenor\.co|redd\.it|ibb\.co|vgy\.me|postimg\.cc|imageshack\.us|prnt\.sc|imagesup\.co|weserv\.nl|telesco\.pe|powr\.io|simplecast\.fm|anchor\.fm|pippa\.io|last\.fm|scdn\.co|adobe\.io|lmao\.ninja|disease\.sh|web\.app|twitch\.tv|rmbl\.ws|vid\.me|h-cdn\.co|minute\.ly|vttp\.co|tldw\.me|feeder\.co|del\.icio\.us|telegram\.me|yandex\.ru|dailymail\.co\.uk|bbc\.net\.uk|bbc\.co\.uk|cnn\.io|bit\.ly|goo\.gl|g\.co|youtu\.be|t\.co|t\.me|fb\.me|m\.me|instagr\.am|wa\.me|amzn\.to|wp\.me|git\.io|docdro\.id|arcg\.is|ow\.ly|disq\.us|discord\.gg|tiny\.cc|ex\.co|nagishly\.co|user1st\.info|knesset\.tv|103\.fm|nickjr\.tv|logidea\.info|zoomanalytics\.co|firstimpression\.io|rtk\.io|trb\.tv|ren\.tv|atom-data\.io|sentry\.io|outbid\.io))\.?([\/\:]|$))^[^\/\:\.]+\:\/+[^\/\:\.] - Invalid network filter in isr-0: ||doubleclick.net^$xhr,redirect-rule=nooptext,domain=13news.co.il|13tv.co.il - Invalid network filter in isr-0: *$webrtc,domain=walla.co.il - Invalid network filter in isr-0: *$webrtc,domain=ynet.co.il - Invalid network filter in isr-0: *$webrtc,domain=mako.co.il - Invalid network filter in isr-0: *$webrtc,domain=globes.co.il - Invalid network filter in isr-0: *$webrtc,domain=calcalist.co.il - Invalid network filter in isr-0: *$webrtc,domain=13news.co.il|13tv.co.il - Invalid network filter in isr-0: *$webrtc,domain=yad2.co.il -Rejected cosmetic filters: 2 - Invalid filter: haaretz.co.il##span:has([href*="promo"]):xpath(..) - Entity-based filter not supported: #afterLoad:style(display: block !important) -CSS-generic: 5 plain CSS selectors -CSS-specific domain-based: 377 distinct filters - Combined into 120 distinct entries -CSS-specific entity-based: 1 distinct filters - Combined into 1 distinct entries -CSS-specific injectable files: 2 - 0at4bf0, isr-0 -Declarative-related distinct filters: 3 distinct combined selectors -Discarded unsupported scriptlet filter: +js(nowebrtc) -Discarded unsupported scriptlet filter: +js(aost, Math, injectedScript) -Discarded unsupported scriptlet filter: +js(cookie-remover, /r13_maavron/) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 12 -Scriptlet-related injectable files: 6 - isr-0.abort-on-property-read.js, isr-0.no-settimeout-if.js, isr-0.abort-on-property-write.js, isr-0.no-addeventlistener-if.js, isr-0.set-constant.js, isr-0.abort-current-script.js -============================ -Listset for 'ita-0': - Fetching remote https://easylist-downloads.adblockplus.org/easylistitaly.txt -Input filter count: 5706 - Accepted filter count: 5706 - Rejected filter count: 0 -Output rule count: 5432 - Plain good: 5427 - Maybe good (regexes): 4 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 1 - Invalid network filter in ita-0: $webrtc,domain=hentaisaturn.com|italydownload.com|mitoitalico.com|semprehawk.com -CSS-generic: 359 plain CSS selectors -CSS-specific domain-based: 3317 distinct filters - Combined into 2103 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 9 - 0bv6itg, 19d3m90, 0d79a1c, 0us1uv8, 124vgoo, 1ipijg8, 0m7f27g, 14hmpr0, 0aka1v8 -Procedural-related distinct filters: 21 distinct combined selectors -============================ -Listset for 'jpn-1': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/7.txt -Input filter count: 1277 - Accepted filter count: 1276 - Rejected filter count: 0 -Output rule count: 860 - Plain good: 822 - Maybe good (regexes): 13 - redirect=: 21 - removeparams= (accepted/discarded): 0/1 - csp=: 0 - Unsupported: 4 - regexFilter is not RE2-compatible: \/kyodopress_cms\/wp-content\/(themes\/kyodopress\/img_banner\/(?!bn_newspaper\.gif)|banners).* - regexFilter is not RE2-compatible: ^(?!.*(bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com)).*$ - Unsupported regex-based removeParam: /^(cookie|ga_|u_)/ - Invalid network filter in jpn-1: ||fundingchoicesmessages.google.com^$script,redirect-rule=noop.js,domain=rocketnews24.com|youpouch.com -CSS-generic: 70 plain CSS selectors -CSS-specific domain-based: 4061 distinct filters - Combined into 2213 distinct entries -CSS-specific entity-based: 15 distinct filters - Combined into 8 distinct entries -CSS-specific injectable files: 10 - 1aoaikk, 0e8puao, 1cu9bm0, 0dv2mck, 0f37cnc, 1khf7f0, 1rc0pgk, 0d95sdk, 1m6jr28, jpn-1 -Declarative-related distinct filters: 98 distinct combined selectors -Procedural-related distinct filters: 513 distinct combined selectors -Discarded unsupported scriptlet filter: +js(remove-class, visited, #oRslt li a.visited, stay) -Discarded unsupported scriptlet filter: +js(remove-attr, style|height, amp-img) -Discarded unsupported scriptlet filter: +js(remove-attr, onclick, .amazoom1[onclick^="clickcat"][target="_blank"]) -Discarded unsupported scriptlet filter: +js(remove-attr, onclick, div[data-js][style*="background"], stay) -Discarded unsupported scriptlet filter: +js(remove-attr, onclick, [onclick^="location.href=\'https://px.a8.net"]) -Discarded unsupported scriptlet filter: +js(remove-attr, href, a[href^="https://a.r10.to/"]) -Discarded unsupported scriptlet filter: +js(remove-attr, class, #s-post) -Discarded unsupported scriptlet filter: +js(remove-attr, class, section[itemprop="articleBody"]) -Discarded unsupported scriptlet filter: +js(remove-class, with-ad, section.main) -Discarded unsupported scriptlet filter: +js(remove-attr, href, .game_amazon > a[href*=".amazon."]) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .run()}, 1000) -Discarded unsupported scriptlet filter: +js(remove-class, has-topbanner, body > header.has-topbanner) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, simplegameAdCountDown, 1000, 0.02) -Discarded unsupported scriptlet filter: +js(noeval-if, hoihoi) -Discarded unsupported scriptlet filter: +js(remove-attr, data-popup-url) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, aeriaGamesAdCountDown, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, u(!0), 5000) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, [native code], 15000) -Discarded unsupported scriptlet filter: +js(remove-attr, onclick, span > a[onclick]) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, visibility, 4000) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, [native code], 2000, 0.3) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, [native code], 3000, 0.25) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, [native code], 4000, 0.2) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 51 -Scriptlet-related injectable files: 7 - jpn-1.no-settimeout-if.js, jpn-1.no-fetch-if.js, jpn-1.abort-current-script.js, jpn-1.set-constant.js, jpn-1.no-addeventlistener-if.js, jpn-1.abort-on-property-read.js, jpn-1.no-windowopen-if.js -Discarded unsupported scriptlet filter: +js(no-fetch-if, cdn.adschill.com) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 2 - jpn-1.no-settimeout-if.js, jpn-1.abort-current-script.js -============================ -Listset for 'kor-1': - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filter-uBO.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/3rd_domains.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/1st_domains.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/general_elemhide.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/specific_ELEMHIDE.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/general_url.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/general_url.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/specific_URL.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/specific_ELEMHIDE.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/allowlist.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/extended_css_ELEMHIDE.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/extended_css_INJECTION.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/specific_REDIRECT.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/extended_css_ELEMHIDE.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/extended_css_INJECTION.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/scriptlets.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/lkscriptlet.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/javascript.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/javascript.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/antiadblock.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/removeparam.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/allowlist.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-share/specific_CSS.txt - Fetching remote https://raw.githubusercontent.com/List-KR/List-KR/master/filters-uBO/specific_CSS.txt -Input filter count: 1068 - Accepted filter count: 1064 - Rejected filter count: 0 -Output rule count: 773 - Plain good: 637 - Maybe good (regexes): 110 - redirect=: 19 - removeparams= (accepted/discarded): 1/0 - csp=: 0 - Unsupported: 6 - regexFilter is not RE2-compatible: ^https:\/\/image\.aladin\.co\.kr\/img\/banner\/flash\/welcome\/nav\/(?!181010)[0-9]+_tab - regexFilter is not RE2-compatible: ^https:\/\/static\.wixstatic\.com\/media\/[0-9a-z]{6}_[a-z0-9]{32}~(?!.+doc).+ - regexFilter is not RE2-compatible: ^https:\/\/(www\.)?kookje\.co\.kr\/(mobile\/)?design\/(?!(bn_what300|.*naver|popup|series\/)).* - regexFilter is not RE2-compatible: ^https:\/\/thumb\.toomics\.com\/upload\/banner\/(?!main|cut) - Unpatchable redirect filter: google-ima3.js - Invalid network filter in kor-1: $redirect-rule=noop.txt,domain=lover900.net|lover901.net|lover902.net|lover903.net|lover904.net|lover905.net|lover906.net|lover907.net|lover908.net|lover909.net -Rejected cosmetic filters: 3 - Invalid filter: m.cafe.naver.com##img[src][alt="매니저 등록 배너"]:matches-path(/&|\\.|\\?)clubid=14605461(&|$)/) - Invalid filter: cafe.naver.com##img[src][alt="매니저 등록 배너"]:matches-path(/&|\\.|\\?)clubid=14605461(&|$)/) - Invalid filter: meeco.kr##.xe_content { opacity: 1 !important; } -CSS-generic: 3 plain CSS selectors -CSS-specific domain-based: 915 distinct filters - Combined into 509 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 0u0ls4g, 0qmvdj4 -Declarative-related distinct filters: 88 distinct combined selectors -Procedural-related distinct filters: 129 distinct combined selectors -Discarded unsupported scriptlet filter: +js(ra, style, html[style^='background-image:'][style*='upload.tgd.kr']) -Discarded unsupported scriptlet filter: +js(ra, placeholder, input#searchMainKeyword) -Discarded unsupported scriptlet filter: +js(ra, placeholder, input#searchKeyword) -Discarded unsupported scriptlet filter: +js(ra, placeholder, input.search_input, asap stay) -Discarded unsupported scriptlet filter: +js(nano-stb, count, , 0.001) -Discarded unsupported scriptlet filter: +js(nobab) -Discarded unsupported scriptlet filter: +js(nobab2) -Discarded unsupported scriptlet filter: +js(nofab) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 57 -Scriptlet-related injectable files: 7 - kor-1.abort-current-script.js, kor-1.set-constant.js, kor-1.no-settimeout-if.js, kor-1.no-xhr-if.js, kor-1.json-prune.js, kor-1.abort-on-property-read.js, kor-1.no-fetch-if.js -============================ -Listset for 'ltu-0': - Fetching remote https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt -Input filter count: 575 - Accepted filter count: 575 - Rejected filter count: 0 -Output rule count: 524 - Plain good: 520 - Maybe good (regexes): 1 - redirect=: 3 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-generic: 5 plain CSS selectors -CSS-specific domain-based: 516 distinct filters - Combined into 282 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 114p5ts, 0co18pg -Declarative-related distinct filters: 5 distinct combined selectors -Procedural-related distinct filters: 4 distinct combined selectors -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 7 -Scriptlet-related injectable files: 4 - ltu-0.abort-current-script.js, ltu-0.no-settimeout-if.js, ltu-0.abort-on-property-read.js, ltu-0.no-windowopen-if.js -============================ -Listset for 'lva-0': - Fetching remote https://raw.githubusercontent.com/Latvian-List/adblock-latvian/master/lists/latvian-list.txt -Input filter count: 185 - Accepted filter count: 185 - Rejected filter count: 0 -Output rule count: 144 - Plain good: 144 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-specific domain-based: 184 distinct filters - Combined into 62 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 04u4kss -============================ -Listset for 'nld-0': - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Block_General.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Block_first_party_Server.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Block_third_party_Server.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Block_Resources.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Block_Whitelist.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Hide_Specific.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Hide_General.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Hide_Whitelist.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/Anti-Adblock.txt - Fetching remote https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/gh-pages/EasyDutch/No_uBlock_Filters.txt -Input filter count: 756 - Accepted filter count: 753 - Rejected filter count: 0 -Output rule count: 651 - Plain good: 641 - Maybe good (regexes): 3 - redirect=: 3 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 4 - Could not salvage rule with only entity-based domain= option: allestoringen.* - Invalid network filter in nld-0: @@||imasdk.googleapis.com/js/sdkloader/ima3.js$script,3p,redirect-rule,domain=vrt.be - Invalid network filter in nld-0: *$image,domain=kijk.nl,redirect-rule=1x1.gif - Invalid network filter in nld-0: *$image,redirect-rule=2x2.png,domain=tweakers.net -Rejected cosmetic filters: 2 - Invalid filter: vastgoedjournaal.nl##aside:has([class]:has-text(/advert/i)):has([href]:has([src*="media.prdn.nl"]) - Invalid filter: nlsexfilmpjes.com###left_div li:not(> a[target="_blank"]) -CSS-generic: 15 plain CSS selectors -CSS-specific domain-based: 968 distinct filters - Combined into 658 distinct entries -CSS-specific entity-based: 1 distinct filters - Combined into 1 distinct entries -CSS-specific injectable files: 4 - 0paeau0, 1j8r9m0, 0durh7g, nld-0 -Declarative-related distinct filters: 5 distinct combined selectors -Procedural-related distinct filters: 175 distinct combined selectors -Discarded unsupported scriptlet filter: +js(rc, pui__root--no-seekbar, .pui__root--no-seekbar, stay) -Discarded unsupported scriptlet filter: +js(setTimeout-defuser, AdBlockerCheck) -Discarded unsupported scriptlet filter: +js(nobab) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 16 -Scriptlet-related injectable files: 9 - nld-0.no-settimeout-if.js, nld-0.abort-current-script.js, nld-0.no-fetch-if.js, nld-0.set-constant.js, nld-0.abort-on-property-write.js, nld-0.abort-on-property-read.js, nld-0.no-addeventlistener-if.js, nld-0.no-windowopen-if.js, nld-0.no-setinterval-if.js -============================ -Listset for 'nor-0': - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/AntiAdblockEntries.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/NordicFilters-NotFirefox.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/NordicFilters-NotBrave.txt -Input filter count: 863 - Accepted filter count: 856 - Rejected filter count: 0 -Output rule count: 488 - Plain good: 435 - Maybe good (regexes): 3 - redirect=: 3 - removeparams= (accepted/discarded): 25/4 - csp=: 1 - Unsupported: 21 - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: eniro.* - Could not salvage rule with only entity-based domain= option: eniro.*|proff.* - Could not salvage rule with only entity-based domain= option: eurosport.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: discoveryplus.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Could not salvage rule with only entity-based domain= option: gamereactor.* - Unsupported regex-based removeParam: /^rs[0-9]/ - Unsupported regex-based removeParam: /^source=partnerads$/ - Unsupported regex-based removeParam: /^source=tradedoubler$/ - Unsupported regex-based removeParam: /^amp;/ -Rejected cosmetic filters: 9 - Entity-based filter not supported: .teaser__native:upward(4) - Entity-based filter not supported: #whitetop:style(margin-top: 0px !important) - Entity-based filter not supported: .n_ListHeader:style(margin-top: 5px !important) - Entity-based filter not supported: .aside-image-with-link:has([href^="https://www.whatsnxt.io/"]) - Entity-based filter not supported: #pagebackground:style(background-image: none !important) - Entity-based filter not supported: .artistyle3:has(h4:has-text(/sponsored/i)) - Entity-based filter not supported: .external_div_bigVideoAd:remove() - Entity-based filter not supported: a[href^="/grtv/"][title*=Sponsored]:upward(1) - Entity-based filter not supported: article.rwd_row:has(a[href$="/sponsoredcontent/"]) -CSS-generic: 124 plain CSS selectors -CSS-specific domain-based: 897 distinct filters - Combined into 495 distinct entries -CSS-specific entity-based: 44 distinct filters - Combined into 13 distinct entries -CSS-specific injectable files: 3 - 051n0pg, 0b7g3rg, nor-0 -Declarative-related distinct filters: 29 distinct combined selectors -Procedural-related distinct filters: 123 distinct combined selectors -Discarded unsupported scriptlet filter: +js(golem.de.js) -Discarded unsupported scriptlet filter: +js(ra, data-track) -Discarded unsupported scriptlet filter: +js(std, (), 2500) -Discarded unsupported scriptlet filter: +js(ra, class, .dfp-loaded) -Discarded unsupported scriptlet filter: +js(nofab) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 14 -Scriptlet-related injectable files: 7 - nor-0.set-constant.js, nor-0.abort-current-script.js, nor-0.abort-on-property-read.js, nor-0.json-prune.js, nor-0.abort-on-property-write.js, nor-0.no-fetch-if.js, nor-0.no-addeventlistener-if.js -Discarded unsupported scriptlet filter: +js(nano-stb, timeDown) -Discarded unsupported scriptlet filter: +js(ra, autoplay) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 4 - nor-0.no-addeventlistener-if.js, nor-0.set-constant.js, nor-0.abort-current-script.js, nor-0.abort-on-property-write.js -============================ -Listset for 'pol-0': - Fetching remote https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt - Fetching remote https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt - Fetching remote https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock_ublock.txt - Fetching remote https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock-suplement.txt -Input filter count: 1430 - Accepted filter count: 1428 - Rejected filter count: 1 -Output rule count: 1054 - Plain good: 973 - Maybe good (regexes): 45 - redirect=: 27 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 9 - regexFilter is not RE2-compatible: ^https:\/\/eku24.net\/images\/slajdy\/(?!zyczenia)[a-z]{3,10}\/[a-zA-Z0-9_-]{10,50}\.jpg - regexFilter is not RE2-compatible: ^https:\/\/(?!horrortube)(?!filman.cc)(?!horlol.pl)[a-z.0-9]{3,15}\.[a-z]{2,3}\/ - regexFilter is not RE2-compatible: https?:\/\/naekranie\.pl\/wp-content\/uploads\/[0-9]{4,4}\/[0-9]{2,2}\/(?!jpg)[0-9a-z]{7,10}$ - regexFilter is not RE2-compatible: https?:\/\/(?!(poczta|bc))[a-z.]{3,15}\.wp\.pl\/.{20,} - regexFilter is not RE2-compatible: ^http:\/\/((?!192\.168)(?!10\.)(?!172\.16)(?!172\.17)(?!172\.18)(?!172\.19)(?!172\.2)(?!172\.30)(?!172\.31)([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/[a-zA-Z0-9]{30,} - regexFilter is not RE2-compatible: ^(http|https):\/\/www\.portel\.pl\/(?!pasaz)[-a-z0-9A-Z_%$&+=[\].]{1,200}\/[-a-z0-9A-Z_%$&+=[\]/.]{2,200}.(html|htm) - regexFilter is not RE2-compatible: ^(http|https):\/\/(?!www.speedvid)(?!streamcherry.com)(?!vshare)(?!vidoza)(?!www.youtube)[a-zA-Z0-9\W]{5,10}.[a-z]{2,20}\/(?!anime)[\w\W\d]{5,20}\/[a-z]{5,20}\/ - Could not salvage rule with only entity-based domain= option: trojmiasto.* - Could not salvage rule with only entity-based domain= option: trojmiasto.* -Rejected cosmetic filters: 15 - Invalid filter: www.money.pl###app > div > div:matches-css(background-image: /^url\("https:\/\/v\.wpimg\.pl/) - Invalid filter: www.dobreprogramy.pl##:xpath(//div[contains(text(), 'REKLAMA')]) - Invalid filter: www.dobreprogramy.pl##:xpath(//a[not(contains(@href,','))][string-length(@href)>1600]) - Invalid filter: www.wp.pl##:xpath(//div[@data-st-area='Zakupy'][count(*)=2][not(header)]) - Invalid filter: www.wp.pl##:xpath(//div[count(*)=3][img[@class][@src]][*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=0]]) - Invalid filter: wp.pl##:xpath(//div[count(*)=3][img[@class][@src]][*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=0]]) - Invalid filter: parenting.pl##:xpath(//div[count(*)=1][*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=0]]) - Invalid filter: parenting.pl##:xpath(//div[count(*)=1][*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=1]/*[count(*)=0]]) - Invalid filter: elka.pl##:xpath(//*[@align="center"][contains(text(), 'reklama')]) - Invalid filter: miedziowe.pl##:xpath(//*[@align="center"][contains(text(), 'reklama')]) - Invalid filter: google.com##.rllt__link:has( > div[class]:has-text(Reklama)):xpath(..) - Invalid filter: google.pl##.rllt__link:has( > div[class]:has-text(Reklama)):xpath(..) - Invalid filter: stooq.pl##:xpath(//*[@align="center"]/*[@id][contains(text(),"REKLAMA")]) - Invalid filter: stooq.com##:xpath(//*[@align="center"]/*[@id][contains(text(),"REKLAMA")]) - Invalid filter: epidemia-koronawirus.pl##body > div:nth-of-type(1)[style^="display: block;"]:not(#page) -CSS-generic: 61 plain CSS selectors -CSS-specific domain-based: 4160 distinct filters - Combined into 2706 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 11 - 17gfon8, 1veuvgg, 15mh63k, 10trdb0, 1s6btns, 0t127ro, 1ee44p8, 0t0ei1g, 08mbm44, 01l4lb8, 1am0cb8 -Declarative-related distinct filters: 99 distinct combined selectors -Procedural-related distinct filters: 74 distinct combined selectors -Discarded unsupported scriptlet filter: +js(noeval) -Discarded unsupported scriptlet filter: +js(nano-remove-elements-onready.js, #skyBanner) -Discarded unsupported scriptlet filter: +js(aost, WP, r https) -Discarded unsupported scriptlet filter: +js(aost, WP.prebid, onLoad) -Discarded unsupported scriptlet filter: +js(noeval-if, RTCPeerConnection) -Discarded unsupported scriptlet filter: +js(ra, scrolling, iframe#sg-iframe[scrolling="no"], stay) -Discarded unsupported scriptlet filter: +js(nano-stb) -Discarded unsupported scriptlet filter: +js(nano-stb, function, 1000, 0.02) -Discarded unsupported scriptlet filter: +js(nano-remove-elements-onready.js, .screening) -Discarded unsupported scriptlet filter: +js(nano-sib) -Discarded unsupported scriptlet filter: +js(nano-sib, redirectId) -Discarded unsupported scriptlet filter: +js(nano-stb, TheLink) -Discarded unsupported scriptlet filter: +js(insert-iframe, 1, honeypot, https://www.napiprojekt.pl/napisy-42731-Ostatni-U-Boot-(1993), width: 1px !important; height: 1px !important; position: absolute !important; left: -3000px !important) -Discarded unsupported scriptlet filter: +js(ac, active, #m_hot_1) -Discarded unsupported scriptlet filter: +js(ac, box_active, #hot_1) -Discarded unsupported scriptlet filter: +js(set-constant.js, showAds, true) -Discarded unsupported scriptlet filter: +js(abort-on-property-read.js, checkAds) -Discarded unsupported scriptlet filter: +js(setTimeout-defuser.js, hasAdblock) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, fuckAdBlock) -Discarded unsupported scriptlet filter: +js(addEventListener-defuser.js, load, onload) -Discarded unsupported scriptlet filter: +js(setTimeout-defuser.js, notDetected) -Discarded unsupported scriptlet filter: +js(set-constant.js, pp_adblock_is_off, trueFunc) -Discarded unsupported scriptlet filter: +js(nofab) -Discarded unsupported scriptlet filter: +js(noeval.js) -Discarded unsupported scriptlet filter: +js(setInterval-defuser.js, muted, 8000) -Discarded unsupported scriptlet filter: +js(setTimeout-defuser.js, Math.round, 5000) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, $, alert) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, document.addEventListener, adblocka) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, atob, decodeURIComponent) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, addBlocking) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js,document.getElementById, block) -Discarded unsupported scriptlet filter: +js(setTimeout-defuser.js, AdBlock) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, czy_wlaczony_adblock) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, parseInt, adblock) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, Vublock) -Discarded unsupported scriptlet filter: +js(set-constant.js, window.google_jobrunner, noopFunc) -Discarded unsupported scriptlet filter: +js(noeval-if.js, Criteo) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, adcashMacros) -Discarded unsupported scriptlet filter: +js(set-constant.js, adsBlocked, noopFunc) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, String.fromCharCode, /(?:Math|btoa)/) -Discarded unsupported scriptlet filter: +js(nobab) -Discarded unsupported scriptlet filter: +js(no-setTimeout-if.js, adBlockTest, 100) -Discarded unsupported scriptlet filter: +js(set-constant.js, loadElementBlock, noopFunc) -Discarded unsupported scriptlet filter: +js(abort-on-property-write.js, adquestoConfig) -Discarded unsupported scriptlet filter: +js(setInterval-defuser.js, seead) -Discarded unsupported scriptlet filter: +js(abort-current-inline-script.js, IRI, Adblock) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 59 -Scriptlet-related injectable files: 8 - pol-0.no-windowopen-if.js, pol-0.abort-on-property-write.js, pol-0.no-settimeout-if.js, pol-0.abort-current-script.js, pol-0.abort-on-property-read.js, pol-0.set-constant.js, pol-0.no-addeventlistener-if.js, pol-0.no-setinterval-if.js -============================ -Listset for 'rou-1': - Fetching remote https://road.adblock.ro/lista.txt - Fetching remote https://road.adblock.ro/road-ubo.txt -No valid content for undefined -Input filter count: 510 - Accepted filter count: 509 - Rejected filter count: 0 -Output rule count: 409 - Plain good: 406 - Maybe good (regexes): 3 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -Rejected cosmetic filters: 1 - Invalid filter: istoria.md##div.d2011-block-lateral-middle:-abp-has(a[href*="voceabasarabiei.net"]) -CSS-generic: 8 plain CSS selectors -CSS-specific domain-based: 524 distinct filters - Combined into 266 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 0se21us, 0cl2sgo -Procedural-related distinct filters: 29 distinct combined selectors -============================ -Listset for 'rus-0': - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/adservers.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/first_level.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/general_block.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/general_hide.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/popup.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_antisocial.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_block.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_hide.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_special.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/thirdparty.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/whitelist.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/css-fixes-experimental.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/js-fixes-experimental.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/AWRL-non-sync.txt -Input filter count: 17266 - Accepted filter count: 17247 - Rejected filter count: 16 -Output rule count: 5926 - Plain good: 5837 - Maybe good (regexes): 19 - redirect=: 15 - removeparams= (accepted/discarded): 10/2 - csp=: 40 - Unsupported: 5 - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|each.im|ebacdn.com|edgecastcdn.net|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|gismeteo.ua|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|luxnet.ua|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|pluso.ru|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|ui.ill.in.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|each.im|ebacdn.com|edgecastcdn.net|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|gismeteo.ua|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|luxnet.ua|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|pluso.ru|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|ui.ill.in.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|each.im|ebacdn.com|edgecastcdn.net|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|gismeteo.ua|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|luxnet.ua|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|pluso.ru|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|ui.ill.in.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - Unsupported modifier exception - Unsupported regex-based removeParam: /autostart|skin_name/ -CSS-generic: 307 plain CSS selectors -CSS-specific domain-based: 9546 distinct filters - Combined into 5248 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 21 - 03ekqt0, 1ppp6cg, 1esn388, 0l1akf0, 105j3ko, 1kc6hds, 1s014fg, 0cu7530, 09ip7hg, 18d7gao, 0u1ta3c, 03fhumc, 1utmnf8, 0e16f84, 14g86bk, 127gd48, 0kf8b64, 0j6ghrg, 1lv97vg, 18slghk, 1krql2c -Declarative-related distinct filters: 499 distinct combined selectors -Procedural-related distinct filters: 221 distinct combined selectors -Discarded unsupported scriptlet filter: +js(cookie-remover, /^bda|^bltsr/) -Discarded unsupported scriptlet filter: +js(cookie-remover, /^bltsr$|^JPIqApiY$|^specific$|^substantial$/) -Discarded unsupported scriptlet filter: +js(cookie-remover, /adblock_/) -Discarded unsupported scriptlet filter: +js(cookie-remover, amedia_is_online) -Discarded unsupported scriptlet filter: +js(cookie-remover, isab) -Discarded unsupported scriptlet filter: +js(cookie-remover, yadb) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, #timer) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .numcard) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .time) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .track-download__timer) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, countdown) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, download_timer) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, js-game-loader-block, 1000, 0.0001) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, ks_counter) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, p) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, timer) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, , 30000, 0.0001) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, timer) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, zat_tick) -Discarded unsupported scriptlet filter: +js(noeval-if, ShadowRoot) -Discarded unsupported scriptlet filter: +js(remove-attr, autoplay, [data-video-player="small"], stay) -Discarded unsupported scriptlet filter: +js(remove-attr, autoplay, video, stay) -Discarded unsupported scriptlet filter: +js(remove-attr, autoplay|loop, .watch-live__link > video, stay) -Discarded unsupported scriptlet filter: +js(remove-attr, autoplay|loop, video, stay) -Discarded unsupported scriptlet filter: +js(remove-attr, class, .js-video-box__container) -Discarded unsupported scriptlet filter: +js(remove-attr, class, [data-igrozhur-promo]) -Discarded unsupported scriptlet filter: +js(remove-attr, data-autoplay, video) -Discarded unsupported scriptlet filter: +js(remove-attr, data-video-play-mode) -Discarded unsupported scriptlet filter: +js(remove-attr, disabled, .uk-modal-footer > button) -Discarded unsupported scriptlet filter: +js(remove-attr, oncontextmenu, [class], stay) -Discarded unsupported scriptlet filter: +js(remove-attr, oncontextmenu|oncopy|onselectstart) -Discarded unsupported scriptlet filter: +js(remove-attr, target, a[href*="#rcmrclid"], stay) -Discarded unsupported scriptlet filter: +js(remove-class, b-global-branding, html) -Discarded unsupported scriptlet filter: +js(remove-class, has-fullscreen-banner|has-right-direct, .public__root, stay) -Discarded unsupported scriptlet filter: +js(remove-class, noscroll, body) -Discarded unsupported scriptlet filter: +js(window-close-if, /dispatch) -Discarded unsupported scriptlet filter: +js(abort-on-stack-trace, Object.prototype.crossDomain, ecbrStart) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 261 -Scriptlet-related injectable files: 10 - rus-0.abort-current-script.js, rus-0.abort-on-property-read.js, rus-0.abort-on-property-write.js, rus-0.no-addeventlistener-if.js, rus-0.json-prune.js, rus-0.no-setinterval-if.js, rus-0.no-settimeout-if.js, rus-0.no-xhr-if.js, rus-0.set-constant.js, rus-0.no-windowopen-if.js -Discarded unsupported scriptlet filter: +js(abort-on-stack-trace, Object.prototype.parallax, window.onload) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 4 - rus-0.abort-current-script.js, rus-0.set-constant.js, rus-0.abort-on-property-read.js, rus-0.no-settimeout-if.js -============================ -Listset for 'spa-0': - Fetching remote https://easylist-downloads.adblockplus.org/easylistspanish.txt -Input filter count: 1189 - Accepted filter count: 1189 - Rejected filter count: 0 -Output rule count: 692 - Plain good: 684 - Maybe good (regexes): 7 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 1 - Invalid network filter in spa-0: $webrtc,domain=allpeliculas.com|booksmedicos.org|dompl3.info|gnula.biz|jkanime.net|pelispedia.tv -CSS-generic: 236 plain CSS selectors -CSS-specific domain-based: 1312 distinct filters - Combined into 791 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 4 - 1561jrc, 1q56os4, 0nvhl3k, 0rnmck0 -Procedural-related distinct filters: 20 distinct combined selectors -============================ -Listset for 'spa-1': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/9.txt -Input filter count: 1456 - Accepted filter count: 1451 - Rejected filter count: 0 -Output rule count: 965 - Plain good: 930 - Maybe good (regexes): 6 - redirect=: 25 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 4 - Could not salvage rule with only entity-based domain= option: netcine.* - Could not salvage rule with only entity-based domain= option: netcine.* - regexFilter is not RE2-compatible: ^(?!.*(bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com)).*$ - Could not salvage rule with only entity-based domain= option: anitube.* -Rejected cosmetic filters: 1 - Entity-based filter not supported: .featured-slides > li.slide:not([id]):has(a[href^="https://startgaming.net/"]) -CSS-generic: 81 plain CSS selectors -CSS-specific domain-based: 2074 distinct filters - Combined into 1101 distinct entries -CSS-specific entity-based: 7 distinct filters - Combined into 4 distinct entries -CSS-specific injectable files: 6 - 12ka5u4, 143h6gs, 0tl0atg, 0j0r95s, 1n13og8, spa-1 -Declarative-related distinct filters: 73 distinct combined selectors -Procedural-related distinct filters: 116 distinct combined selectors -Discarded unsupported scriptlet filter: +js(remove-class, _theme-banner-upper, html) -Discarded unsupported scriptlet filter: +js(remove-attr, href, a[href^="https://adalites.site/"]) -Discarded unsupported scriptlet filter: +js(remove-class, bgPartners2019, .videoContainer > div.beachPartners + div) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, videoliberado, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, .style.display, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, player, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, PLAYER, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, liberaDownload, *, 0.02) -Discarded unsupported scriptlet filter: +js(remove-class, hided, #framed > div) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, Loading player, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, contador, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, Loading..., , 0.02) -Discarded unsupported scriptlet filter: +js(remove-class, hided, div#player) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, PLAYER LIBERADO, 10000, 0.02) -Discarded unsupported scriptlet filter: +js(remove-attr, href, a[href]#clickfakeplayer) -Discarded unsupported scriptlet filter: +js(noeval-if, _impspcabe) -Discarded unsupported scriptlet filter: +js(remove-attr, href, .leaving-message center > a.btn[onclick^="window.open"][href*="/ads.html"]) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 126 -Scriptlet-related injectable files: 10 - spa-1.abort-current-script.js, spa-1.set-constant.js, spa-1.no-fetch-if.js, spa-1.abort-on-property-read.js, spa-1.no-settimeout-if.js, spa-1.no-xhr-if.js, spa-1.abort-on-property-write.js, spa-1.no-addeventlistener-if.js, spa-1.no-windowopen-if.js, spa-1.json-prune.js -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, adsHandle_noclick, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, redirect, *, 0.02) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 4 - spa-1.set-constant.js, spa-1.no-windowopen-if.js, spa-1.abort-on-property-read.js, spa-1.abort-current-script.js -============================ -Listset for 'svn-0': - Fetching remote https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt -Input filter count: 148 - Accepted filter count: 148 - Rejected filter count: 0 -Output rule count: 103 - Plain good: 103 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-generic: 4 plain CSS selectors -CSS-specific domain-based: 349 distinct filters - Combined into 167 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 0qj9l9s -Procedural-related distinct filters: 2 distinct combined selectors -============================ -Listset for 'swe-1': - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/swe-ubo-filters.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/chromium.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/not_mobile.txt -Input filter count: 1539 - Accepted filter count: 1539 - Rejected filter count: 0 -Output rule count: 1165 - Plain good: 1145 - Maybe good (regexes): 2 - redirect=: 9 - removeparams= (accepted/discarded): 3/3 - csp=: 2 - Unsupported: 4 - Unsupported regex-based removeParam: /^ap/ - Unsupported regex-based removeParam: /^browser/ - Unsupported regex-based removeParam: /^utm_/ - Invalid network filter in swe-1: ||maxetise.net^$redirect-rule=noop.js,script,domain=feber.se|tjock.se -CSS-generic: 143 plain CSS selectors -CSS-specific domain-based: 646 distinct filters - Combined into 601 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 3 - 01jl3qc, 00ogd6o, 1kqmsbs -Declarative-related distinct filters: 62 distinct combined selectors -Procedural-related distinct filters: 211 distinct combined selectors -Discarded unsupported scriptlet filter: +js(rc, smartbanner-show) -Discarded unsupported scriptlet filter: +js(cookie-remover, page-views) -Discarded unsupported scriptlet filter: +js(rc, closed) -Discarded unsupported scriptlet filter: +js(ra, data-auto-play,,stay) -Discarded unsupported scriptlet filter: +js(nano-sib, dt_fullpage_ad) -Discarded unsupported scriptlet filter: +js(ra, data-auto-play) -Discarded unsupported scriptlet filter: +js(rc, advert-take-over-active) -Discarded unsupported scriptlet filter: +js(rc, no-scroll) -Discarded unsupported scriptlet filter: +js(rc, modal-cacsp-open,,stay) -Discarded unsupported scriptlet filter: +js(ra, data-autoplay, video, stay) -Discarded unsupported scriptlet filter: +js(ra, autoplay) -Discarded unsupported scriptlet filter: +js(rc, modal-open) -Discarded unsupported scriptlet filter: +js(rc, mega-loading, body) -Discarded unsupported scriptlet filter: +js(cookie-remover, lmt) -Discarded unsupported scriptlet filter: +js(rc, with-ads) -Discarded unsupported scriptlet filter: +js(noeval-if, Math.round) -Discarded unsupported scriptlet filter: +js(ra, onclick, [onclick^="ANAL"]) -Discarded unsupported scriptlet filter: +js(noeval) -Discarded unsupported scriptlet filter: +js(cookie-remover, /^ev_did|ev_sid/) -Discarded unsupported scriptlet filter: +js(ra, oncontextmenu) -Discarded unsupported scriptlet filter: +js(rc, cli-barmodal-open) -Discarded unsupported scriptlet filter: +js(rc, layout--locked) -Discarded unsupported scriptlet filter: +js(rc, takeover-loading, body) -Discarded unsupported scriptlet filter: +js(ra, data-start-in-view) -Discarded unsupported scriptlet filter: +js(ra, data-t-label) -Discarded unsupported scriptlet filter: +js(ra, data-t-type) -Discarded unsupported scriptlet filter: +js(ra, data-jsarwt) -Discarded unsupported scriptlet filter: +js(ra, onmousedown|ping, a[href][onmousedown]\, a[href][ping]) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 71 -Scriptlet-related injectable files: 9 - swe-1.no-settimeout-if.js, swe-1.json-prune.js, swe-1.abort-current-script.js, swe-1.no-addeventlistener-if.js, swe-1.no-xhr-if.js, swe-1.set-constant.js, swe-1.abort-on-property-write.js, swe-1.no-setinterval-if.js, swe-1.abort-on-property-read.js -============================ -Listset for 'tha-0': - Fetching remote https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/easylist-thailand.txt - Fetching remote https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/ublock.txt -Input filter count: 764 - Accepted filter count: 764 - Rejected filter count: 0 -Output rule count: 753 - Plain good: 748 - Maybe good (regexes): 3 - redirect=: 2 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -CSS-specific domain-based: 614 distinct filters - Combined into 179 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 1 - 01f249s -Procedural-related distinct filters: 11 distinct combined selectors -Discarded unsupported scriptlet filter: +js(nano-sib, #close_preload, 1000, 0) -Discarded unsupported scriptlet filter: +js(ra, style, .viddeo > .video__) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 3 -Scriptlet-related injectable files: 3 - tha-0.abort-on-property-read.js, tha-0.set-constant.js, tha-0.json-prune.js -============================ -Listset for 'tur-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/13.txt -Input filter count: 1662 - Accepted filter count: 1661 - Rejected filter count: 0 -Output rule count: 1240 - Plain good: 1203 - Maybe good (regexes): 13 - redirect=: 16 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 8 - Could not salvage rule with only entity-based domain= option: jetfilmizle.* - Could not salvage rule with only entity-based domain= option: siyahfilmizle.* - Could not salvage rule with only entity-based domain= option: fullhdfilmizlesene.* - Could not salvage rule with only entity-based domain= option: filmmakinesi.* - regexFilter is not RE2-compatible: yenihaberden.com\/d\/other\/(?!yeni-haber-youtube) - Could not salvage rule with only entity-based domain= option: yabancidizi.* - regexFilter is not RE2-compatible: ^(?!.*(bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com)).*$ - Invalid network filter in tur-0: ||diziyoucdn.xyz/*.mp4$media,redirect-rule=noop-1s.mp4 -Rejected cosmetic filters: 18 - Entity-based filter not supported: .video-content > div[id^="welcomeDiv"]:remove() - Entity-based filter not supported: .content-container .fw_playerAlti:has(> a[target="_blank"]) - Entity-based filter not supported: .side-box > .fw_playerYaniKat2Ustu:has(> iframe[src*="filmizletv."][src*="/sidrek.htm"]) - Entity-based filter not supported: #contenedor > div[class*="onceki"]:has(> center > iframe[src^="https://www.diziyo."][src*="/rklm/"]) - Entity-based filter not supported: #sol > #embed:has(iframe) ~ #video-onu2:remove() - Entity-based filter not supported: .rek-0:remove() - Entity-based filter not supported: .col.pr-0 > div[class="bg-dt2"]:has(> a[href][target="_blank"]) - Entity-based filter not supported: body:style(margin-top: 0 !important;) - Entity-based filter not supported: header.container:style(margin-top: 0 !important;) - Entity-based filter not supported: .wrapper:style(margin-top: 0 !important;) - Entity-based filter not supported: div.duyuru-izle.duyuru-izle:style(margin-top: 20px !important;) - Entity-based filter not supported: div.orta[style^="margin-top:"]:not(.izle):style(margin-top: 131px !important;) - Entity-based filter not supported: div.orta.izle[style^="margin-top:"]:not(#style_important):style(margin-top: 180px !important;) - Entity-based filter not supported: #mysite:style(margin-top: 0 !important;) - Entity-based filter not supported: div[style="float: left; width: calc(100% - 300px);"]:style(width: 100% !important;) - Entity-based filter not supported: .previd-link:style(visibility: hidden!important;) - Entity-based filter not supported: #episode:style(height: unset !important; width: unset !important; position: unset !important; overflow: unset !important;) - Entity-based filter not supported: html > body:style(background-image: none !important;) -CSS-generic: 107 plain CSS selectors -CSS-specific domain-based: 2957 distinct filters - Combined into 1535 distinct entries -CSS-specific entity-based: 91 distinct filters - Combined into 42 distinct entries -CSS-specific injectable files: 7 - 18cvsv4, 1ngbafo, 1jlejvo, 020f21k, 1mrj2ro, 0599jsc, tur-0 -Declarative-related distinct filters: 119 distinct combined selectors -Procedural-related distinct filters: 237 distinct combined selectors -Discarded unsupported scriptlet filter: +js(remove-attr, data-money, div[data-money]) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, reklam, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, timeleft, *, 0.02) -Discarded unsupported scriptlet filter: +js(remove-attr, href, .watch > a[href]) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, timer) -Discarded unsupported scriptlet filter: +js(remove-attr, placeholder, input[id="search-textbox"]) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, /HivePlayer|grounderstext/, *, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, timer, 900, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setTimeout-booster, ifsrc, 2000, 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster) -Discarded unsupported scriptlet filter: +js(remove-class, is-ad-visible) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, , 1000) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 93 -Scriptlet-related injectable files: 11 - tur-0.no-settimeout-if.js, tur-0.set-constant.js, tur-0.no-xhr-if.js, tur-0.no-fetch-if.js, tur-0.abort-on-property-read.js, tur-0.abort-current-script.js, tur-0.abort-on-property-write.js, tur-0.no-addeventlistener-if.js, tur-0.no-windowopen-if.js, tur-0.json-prune.js, tur-0.no-setinterval-if.js -Discarded unsupported scriptlet filter: +js(remove-attr, data-money, div[data-money]) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, money--skip, , 0.02) -Discarded unsupported scriptlet filter: +js(nano-setInterval-booster, window.money_interval) -Discarded unsupported scriptlet filter: +js(json-prune, style, maxActive) -Rejected scriptlet filters: 0 - -Scriptlet-related entity-based injectable files: 4 - tur-0.set-constant.js, tur-0.no-addeventlistener-if.js, tur-0.abort-on-property-read.js, tur-0.no-windowopen-if.js -============================ -Listset for 'vie-1': - Fetching remote https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn_ublock.txt -Input filter count: 723 - Accepted filter count: 723 - Rejected filter count: 0 -Output rule count: 558 - Plain good: 549 - Maybe good (regexes): 3 - redirect=: 4 - removeparams= (accepted/discarded): 0/0 - csp=: 2 - Unsupported: 0 - -Rejected cosmetic filters: 1 - Invalid filter: m.blogtruyen.vn##.mb10.item:-abp-has(a[href^="https://www.vb135.com/"]) -CSS-generic: 9 plain CSS selectors -CSS-specific domain-based: 772 distinct filters - Combined into 406 distinct entries -CSS-specific entity-based: 0 distinct filters - Combined into 0 distinct entries -CSS-specific injectable files: 2 - 0t1hkjs, 1va6b04 -Declarative-related distinct filters: 2 distinct combined selectors -Procedural-related distinct filters: 1 distinct combined selectors -Discarded unsupported scriptlet filter: +js(ra, target|onclick, a[href^="/video/"]) -Rejected scriptlet filters: 0 - -Scriptlet-related distinct filters: 46 -Scriptlet-related injectable files: 9 - vie-1.abort-current-script.js, vie-1.abort-on-property-read.js, vie-1.no-addeventlistener-if.js, vie-1.abort-on-property-write.js, vie-1.no-fetch-if.js, vie-1.no-settimeout-if.js, vie-1.set-constant.js, vie-1.json-prune.js, vie-1.no-xhr-if.js -============================ -Listset for 'block-lan': - Fetching remote https://ublockorigin.github.io/uAssets/filters/lan-block.txt -Input filter count: 44 - Accepted filter count: 44 - Rejected filter count: 0 -Output rule count: 10 - Plain good: 4 - Maybe good (regexes): 6 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -============================ -Listset for 'dpollock-0': - Fetching remote https://someonewhocares.org/hosts/hosts -Input filter count: 11397 - Accepted filter count: 11397 - Rejected filter count: 0 -Output rule count: 1 - Plain good: 1 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -============================ -Listset for 'adguard-spyware-url': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/17.txt -Input filter count: 861 - Accepted filter count: 860 - Rejected filter count: 0 -Output rule count: 322 - Plain good: 0 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 254/68 - csp=: 0 - Unsupported: 68 - Unsupported regex-based removeParam: /^__s=[A-Za-z0-9]{6\,}/ - Unsupported regex-based removeParam: /^event_callback_/ - Unsupported regex-based removeParam: /elq/ - Unsupported regex-based removeParam: /utm_/ - Unsupported regex-based removeParam: /web_only|_branch_referrer/ - Unsupported regex-based removeParam: /premiumVisit|utm_compaign/ - Unsupported regex-based removeParam: /utm_partner_id|frommail/ - Unsupported regex-based removeParam: /^(udid|DeviceID|ver|appbuild|vendor|model|device_name|device_type|instanceid|device_year|connection_class|appsflyerid)/ - Unsupported regex-based removeParam: /^cd\d+/ - Unsupported regex-based removeParam: /^subid/ - Unsupported regex-based removeParam: /^mkt_tok/ - Unsupported regex-based removeParam: /fx_(source|medium|campaign)/ - Unsupported regex-based removeParam: /^ref_/ - Unsupported regex-based removeParam: /^cx_/ - Unsupported regex-based removeParam: /^pickup_list_click/ - Unsupported regex-based removeParam: /distributorid|wfr|ifr|share_relation/ - Unsupported regex-based removeParam: /cUrl|ref/ - Unsupported regex-based removeParam: /topicPageSponsorship|^itm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^trk/ - Unsupported regex-based removeParam: /^utm_cid/ - Unsupported regex-based removeParam: /entries/ - Unsupported regex-based removeParam: /Version/ - Unsupported regex-based removeParam: /^at_custom/ - Unsupported regex-based removeParam: /mcorgid|mid|ts/ - Unsupported regex-based removeParam: /^dc_trk_/ - Unsupported regex-based removeParam: /^(ppref|ref|pid)=/ - Unsupported regex-based removeParam: /^subid/ - Unsupported regex-based removeParam: /^(_requestid|reff)=/ - Unsupported regex-based removeParam: /^affExtParam/ - Unsupported regex-based removeParam: /^otracker/ - Unsupported regex-based removeParam: /spm=|scm=|from=|keyori=|sugg=|search=|mp=|c=|^abtest|^abbucket|pos=|themeID=|algArgs=|clickTrackInfo=|acm=|item_id=|version=|up_id=|pvid=/ - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported regex-based removeParam: /^\/_ui\/desktop\/common\/js\/uiAnalytics\// - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/analytics\/with-intersection-track.js/ - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/InappCommunicationManager.js/ - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/util\/jquery.analytics-utils.js/ - Unsupported regex-based removeParam: /cdt|ref/ - Unsupported regex-based removeParam: ~/^(primer|subset_id)=/ - Unsupported modifier exception -============================ -Listset for 'cname-trackers': - Fetching remote https://raw.githubusercontent.com/AdguardTeam/cname-trackers/master/combined_disguised_trackers.txt -Input filter count: 31427 - Accepted filter count: 31427 - Rejected filter count: 0 -Output rule count: 4 - Plain good: 4 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - -============================ -Listset for 'stevenblack-hosts': - Fetching remote https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts -Input filter count: 166011 - Accepted filter count: 166011 - Rejected filter count: 0 -Output rule count: 2 - Plain good: 2 - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - csp=: 0 - Unsupported: 0 - diff -Nru ublock-origin-1.46.0+dfsg/dist/mv3/publish-beta.py ublock-origin-1.67.0+dfsg/dist/mv3/publish-beta.py --- ublock-origin-1.46.0+dfsg/dist/mv3/publish-beta.py 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/mv3/publish-beta.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,196 +0,0 @@ -#!/usr/bin/env python3 - -import datetime -import json -import os -import re -import requests -import shutil -import subprocess -import sys -import tempfile -import time -import zipfile - -from distutils.version import StrictVersion -from string import Template - -# - Download target (raw) uBOLite_*.mv3.zip from GitHub -# - This is referred to as "raw" package -# - This will fail if not a dev build -# - Upload uBOLite_*.mv3.zip to Chrome store -# - Publish uBOLite_*.mv3.zip to Chrome store - -# Find path to project root -projdir = os.path.split(os.path.abspath(__file__))[0] -while not os.path.isdir(os.path.join(projdir, '.git')): - projdir = os.path.normpath(os.path.join(projdir, '..')) - -# We need a version string to work with -if len(sys.argv) >= 2 and sys.argv[1]: - version = sys.argv[1] -else: - version = input('Github release version: ') -version.strip() -if not re.search('^uBOLite_\d+\.\d+\.\d+\.\d+$', version): - print('Error: Invalid version string.') - exit(1) - -cs_extension_id = 'ddkjiahejlhfcafbddmgiahcphecmpfh' -tmpdir = tempfile.TemporaryDirectory() -raw_zip_filename = '' -raw_zip_filepath = '' -github_owner = 'gorhill' -github_repo = 'uBlock' - -# Load/save auth secrets -# The build directory is excluded from git -ubo_secrets = dict() -ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets') -if os.path.isfile(ubo_secrets_filename): - with open(ubo_secrets_filename) as f: - ubo_secrets = json.load(f) - -def input_secret(prompt, token): - if token in ubo_secrets: - prompt += ' ✔' - prompt += ': ' - value = input(prompt).strip() - if len(value) == 0: - if token not in ubo_secrets: - print('Token error:', token) - exit(1) - value = ubo_secrets[token] - elif token not in ubo_secrets or value != ubo_secrets[token]: - ubo_secrets[token] = value - exists = os.path.isfile(ubo_secrets_filename) - with open(ubo_secrets_filename, 'w') as f: - json.dump(ubo_secrets, f, indent=2) - if not exists: - os.chmod(ubo_secrets_filename, 0o600) - return value - - -# GitHub API token -github_token = input_secret('Github token', 'github_token') -github_auth = 'token ' + github_token - -# -# Get metadata from GitHub about the release -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release -print('Downloading release info from GitHub...') -release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version) -headers = { 'Authorization': github_auth, } -response = requests.get(release_info_url, headers=headers) -if response.status_code != 200: - print('Error: Release not found: {0}'.format(response.status_code)) - exit(1) -release_info = response.json() - -# -# Extract URL to raw package from metadata -# - -# Find url for uBOLite_*.mv3.zip -raw_zip_url = '' -for asset in release_info['assets']: - if re.search('uBOLite_\d+.\d+.\d+.\d+.mv3.zip', asset['name']): - raw_zip_url = asset['url'] - raw_zip_filename = asset['name'] - raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename) -if len(raw_zip_url) == 0: - print('Error: Release asset URL not found') - exit(1) -if len(raw_zip_filepath) == 0: - print('Error: Invalid release asset file not set') - exit(1) - -# -# Download raw package from GitHub -# - -# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset -print('Downloading raw zip package from GitHub...') -headers = { - 'Authorization': github_auth, - 'Accept': 'application/octet-stream', -} -response = requests.get(raw_zip_url, headers=headers) -# Redirections are transparently handled: -# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history -if response.status_code != 200: - print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code)) - exit(1) -with open(raw_zip_filepath, 'wb') as f: - f.write(response.content) -print('Downloaded raw package saved as {0}'.format(raw_zip_filepath)) - -# -# Upload to Chrome store -# - -# Auth tokens -cs_id = input_secret('Chrome store id', 'cs_id') -cs_secret = input_secret('Chrome store secret', 'cs_secret') -cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh') - -print('Uploading to Chrome store...') -with open(raw_zip_filepath, 'rb') as f: - print('Generating access token...') - auth_url = 'https://accounts.google.com/o/oauth2/token' - auth_payload = { - 'client_id': cs_id, - 'client_secret': cs_secret, - 'grant_type': 'refresh_token', - 'refresh_token': cs_refresh, - } - auth_response = requests.post(auth_url, data=auth_payload) - if auth_response.status_code != 200: - print('Error: Auth failed -- server error {0}'.format(auth_response.status_code)) - print(auth_response.text) - exit(1) - response_dict = auth_response.json() - if 'access_token' not in response_dict: - print('Error: Auth failed -- no access token') - exit(1) - # Prepare access token - cs_auth = 'Bearer ' + response_dict['access_token'] - headers = { - 'Authorization': cs_auth, - 'x-goog-api-version': '2', - } - # Upload - print('Uploading package...') - upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id) - upload_response = requests.put(upload_url, headers=headers, data=f) - f.close() - if upload_response.status_code != 200: - print('Upload failed -- server error {0}'.format(upload_response.status_code)) - print(upload_response.text) - exit(1) - response_dict = upload_response.json(); - if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS': - print('Upload failed -- server error {0}'.format(response_dict['uploadState'])) - exit(1) - print('Upload succeeded.') - # Publish - print('Publishing package...') - publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id) - headers = { - 'Authorization': cs_auth, - 'x-goog-api-version': '2', - 'Content-Length': '0', - } - publish_response = requests.post(publish_url, headers=headers) - if publish_response.status_code != 200: - print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code)) - exit(1) - response_dict = publish_response.json(); - if 'status' not in response_dict or response_dict['status'][0] != 'OK': - print('Publishing failed -- server error {0}'.format(response_dict['status'])) - exit(1) - print('Publishing succeeded.') - -print('All done.') diff -Nru ublock-origin-1.46.0+dfsg/dist/version ublock-origin-1.67.0+dfsg/dist/version --- ublock-origin-1.46.0+dfsg/dist/version 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/dist/version 2025-10-25 19:32:51.000000000 +0000 @@ -1 +1 @@ -1.46.0 +1.67.0 \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/eslint.config.mjs ublock-origin-1.67.0+dfsg/eslint.config.mjs --- ublock-origin-1.46.0+dfsg/eslint.config.mjs 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/eslint.config.mjs 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,51 @@ +import js from "@eslint/js"; +import globals from "globals"; +import json from "@eslint/json"; + +import { includeIgnoreFile } from "@eslint/compat"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const gitignorePath = path.resolve(__dirname, ".gitignore"); + +export default [ includeIgnoreFile(gitignorePath), { + files: ["**/*.js", "**/*.mjs"], + ...js.configs.recommended, +}, { + files: ["**/*.js", "**/*.mjs"], + languageOptions: { + globals: { + ...globals.browser, + browser: "readonly", + chrome: "readonly", + vAPI: "readonly", + }, + sourceType: "module", + }, + rules: { + eqeqeq: ["warn", "always"], + indent: ["error", 4, { + ignoredNodes: [ + "Program > BlockStatement", + "Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement", + "Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement", + "Program > IfStatement > BlockStatement", + "Program > VariableDeclaration > VariableDeclarator > CallExpression > ArrowFunctionExpression > BlockStatement", + "CallExpression > MemberExpression", + "ArrayExpression > *", + "ObjectExpression > *", + ], + }], + "no-control-regex": "off", + "no-empty": "off", + "sort-imports": "error", + "strict": "error", + }, +}, { + files: ["**/*.json"], + ignores: ["package-lock.json"], + language: "json/json", + ...json.configs.recommended, +} ]; diff -Nru ublock-origin-1.46.0+dfsg/package-lock.json ublock-origin-1.67.0+dfsg/package-lock.json --- ublock-origin-1.46.0+dfsg/package-lock.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/package-lock.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,1163 @@ +{ + "name": "uBlock", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "uBlock", + "version": "1.0.0", + "license": "GPLv3", + "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/js": "^9.17.0", + "@eslint/json": "^0.13.1", + "eslint": "^9.34.0", + "eslint-formatter-compact": "^8.40.0", + "globals": "^15.14.0" + }, + "engines": { + "node": ">=22", + "npm": ">=11" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.2.tgz", + "integrity": "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/json": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.13.2.tgz", + "integrity": "sha512-yWLyRE18rHgHXhWigRpiyv1LDPkvWtC6oa7QHXW7YdP6gosJoq7BiLZW2yCs9U7zN7X4U3ZeOJjepA10XAOIMw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "@eslint/plugin-kit": "^0.3.5", + "@humanwhocodes/momoa": "^3.3.9", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.9.tgz", + "integrity": "sha512-LHw6Op4bJb3/3KZgOgwflJx5zY9XOy0NU1NuyUFKGdTwHYmP+PbnQGCYQJ8NVNlulLfQish34b0VuUlLYP3AXA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-formatter-compact": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-compact/-/eslint-formatter-compact-8.40.0.tgz", + "integrity": "sha512-cwGUs113TgmTQXecx5kfRjB7m0y2wkDLSadPTE2pK6M/wO4N8PjmUaoWOFNCP9MHgsiZwgqd5bZFnDCnszC56Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff -Nru ublock-origin-1.46.0+dfsg/package.json ublock-origin-1.67.0+dfsg/package.json --- ublock-origin-1.46.0+dfsg/package.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/package.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,32 @@ +{ + "name": "uBlock", + "version": "1.0.0", + "description": "npm dev tools", + "type": "module", + "scripts": { + "lint": "eslint --no-warn-ignored --ignore-pattern \"**/lib/\" --ignore-pattern \"**/npm/\" -- \"./src/js/*.js\" \"./src/js/**/*.js\" \"./**/*.json\" \"./platform/**/*.js\"", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/gorhill/uBlock.git" + }, + "author": "Raymond Hill", + "license": "GPLv3", + "bugs": { + "url": "https://github.com/gorhill/uBlock/issues" + }, + "homepage": "https://github.com/gorhill/uBlock#readme", + "engines": { + "node": ">=22", + "npm": ">=11" + }, + "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/js": "^9.17.0", + "@eslint/json": "^0.13.1", + "eslint": "^9.34.0", + "eslint-formatter-compact": "^8.40.0", + "globals": "^15.14.0" + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/browser/main.js ublock-origin-1.67.0+dfsg/platform/browser/main.js --- ublock-origin-1.46.0+dfsg/platform/browser/main.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/browser/main.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -'use strict'; - -/******************************************************************************/ - -import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js'; -import punycode from './lib/punycode.js'; - -import staticNetFilteringEngine from './js/static-net-filtering.js'; -import { FilteringContext } from './js/filtering-context.js'; -import { LineIterator } from './js/text-utils.js'; -import { StaticFilteringParser } from './js/static-filtering-parser.js'; - -import { - CompiledListReader, - CompiledListWriter -} from './js/static-filtering-io.js'; - -/******************************************************************************/ - -function compileList(rawText, writer) { - const lineIter = new LineIterator(rawText); - const parser = new StaticFilteringParser(true); - const compiler = staticNetFilteringEngine.createCompiler(parser); - - parser.setMaxTokenLength(staticNetFilteringEngine.MAX_TOKEN_LENGTH); - - while ( lineIter.eot() === false ) { - let line = lineIter.next(); - - while ( line.endsWith(' \\') ) { - if ( lineIter.peek(4) !== ' ' ) { break; } - line = line.slice(0, -2).trim() + lineIter.next().trim(); - } - parser.analyze(line); - - if ( parser.shouldIgnore() ) { continue; } - if ( parser.category !== parser.CATStaticNetFilter ) { continue; } - if ( parser.patternHasUnicode() && parser.toASCII() === false ) { - continue; - } - if ( compiler.compile(parser, writer) ) { continue; } - if ( compiler.error !== undefined ) { - console.info(JSON.stringify({ - realm: 'message', - type: 'error', - text: compiler.error - })); - } - } - - return writer.toString(); -} - -function applyList(name, raw) { - const writer = new CompiledListWriter(); - writer.properties.set('name', name); - const compiled = compileList(raw, writer); - const reader = new CompiledListReader(compiled); - staticNetFilteringEngine.fromCompiled(reader); -} - -function enableWASM(path) { - return Promise.all([ - publicSuffixList.enableWASM(`${path}/lib/publicsuffixlist`), - staticNetFilteringEngine.enableWASM(`${path}/js`), - ]); -} - -function pslInit(raw) { - if ( typeof raw !== 'string' || raw.trim() === '' ) { - console.info('Unable to populate public suffix list'); - return; - } - publicSuffixList.parse(raw, punycode.toASCII); - console.info('Public suffix list populated'); -} - -function restart(lists) { - // Remove all filters - reset(); - - if ( Array.isArray(lists) && lists.length !== 0 ) { - // Populate filtering engine with filter lists - for ( const { name, raw } of lists ) { - applyList(name, raw); - } - // Commit changes - staticNetFilteringEngine.freeze(); - staticNetFilteringEngine.optimize(); - } - - return staticNetFilteringEngine; -} - -function reset() { - staticNetFilteringEngine.reset(); -} - -export { - FilteringContext, - enableWASM, - pslInit, - restart, -}; diff -Nru ublock-origin-1.46.0+dfsg/platform/browser/test.html ublock-origin-1.67.0+dfsg/platform/browser/test.html --- ublock-origin-1.46.0+dfsg/platform/browser/test.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/browser/test.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ - - - - -uBO Static Network Filtering Engine - - - - - diff -Nru ublock-origin-1.46.0+dfsg/platform/chromium/is-webrtc-supported.html ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html --- ublock-origin-1.46.0+dfsg/platform/chromium/is-webrtc-supported.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,7 +3,7 @@ - + diff -Nru ublock-origin-1.46.0+dfsg/platform/chromium/is-webrtc-supported.js ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.js --- ublock-origin-1.46.0+dfsg/platform/chromium/is-webrtc-supported.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2015 Raymond Hill This program is free software: you can redistribute it and/or modify @@ -21,7 +21,7 @@ // https://github.com/gorhill/uBlock/issues/533#issuecomment-164292868 // If WebRTC is supported, there won't be an exception if we -// try to instanciate a peer connection object. +// try to instantiate a peer connection object. // https://github.com/gorhill/uBlock/issues/533#issuecomment-168097594 // Because Chromium leaks WebRTC connections after they have been closed @@ -30,11 +30,9 @@ // collected. (function() { - 'use strict'; - - var pc = null; + let pc = null; try { - var PC = self.RTCPeerConnection || self.webkitRTCPeerConnection; + const PC = self.RTCPeerConnection || self.webkitRTCPeerConnection; if ( PC ) { pc = new PC(null); } diff -Nru ublock-origin-1.46.0+dfsg/platform/chromium/manifest.json ublock-origin-1.67.0+dfsg/platform/chromium/manifest.json --- ublock-origin-1.46.0+dfsg/platform/chromium/manifest.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/chromium/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -6,7 +6,8 @@ "browser_action": { "default_icon": { "16": "img/icon_16.png", - "32": "img/icon_32.png" + "32": "img/icon_32.png", + "64": "img/icon_64.png" }, "default_title": "uBlock Origin", "default_popup": "popup-fenix.html" @@ -29,6 +30,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ @@ -53,14 +57,25 @@ "https://filterlists.com/*", "https://forums.lanik.us/*", "https://github.com/*", - "https://*.github.io/*", - "https://*.letsblock.it/*" + "https://*.github.io/*" ], "js": [ "/js/scriptlets/subscriber.js" ], "run_at": "document_idle", "all_frames": false + }, + { + "matches": [ + "https://github.com/uBlockOrigin/*", + "https://ublockorigin.github.io/*", + "https://*.reddit.com/r/uBlockOrigin/*" + ], + "js": [ + "/js/scriptlets/updater.js" + ], + "run_at": "document_idle", + "all_frames": false } ], "content_security_policy": "script-src 'self'; object-src 'self'", @@ -74,13 +89,14 @@ }, "incognito": "split", "manifest_version": 2, - "minimum_chrome_version": "66.0", + "minimum_chrome_version": "93.0", "name": "uBlock Origin", "options_ui": { "page": "dashboard.html", "open_in_tab": true }, "permissions": [ + "alarms", "contextMenus", "privacy", "storage", diff -Nru ublock-origin-1.46.0+dfsg/platform/chromium/vapi-background-ext.js ublock-origin-1.67.0+dfsg/platform/chromium/vapi-background-ext.js --- ublock-origin-1.46.0+dfsg/platform/chromium/vapi-background-ext.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/chromium/vapi-background-ext.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2017-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser */ - -'use strict'; - /******************************************************************************/ // https://github.com/uBlockOrigin/uBlock-issues/issues/1659 @@ -30,6 +26,8 @@ // so we synthetize these missing events when this happens. // https://github.com/uBlockOrigin/uAssets/issues/10323 // Also mind whether the new tab is launched from an external application. +// https://github.com/uBlockOrigin/uBlock-issues/issues/2227 +// Revert commit related to issue above. vAPI.Tabs = class extends vAPI.Tabs { constructor() { @@ -70,8 +68,7 @@ const isClientRedirect = Array.isArray(details.transitionQualifiers) && details.transitionQualifiers.includes('client_redirect'); - const isStartPage = details.transitionType === 'start_page'; - if ( isClientRedirect === false && isStartPage === false ) { return; } + if ( isClientRedirect === false ) { return; } this.onCreatedNavigationTargetHandler({ tabId: details.tabId, sourceTabId: details.tabId, @@ -90,76 +87,47 @@ ['gif','image'],['ico','image'],['jpeg','image'],['jpg','image'],['png','image'],['webp','image'] ]); - const headerValue = (headers, name) => { - let i = headers.length; - while ( i-- ) { - if ( headers[i].name.toLowerCase() === name ) { - return headers[i].value.trim(); - } - } - return ''; - }; - const parsedURL = new URL('https://www.example.org/'); - // Extend base class to normalize as per platform. + // Extend base class to normalize as per platform vAPI.Net = class extends vAPI.Net { - constructor() { - super(); - this.suspendedTabIds = new Set(); - } - normalizeDetails(details) { // Chromium 63+ supports the `initiator` property, which contains - // the URL of the origin from which the network request was made. - if ( - typeof details.initiator === 'string' && - details.initiator !== 'null' - ) { + // the URL of the origin from which the network request was made + if ( details.initiator && details.initiator !== 'null' ) { details.documentUrl = details.initiator; } - - let type = details.type; - + const type = details.type; if ( type === 'imageset' ) { details.type = 'image'; return; } - - // The rest of the function code is to normalize type if ( type !== 'other' ) { return; } - - // Try to map known "extension" part of URL to request type. - parsedURL.href = details.url; - const path = parsedURL.pathname, - pos = path.indexOf('.', path.length - 6); - if ( pos !== -1 && (type = extToTypeMap.get(path.slice(pos + 1))) ) { - details.type = type; + // Try to map known "extension" part of URL to request type + if ( details.responseHeaders === undefined ) { + parsedURL.href = details.url; + const path = parsedURL.pathname; + const pos = path.indexOf('.', path.length - 6); + if ( pos !== -1 ) { + details.type = extToTypeMap.get(path.slice(pos + 1)) || type; + } return; } - - // Try to extract type from response headers if present. - if ( details.responseHeaders ) { - type = headerValue(details.responseHeaders, 'content-type'); - if ( type.startsWith('font/') ) { - details.type = 'font'; - return; - } - if ( type.startsWith('image/') ) { - details.type = 'image'; - return; - } - if ( type.startsWith('audio/') || type.startsWith('video/') ) { - details.type = 'media'; - return; - } + // Try to extract type from response headers + const ctype = this.headerValue(details.responseHeaders, 'content-type'); + if ( ctype.startsWith('font/') ) { + details.type = 'font'; + } else if ( ctype.startsWith('image/') ) { + details.type = 'image'; + } else if ( ctype.startsWith('audio/') || ctype.startsWith('video/') ) { + details.type = 'media'; } } // https://www.reddit.com/r/uBlockOrigin/comments/9vcrk3/ // Some types can be mapped from 'other', thus include 'other' if and - // only if the caller is interested in at least one of those types. + // only if the caller is interested in at least one of those types denormalizeTypes(types) { if ( types.length === 0 ) { return Array.from(this.validTypes); @@ -184,20 +152,21 @@ // https://github.com/uBlockOrigin/uBlock-issues/issues/2063 // Do not interfere with root document suspendOneRequest(details) { - this.suspendedTabIds.add(details.tabId); + this.onBeforeSuspendableRequest(details); if ( details.type === 'main_frame' ) { return; } - return { - redirectUrl: vAPI.getURL(`web_accessible_resources/empty?secret=${vAPI.warSecret()}`) - }; + return { cancel: true }; } unsuspendAllRequests(discard = false) { - if ( discard !== true ) { - for ( const tabId of this.suspendedTabIds ) { - vAPI.tabs.reload(tabId); - } + if ( discard === true ) { return; } + const toReload = []; + for ( const tabId of this.unprocessedTabs.keys() ) { + toReload.push(tabId); + } + this.removeUnprocessedRequest(); + for ( const tabId of toReload ) { + vAPI.tabs.reload(tabId); } - this.suspendedTabIds.clear(); } }; } @@ -240,19 +209,43 @@ /******************************************************************************/ -vAPI.scriptletsInjector = ((doc, scriptlets) => { - let script; - try { - script = doc.createElement('script'); - script.appendChild(doc.createTextNode(scriptlets)); - (doc.head || doc.documentElement).appendChild(script); - self.uBO_scriptletsInjected = true; - } catch (ex) { - } - if ( script ) { - script.remove(); - script.textContent = ''; - } -}).toString(); +vAPI.scriptletsInjector = (( ) => { + const parts = [ + '(', + function(details) { + if ( self.uBO_scriptletsInjected !== undefined ) { return; } + const doc = document; + const { location } = doc; + if ( location === null ) { return; } + const { hostname } = location; + if ( hostname !== '' && details.hostname !== hostname ) { return; } + let script; + try { + script = doc.createElement('script'); + script.appendChild(doc.createTextNode(details.scriptlets)); + (doc.head || doc.documentElement).appendChild(script); + self.uBO_scriptletsInjected = details.filters; + } catch { + } + if ( script ) { + script.remove(); + script.textContent = ''; + } + return 0; + }.toString(), + ')(', + 'json-slot', + ');', + ]; + const jsonSlot = parts.indexOf('json-slot'); + return (hostname, details) => { + parts[jsonSlot] = JSON.stringify({ + hostname, + scriptlets: details.mainWorld, + filters: details.filters, + }); + return parts.join(''); + }; +})(); /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/chromium/webext.js ublock-origin-1.67.0+dfsg/platform/chromium/webext.js --- ublock-origin-1.46.0+dfsg/platform/chromium/webext.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/chromium/webext.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2019-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,41 +19,56 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - // `webext` is a promisified api of `chrome`. Entries are added as // the promisification of uBO progress. const promisifyNoFail = function(thisArg, fnName, outFn = r => r) { const fn = thisArg[fnName]; - return function() { + return function(...args) { return new Promise(resolve => { - fn.call(thisArg, ...arguments, function() { - if ( chrome.runtime.lastError instanceof Object ) { - void chrome.runtime.lastError.message; - } - resolve(outFn(...arguments)); - }); + try { + fn.call(thisArg, ...args, function(...args) { + void chrome.runtime.lastError; + resolve(outFn(...args)); + }); + } catch(ex) { + console.error(ex); + resolve(outFn()); + } }); }; }; const promisify = function(thisArg, fnName) { const fn = thisArg[fnName]; - return function() { + return function(...args) { return new Promise((resolve, reject) => { - fn.call(thisArg, ...arguments, function() { - const lastError = chrome.runtime.lastError; - if ( lastError instanceof Object ) { - return reject(lastError.message); - } - resolve(...arguments); - }); + try { + fn.call(thisArg, ...args, function(...args) { + const lastError = chrome.runtime.lastError; + if ( lastError instanceof Object ) { + return reject(lastError.message); + } + resolve(...args); + }); + } catch(ex) { + console.error(ex); + resolve(); + } }); }; }; const webext = { + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/alarms + alarms: { + clear: promisifyNoFail(chrome.alarms, 'clear'), + clearAll: promisifyNoFail(chrome.alarms, 'clearAll'), + create: promisifyNoFail(chrome.alarms, 'create'), + get: promisifyNoFail(chrome.alarms, 'get'), + getAll: promisifyNoFail(chrome.alarms, 'getAll'), + onAlarm: chrome.alarms.onAlarm, + }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction browserAction: { setBadgeBackgroundColor: promisifyNoFail(chrome.browserAction, 'setBadgeBackgroundColor'), @@ -95,6 +110,7 @@ query: promisifyNoFail(chrome.tabs, 'query', tabs => Array.isArray(tabs) ? tabs : []), reload: promisifyNoFail(chrome.tabs, 'reload'), remove: promisifyNoFail(chrome.tabs, 'remove'), + sendMessage: promisifyNoFail(chrome.tabs, 'sendMessage'), update: promisifyNoFail(chrome.tabs, 'update', tab => tab instanceof Object ? tab : null), }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation diff -Nru ublock-origin-1.46.0+dfsg/platform/common/vapi-background.js ublock-origin-1.67.0+dfsg/platform/common/vapi-background.js --- ublock-origin-1.46.0+dfsg/platform/common/vapi-background.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/common/vapi-background.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-2015 The uBlock Origin authors Copyright (C) 2014-present Raymond Hill @@ -22,14 +22,10 @@ // For background page -/* globals browser */ - -'use strict'; - /******************************************************************************/ -import webext from './webext.js'; import { ubolog } from './console.js'; +import webext from './webext.js'; /******************************************************************************/ @@ -42,7 +38,7 @@ vAPI.canWASM = vAPI.webextFlavor.soup.has('chromium') === false; if ( vAPI.canWASM === false ) { const csp = manifest.content_security_policy; - vAPI.canWASM = csp !== undefined && csp.indexOf("'unsafe-eval'") !== -1; + vAPI.canWASM = csp !== undefined && csp.indexOf("'wasm-unsafe-eval'") !== -1; } vAPI.supportsUserStylesheets = vAPI.webextFlavor.soup.has('user_stylesheet'); @@ -52,7 +48,7 @@ vAPI.app = { name: manifest.name.replace(/ dev\w+ build/, ''), version: (( ) => { - let version = manifest.version; + let version = manifest.version_name || manifest.version; const match = /(\d+\.\d+\.\d+)(?:\.(\d+))?/.exec(version); if ( match && match[2] ) { const v = parseInt(match[2], 10); @@ -88,9 +84,85 @@ }; /******************************************************************************/ -/******************************************************************************/ -vAPI.storage = webext.storage.local; +// Generate segments of random six alphanumeric characters, thus one segment +// is a value out of 36^6 = over 2x10^9 values. + +vAPI.generateSecret = (size = 1) => { + let secret = ''; + while ( size-- ) { + secret += (Math.floor(Math.random() * 2176782336) + 2176782336).toString(36).slice(1); + } + return secret; +}; + +/******************************************************************************* + * + * https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/storage/session + * + * Session (in-memory) storage is promise-based in all browsers, no need for + * a webext polyfill. However, not all browsers supports it in MV2. + * + * */ + +vAPI.sessionStorage = browser.storage.session || { + get() { + return Promise.resolve(); + }, + set() { + return Promise.resolve(); + }, + remove() { + return Promise.resolve(); + }, + clear() { + return Promise.resolve(); + }, + unavailable: true, +}; + +/******************************************************************************* + * + * Data written to and read from storage.local will be mirrored to in-memory + * storage.session. + * + * Data read from storage.local will be first fetched from storage.session, + * then if not available, read from storage.local. + * + * */ + +vAPI.storage = { + get(key, ...args) { + return webext.storage.local.get(key, ...args).catch(reason => { + console.log(reason); + }); + }, + set(...args) { + return webext.storage.local.set(...args).catch(reason => { + console.log(reason); + }); + }, + remove(...args) { + return webext.storage.local.remove(...args).catch(reason => { + console.log(reason); + }); + }, + clear(...args) { + return webext.storage.local.clear(...args).catch(reason => { + console.log(reason); + }); + }, + QUOTA_BYTES: browser.storage.local.QUOTA_BYTES, +}; + +// Not all platforms support getBytesInUse +if ( webext.storage.local.getBytesInUse instanceof Function ) { + vAPI.storage.getBytesInUse = function(...args) { + return webext.storage.local.getBytesInUse(...args).catch(reason => { + console.log(reason); + }); + }; +} /******************************************************************************/ /******************************************************************************/ @@ -115,9 +187,9 @@ set: function(details) { for ( const setting in details ) { - if ( details.hasOwnProperty(setting) === false ) { continue; } + if ( Object.hasOwn(details, setting) === false ) { continue; } switch ( setting ) { - case 'prefetching': + case 'prefetching': { const enabled = !!details[setting]; if ( enabled ) { bp.network.networkPredictionEnabled.clear({ @@ -133,9 +205,9 @@ vAPI.prefetching(enabled); } break; - - case 'hyperlinkAuditing': - if ( !!details[setting] ) { + } + case 'hyperlinkAuditing': { + if ( details[setting] ) { bp.websites.hyperlinkAuditingEnabled.clear({ scope: 'regular', }); @@ -146,7 +218,7 @@ }); } break; - + } case 'webrtcIPAddress': { // https://github.com/uBlockOrigin/uBlock-issues/issues/1928 // https://www.reddit.com/r/uBlockOrigin/comments/sl7p74/ @@ -211,6 +283,12 @@ this.onCreatedNavigationTargetHandler(details); }); browser.webNavigation.onCommitted.addListener(details => { + const { frameId, tabId } = details; + if ( frameId === 0 && tabId > 0 && details.transitionType === 'reload' ) { + if ( vAPI.net && vAPI.net.hasUnprocessedRequest(tabId) ) { + vAPI.net.removeUnprocessedRequest(tabId); + } + } this.onCommittedHandler(details); }); browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { @@ -227,16 +305,19 @@ }); } browser.tabs.onRemoved.addListener((tabId, details) => { + if ( vAPI.net && vAPI.net.hasUnprocessedRequest(tabId) ) { + vAPI.net.removeUnprocessedRequest(tabId); + } this.onRemovedHandler(tabId, details); }); - } + } - async executeScript() { + async executeScript(...args) { let result; try { - result = await webext.tabs.executeScript(...arguments); + result = await webext.tabs.executeScript(...args); } - catch(reason) { + catch { } return Array.isArray(result) ? result : []; } @@ -250,7 +331,7 @@ try { tab = await webext.tabs.get(tabId); } - catch(reason) { + catch { } return tab instanceof Object ? tab : null; } @@ -267,7 +348,7 @@ try { await webext.tabs.insertCSS(...arguments); } - catch(reason) { + catch { } } @@ -276,7 +357,7 @@ try { tabs = await webext.tabs.query(queryInfo); } - catch(reason) { + catch { } return Array.isArray(tabs) ? tabs : []; } @@ -288,7 +369,7 @@ try { await webext.tabs.removeCSS(...arguments); } - catch(reason) { + catch { } } @@ -348,22 +429,26 @@ // For some reasons, some platforms do not honor the left,top // position when specified. I found that further calling // windows.update again with the same position _may_ help. + // + // https://github.com/uBlockOrigin/uBlock-issues/issues/2249 + // Mind that the creation of the popup window might fail. if ( details.popup !== undefined && vAPI.windows instanceof Object ) { - const createDetails = { + const basicDetails = { url: details.url, type: details.popup, }; - if ( details.box instanceof Object ) { - Object.assign(createDetails, details.box); - } - const win = await vAPI.windows.create(createDetails); - if ( win === null ) { return; } - if ( details.box instanceof Object === false ) { return; } - if ( - win.left === details.box.left && - win.top === details.box.top - ) { - return; + const shouldRestorePosition = details.box instanceof Object; + const extraDetails = shouldRestorePosition + ? Object.assign({}, basicDetails, details.box) + : basicDetails; + const win = await vAPI.windows.create(extraDetails); + if ( win === null ) { + if ( shouldRestorePosition === false ) { return; } + return vAPI.windows.create(basicDetails); + } + if ( shouldRestorePosition === false ) { return; } + if ( win.left === details.box.left ) { + if ( win.top === details.box.top ) { return; } } vAPI.windows.update(win.id, { left: details.box.left, @@ -442,7 +527,7 @@ try { tab = await webext.tabs.update(...arguments); } - catch (reason) { + catch { } return tab instanceof Object ? tab : null; } @@ -459,7 +544,7 @@ targetURL = vAPI.getURL(targetURL); } - vAPI.tabs.update(tabId, { url: targetURL }); + return vAPI.tabs.update(tabId, { url: targetURL }); } async remove(tabId) { @@ -468,7 +553,7 @@ try { await webext.tabs.remove(tabId); } - catch (reason) { + catch { } } @@ -481,7 +566,7 @@ { bypassCache: bypassCache === true } ); } - catch (reason) { + catch { } } @@ -580,7 +665,7 @@ try { win = await webext.windows.get(...arguments); } - catch (reason) { + catch { } return win instanceof Object ? win : null; }, @@ -589,7 +674,7 @@ try { win = await webext.windows.create(...arguments); } - catch (reason) { + catch { } return win instanceof Object ? win : null; }, @@ -598,7 +683,7 @@ try { win = await webext.windows.update(...arguments); } - catch (reason) { + catch { } return win instanceof Object ? win : null; }, @@ -614,7 +699,7 @@ try { await webext.browserAction.setTitle(...arguments); } - catch (reason) { + catch { } }, }; @@ -624,28 +709,28 @@ try { await webext.browserAction.setBadgeTextColor(...arguments); } - catch (reason) { + catch { } }; vAPI.browserAction.setBadgeBackgroundColor = async function() { try { await webext.browserAction.setBadgeBackgroundColor(...arguments); } - catch (reason) { + catch { } }; vAPI.browserAction.setBadgeText = async function() { try { await webext.browserAction.setBadgeText(...arguments); } - catch (reason) { + catch { } }; vAPI.browserAction.setIcon = async function() { try { await webext.browserAction.setIcon(...arguments); } - catch (reason) { + catch { } }; } @@ -668,14 +753,20 @@ // https://github.com/uBlockOrigin/uBlock-issues/issues/32 // Ensure ImageData for toolbar icon is valid before use. -vAPI.setIcon = (( ) => { +{ const browserAction = vAPI.browserAction; - const titleTemplate = - browser.runtime.getManifest().browser_action.default_title + - ' ({badge})'; + const titleTemplate = `${browser.runtime.getManifest().browser_action.default_title} ({badge})`; const icons = [ - { path: { '16': 'img/icon_16-off.png', '32': 'img/icon_32-off.png' } }, - { path: { '16': 'img/icon_16.png', '32': 'img/icon_32.png' } }, + { path: { + '16': 'img/icon_16-off.png', + '32': 'img/icon_32-off.png', + '64': 'img/icon_64-off.png', + } }, + { path: { + '16': 'img/icon_16.png', + '32': 'img/icon_32.png', + '64': 'img/icon_64.png', + } }, ]; (( ) => { @@ -702,9 +793,8 @@ const imgs = []; for ( let i = 0; i < icons.length; i++ ) { - const path = icons[i].path; - for ( const key in path ) { - if ( path.hasOwnProperty(key) === false ) { continue; } + for ( const key of Object.keys(icons[i].path) ) { + if ( parseInt(key, 10) >= 64 ) { continue; } imgs.push({ i: i, p: key, cached: false }); } } @@ -714,7 +804,7 @@ let data; try { data = ctx.getImageData(0, 0, w, h); - } catch(ex) { + } catch { } return data; }; @@ -765,14 +855,18 @@ // bit 2 = badge color // bit 3 = hide badge - return async function(tabId, details) { + vAPI.setIcon = async function(tabId, details) { tabId = toTabId(tabId); if ( tabId === 0 ) { return; } const tab = await vAPI.tabs.get(tabId); if ( tab === null ) { return; } - const { parts, state, badge, color } = details; + const hasUnprocessedRequest = vAPI.net && vAPI.net.hasUnprocessedRequest(tabId); + const { parts, state } = details; + const { badge, color } = hasUnprocessedRequest + ? { badge: '!', color: '#FC0' } + : details; if ( browserAction.setIcon !== undefined ) { if ( parts === undefined || (parts & 0b0001) !== 0 ) { @@ -795,20 +889,32 @@ // - the platform does not support browserAction.setIcon(); OR // - the rendering of the badge is disabled if ( browserAction.setTitle !== undefined ) { - browserAction.setTitle({ - tabId: tab.id, - title: titleTemplate.replace( - '{badge}', - state === 1 ? (badge !== '' ? badge : '0') : 'off' - ) - }); + const title = titleTemplate.replace('{badge}', + state === 1 ? (badge !== '' ? badge : '0') : 'off' + ); + browserAction.setTitle({ tabId: tab.id, title }); } if ( vAPI.contextMenu instanceof Object ) { vAPI.contextMenu.onMustUpdate(tabId); } }; -})(); + + vAPI.setDefaultIcon = function(flavor, text) { + if ( browserAction.setIcon === undefined ) { return; } + browserAction.setIcon({ + path: { + '16': `img/icon_16${flavor}.png`, + '32': `img/icon_32${flavor}.png`, + '64': `img/icon_64${flavor}.png`, + } + }); + browserAction.setBadgeText({ text }); + browserAction.setBadgeBackgroundColor({ + color: text === '!' ? '#FC0' : '#666' + }); + }; +} browser.browserAction.onClicked.addListener(function(tab) { vAPI.tabs.open({ @@ -849,6 +955,7 @@ onPortDisconnect: function(port) { this.ports.delete(port.name); + void browser.runtime.lastError; }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port @@ -906,71 +1013,11 @@ } }, - broadcast: function(message) { - const messageWrapper = { broadcast: true, msg: message }; - for ( const { port } of this.ports.values() ) { - try { - port.postMessage(messageWrapper); - } catch(ex) { - this.onPortDisconnect(port); - } - } - if ( this.defaultHandler ) { - this.defaultHandler(message, null, ( ) => { }); - } - }, - onFrameworkMessage: function(request, port, callback) { const portDetails = this.ports.get(port.name) || {}; const tabId = portDetails.tabId; const msg = request.msg; switch ( msg.what ) { - case 'connectionAccepted': - case 'connectionRefused': { - const toPort = this.ports.get(msg.fromToken); - if ( toPort !== undefined ) { - msg.tabId = tabId; - toPort.port.postMessage(request); - } else { - msg.what = 'connectionBroken'; - port.postMessage(request); - } - break; - } - case 'connectionRequested': - msg.tabId = tabId; - for ( const { port: toPort } of this.ports.values() ) { - if ( toPort === port ) { continue; } - try { - toPort.postMessage(request); - } catch (ex) { - this.onPortDisconnect(toPort); - } - } - break; - case 'connectionBroken': - case 'connectionCheck': - case 'connectionMessage': { - const toPort = this.ports.get( - port.name === msg.fromToken ? msg.toToken : msg.fromToken - ); - if ( toPort !== undefined ) { - msg.tabId = tabId; - toPort.port.postMessage(request); - } else { - msg.what = 'connectionBroken'; - port.postMessage(request); - } - break; - } - case 'extendClient': - vAPI.tabs.executeScript(tabId, { - file: '/js/vapi-client-extra.js', - frameId: portDetails.frameId, - }).then(( ) => { - callback(); - }); - break; case 'localStorage': { if ( portDetails.privileged !== true ) { break; } const args = msg.args || []; @@ -979,7 +1026,7 @@ }); break; } - case 'userCSS': + case 'userCSS': { if ( tabId === undefined ) { break; } const promises = []; if ( msg.add ) { @@ -1010,6 +1057,9 @@ }); break; } + default: + break; + } }, // Use a wrapper to avoid closure and to allow reuse. @@ -1031,7 +1081,7 @@ msgId: this.msgId, msg: response !== undefined ? response : null, }); - } catch (ex) { + } catch { this.messaging.onPortDisconnect(this.port); } // Store for reuse @@ -1106,24 +1156,24 @@ // https://github.com/uBlockOrigin/uBlock-issues/issues/550 // Support using a new secret for every network request. -vAPI.warSecret = (( ) => { - const generateSecret = ( ) => { - return Math.floor(Math.random() * 982451653 + 982451653).toString(36); - }; - +{ const root = vAPI.getURL('/'); - const secrets = []; - let lastSecretTime = 0; - - const guard = function(details) { - const url = details.url; - const pos = secrets.findIndex(secret => - url.lastIndexOf(`?secret=${secret}`) !== -1 - ); - if ( pos === -1 ) { - return { cancel: true }; - } - secrets.splice(pos, 1); + const reSecret = /\?secret=(\w+)/; + const shortSecrets = []; + let lastShortSecretTime = 0; + + // Long secrets are valid until revoked or uBO restarts. The realm is one + // value out of 36^18 = over 10^28 values. + const longSecrets = new Set(); + + const guard = details => { + const match = reSecret.exec(details.url); + if ( match === null ) { return { cancel: true }; } + const secret = match[1]; + if ( longSecrets.has(secret) ) { return; } + const pos = shortSecrets.indexOf(secret); + if ( pos === -1 ) { return { cancel: true }; } + shortSecrets.splice(pos, 1); }; browser.webRequest.onBeforeRequest.addListener( @@ -1134,20 +1184,30 @@ [ 'blocking' ] ); - return ( ) => { - if ( secrets.length !== 0 ) { - if ( (Date.now() - lastSecretTime) > 5000 ) { - secrets.splice(0); - } else if ( secrets.length > 256 ) { - secrets.splice(0, secrets.length - 192); + vAPI.warSecret = { + short: ( ) => { + if ( shortSecrets.length !== 0 ) { + if ( (Date.now() - lastShortSecretTime) > 5000 ) { + shortSecrets.splice(0); + } else if ( shortSecrets.length > 256 ) { + shortSecrets.splice(0, shortSecrets.length - 192); + } } - } - lastSecretTime = Date.now(); - const secret = generateSecret(); - secrets.push(secret); - return secret; + lastShortSecretTime = Date.now(); + const secret = vAPI.generateSecret(); + shortSecrets.push(secret); + return secret; + }, + long: previous => { + if ( previous !== undefined ) { + longSecrets.delete(previous); + } + const secret = vAPI.generateSecret(3); + longSecrets.add(secret); + return secret; + }, }; -})(); +} /******************************************************************************/ @@ -1157,14 +1217,16 @@ { const wrrt = browser.webRequest.ResourceType; for ( const typeKey in wrrt ) { - if ( wrrt.hasOwnProperty(typeKey) ) { + if ( Object.hasOwn(wrrt, typeKey) ) { this.validTypes.add(wrrt[typeKey]); } } } this.suspendableListener = undefined; + this.deferredSuspendableListener = undefined; this.listenerMap = new WeakMap(); this.suspendDepth = 0; + this.unprocessedTabs = new Map(); browser.webRequest.onBeforeRequest.addListener( details => { @@ -1177,6 +1239,8 @@ this.denormalizeFilters({ urls: [ 'http://*/*', 'https://*/*' ] }), [ 'blocking' ] ); + + vAPI.setDefaultIcon('-loading', ''); } setOptions(/* options */) { } @@ -1217,11 +1281,37 @@ ); } onBeforeSuspendableRequest(details) { - if ( this.suspendableListener === undefined ) { return; } - return this.suspendableListener(details); + if ( this.suspendableListener !== undefined ) { + return this.suspendableListener(details); + } + this.onUnprocessedRequest(details); } setSuspendableListener(listener) { + for ( const [ tabId, requests ] of this.unprocessedTabs ) { + let i = requests.length; + while ( i-- ) { + const r = listener(requests[i]); + if ( r === undefined || r.cancel !== true ) { + requests.splice(i, 1); + } + } + if ( requests.length !== 0 ) { continue; } + this.unprocessedTabs.delete(tabId); + } + if ( this.unprocessedTabs.size !== 0 ) { + this.deferredSuspendableListener = listener; + listener = details => { + const { tabId, type } = details; + if ( type === 'main_frame' && this.unprocessedTabs.has(tabId) ) { + if ( this.removeUnprocessedRequest(tabId) ) { + return this.suspendableListener(details); + } + } + return this.deferredSuspendableListener(details); + }; + } this.suspendableListener = listener; + vAPI.setDefaultIcon('', ''); } removeListener(which, clientListener) { const actualListener = this.listenerMap.get(clientListener); @@ -1237,6 +1327,41 @@ this.listenerMap.set(clientListener, actualListener); return actualListener; } + handlerBehaviorChanged() { + browser.webRequest.handlerBehaviorChanged(); + } + onUnprocessedRequest(details) { + const { tabId } = details; + if ( tabId === -1 ) { return; } + if ( this.unprocessedTabs.size === 0 ) { + vAPI.setDefaultIcon('-loading', '!'); + } + let requests = this.unprocessedTabs.get(tabId); + if ( requests === undefined ) { + this.unprocessedTabs.set(tabId, (requests = [])); + } + requests.push(Object.assign({}, details)); + } + hasUnprocessedRequest(tabId) { + if ( this.unprocessedTabs.size === 0 ) { return false; } + if ( tabId === undefined ) { return true; } + return this.unprocessedTabs.has(tabId); + } + removeUnprocessedRequest(tabId) { + if ( this.deferredSuspendableListener === undefined ) { + this.unprocessedTabs.clear(); + return true; + } + if ( tabId !== undefined ) { + this.unprocessedTabs.delete(tabId); + } else { + this.unprocessedTabs.clear(); + } + if ( this.unprocessedTabs.size !== 0 ) { return false; } + this.suspendableListener = this.deferredSuspendableListener; + this.deferredSuspendableListener = undefined; + return true; + } suspendOneRequest() { } unsuspendAllRequests() { @@ -1254,6 +1379,14 @@ if ( this.suspendDepth !== 0 ) { return; } this.unsuspendAllRequests(discard); } + headerValue(headers, name) { + for ( const header of headers ) { + if ( header.name.toLowerCase() === name ) { + return header.value.trim(); + } + } + return ''; + } static canSuspend() { return false; } @@ -1265,7 +1398,7 @@ // To be defined by platform-specific code. vAPI.scriptletsInjector = (( ) => { - self.uBO_scriptletsInjected = true; + self.uBO_scriptletsInjected = ''; }).toString(); /******************************************************************************/ @@ -1320,6 +1453,11 @@ // https://github.com/gorhill/uBlock/issues/900 // Also, UC Browser: http://www.upsieutoc.com/image/WXuH +// https://github.com/uBlockOrigin/uAssets/discussions/16939 +// Use a cached version of admin settings, such that there is no blocking +// call on `storage.managed`. The side effect is that any changes to admin +// settings will require an extra extension restart to take effect. + vAPI.adminStorage = (( ) => { if ( webext.storage.managed instanceof Object === false ) { return { @@ -1328,17 +1466,47 @@ }, }; } + const cacheManagedStorage = async ( ) => { + let store; + try { + store = await webext.storage.managed.get(); + } catch { + } + vAPI.storage.set({ cachedManagedStorage: store || {} }); + }; + return { get: async function(key) { let bin; try { - bin = await webext.storage.managed.get(key); - } catch(ex) { + bin = await vAPI.storage.get('cachedManagedStorage') || {}; + if ( Object.keys(bin).length === 0 ) { + bin = await webext.storage.managed.get() || {}; + } else { + bin = bin.cachedManagedStorage; + } + } catch { + bin = {}; + } + cacheManagedStorage(); + if ( key === undefined || key === null ) { + return bin; } if ( typeof key === 'string' && bin instanceof Object ) { return bin[key]; } - return bin; + const out = {}; + if ( Array.isArray(key) ) { + for ( const k of key ) { + if ( bin[k] === undefined ) { continue; } + out[k] = bin[k]; + } + return out; + } + for ( const [ k, v ] of Object.entries(key) ) { + out[k] = bin[k] !== undefined ? bin[k] : v; + } + return out; } }; })(); @@ -1359,17 +1527,14 @@ start: async function() { if ( this.cache instanceof Promise ) { return this.cache; } if ( this.cache instanceof Object ) { return this.cache; } - this.cache = webext.storage.local.get('localStorage').then(bin => { - this.cache = bin instanceof Object && - bin.localStorage instanceof Object - ? bin.localStorage - : {}; + this.cache = vAPI.storage.get('localStorage').then(bin => { + this.cache = bin && bin.localStorage || {}; }); return this.cache; }, clear: function() { this.cache = {}; - return webext.storage.local.set({ localStorage: this.cache }); + return vAPI.storage.set({ localStorage: this.cache }); }, getItem: function(key) { if ( this.cache instanceof Object === false ) { @@ -1391,7 +1556,7 @@ await this.start(); if ( value === this.cache[key] ) { return; } this.cache[key] = value; - return webext.storage.local.set({ localStorage: this.cache }); + return vAPI.storage.set({ localStorage: this.cache }); }, cache: undefined, }; @@ -1466,7 +1631,7 @@ try { bin = await webext.storage.sync.get(keys); } catch (reason) { - return reason; + return String(reason); } let chunkCount = 0; for ( let i = 0; i < maxChunkCountPerItem; i += 16 ) { @@ -1490,10 +1655,7 @@ const push = async function(details) { const { datakey, data, encode } = details; - if ( - data === undefined || - typeof data === 'string' && data === '' - ) { + if ( data === undefined || typeof data === 'string' && data === '' ) { return deleteChunks(datakey, 0); } const item = { @@ -1501,10 +1663,9 @@ tstamp: Date.now(), data, }; - const json = JSON.stringify(item); const encoded = encode instanceof Function - ? await encode(json) - : json; + ? await encode(item) + : JSON.stringify(item); // Chunkify taking into account QUOTA_BYTES_PER_ITEM: // https://developer.chrome.com/extensions/storage#property-sync @@ -1524,7 +1685,7 @@ // operation to fail. try { await deleteChunks(datakey, chunkCount + 1); - } catch (reason) { + } catch { } // Push the data to browser-provided cloud storage. @@ -1569,13 +1730,16 @@ i += 1; } encoded = encoded.join(''); - const json = decode instanceof Function - ? await decode(encoded) - : encoded; + let entry = null; try { - entry = JSON.parse(json); - } catch(ex) { + if ( decode instanceof Function ) { + entry = await decode(encoded) || null; + } + if ( typeof entry === 'string' ) { + entry = JSON.parse(entry); + } + } catch { } return entry; }; @@ -1596,7 +1760,7 @@ webext.storage.sync.getBytesInUse(keys), webext.storage.sync.getBytesInUse(null), ]); - } catch(ex) { + } catch { } if ( Array.isArray(results) === false ) { return; } return { used: results[0], total: results[1], max: QUOTA_BYTES }; @@ -1622,3 +1786,26 @@ })(); /******************************************************************************/ +/******************************************************************************/ + +vAPI.alarms = { + create(...args) { + webext.alarms.create(...args); + }, + createIfNotPresent(name, ...args) { + webext.alarms.get(name).then(details => { + if ( details !== undefined ) { return; } + webext.alarms.create(name, ...args); + }); + }, + async clear(...args) { + return webext.alarms.clear(...args); + }, + onAlarm: { + addListener(...args) { + webext.alarms.onAlarm.addListener(...args); + }, + }, +}; + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/common/vapi-client-extra.js ublock-origin-1.67.0+dfsg/platform/common/vapi-client-extra.js --- ublock-origin-1.46.0+dfsg/platform/common/vapi-client-extra.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/common/vapi-client-extra.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,312 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -// For non-background page - -'use strict'; - -/******************************************************************************/ - -// Direct messaging connection ability - -(( ) => { -// >>>>>>>> start of private namespace - -if ( - typeof vAPI !== 'object' || - vAPI.messaging instanceof Object === false || - vAPI.MessagingConnection instanceof Function -) { - return; -} - -const listeners = new Set(); -const connections = new Map(); - -vAPI.MessagingConnection = class { - constructor(handler, details) { - this.messaging = vAPI.messaging; - this.handler = handler; - this.id = details.id; - this.to = details.to; - this.toToken = details.toToken; - this.from = details.from; - this.fromToken = details.fromToken; - this.checkTimer = undefined; - // On Firefox it appears ports are not automatically disconnected - // when navigating to another page. - const ctor = vAPI.MessagingConnection; - if ( ctor.pagehide !== undefined ) { return; } - ctor.pagehide = ( ) => { - for ( const connection of connections.values() ) { - connection.disconnect(); - connection.handler( - connection.toDetails('connectionBroken') - ); - } - }; - window.addEventListener('pagehide', ctor.pagehide); - } - toDetails(what, payload) { - return { - what: what, - id: this.id, - from: this.from, - fromToken: this.fromToken, - to: this.to, - toToken: this.toToken, - payload: payload - }; - } - disconnect() { - if ( this.checkTimer !== undefined ) { - clearTimeout(this.checkTimer); - this.checkTimer = undefined; - } - connections.delete(this.id); - const port = this.messaging.getPort(); - if ( port === null ) { return; } - port.postMessage({ - channel: 'vapi', - msg: this.toDetails('connectionBroken'), - }); - } - checkAsync() { - if ( this.checkTimer !== undefined ) { - clearTimeout(this.checkTimer); - } - this.checkTimer = vAPI.setTimeout( - ( ) => { this.check(); }, - 499 - ); - } - check() { - this.checkTimer = undefined; - if ( connections.has(this.id) === false ) { return; } - const port = this.messaging.getPort(); - if ( port === null ) { return; } - port.postMessage({ - channel: 'vapi', - msg: this.toDetails('connectionCheck'), - }); - this.checkAsync(); - } - receive(details) { - switch ( details.what ) { - case 'connectionAccepted': - this.toToken = details.toToken; - this.handler(details); - this.checkAsync(); - break; - case 'connectionBroken': - connections.delete(this.id); - this.handler(details); - break; - case 'connectionMessage': - this.handler(details); - this.checkAsync(); - break; - case 'connectionCheck': - const port = this.messaging.getPort(); - if ( port === null ) { return; } - if ( connections.has(this.id) ) { - this.checkAsync(); - } else { - details.what = 'connectionBroken'; - port.postMessage({ channel: 'vapi', msg: details }); - } - break; - case 'connectionRefused': - connections.delete(this.id); - this.handler(details); - break; - } - } - send(payload) { - const port = this.messaging.getPort(); - if ( port === null ) { return; } - port.postMessage({ - channel: 'vapi', - msg: this.toDetails('connectionMessage', payload), - }); - } - - static addListener(listener) { - listeners.add(listener); - vAPI.messaging.getPort(); // Ensure a port instance exists - } - static removeListener(listener) { - listeners.delete(listener); - } - static connectTo(from, to, handler) { - const port = vAPI.messaging.getPort(); - if ( port === null ) { return; } - const connection = new vAPI.MessagingConnection(handler, { - id: `${from}-${to}-${vAPI.sessionId}`, - to: to, - from: from, - fromToken: port.name - }); - connections.set(connection.id, connection); - port.postMessage({ - channel: 'vapi', - msg: { - what: 'connectionRequested', - id: connection.id, - from: from, - fromToken: port.name, - to: to, - } - }); - return connection.id; - } - static disconnectFrom(connectionId) { - const connection = connections.get(connectionId); - if ( connection === undefined ) { return; } - connection.disconnect(); - } - static sendTo(connectionId, payload) { - const connection = connections.get(connectionId); - if ( connection === undefined ) { return; } - connection.send(payload); - } - static canDestroyPort() { - return listeners.length === 0 && connections.size === 0; - } - static mustDestroyPort() { - if ( connections.size === 0 ) { return; } - for ( const connection of connections.values() ) { - connection.receive({ what: 'connectionBroken' }); - } - connections.clear(); - } - static canProcessMessage(details) { - if ( details.channel !== 'vapi' ) { return; } - switch ( details.msg.what ) { - case 'connectionAccepted': - case 'connectionBroken': - case 'connectionCheck': - case 'connectionMessage': - case 'connectionRefused': { - const connection = connections.get(details.msg.id); - if ( connection === undefined ) { break; } - connection.receive(details.msg); - return true; - } - case 'connectionRequested': - if ( listeners.length === 0 ) { return; } - const port = vAPI.messaging.getPort(); - if ( port === null ) { break; } - let listener, result; - for ( listener of listeners ) { - result = listener(details.msg); - if ( result !== undefined ) { break; } - } - if ( result === undefined ) { break; } - if ( result === true ) { - details.msg.what = 'connectionAccepted'; - details.msg.toToken = port.name; - const connection = new vAPI.MessagingConnection( - listener, - details.msg - ); - connections.set(connection.id, connection); - } else { - details.msg.what = 'connectionRefused'; - } - port.postMessage(details); - return true; - default: - break; - } - } -}; - -vAPI.messaging.extensions.push(vAPI.MessagingConnection); - -// <<<<<<<< end of private namespace -})(); - -/******************************************************************************/ - -// Broadcast listening ability - -(( ) => { -// >>>>>>>> start of private namespace - -if ( - typeof vAPI !== 'object' || - vAPI.messaging instanceof Object === false || - vAPI.broadcastListener instanceof Object -) { - return; -} - -const listeners = new Set(); - -vAPI.broadcastListener = { - add: function(listener) { - listeners.add(listener); - vAPI.messaging.getPort(); - }, - remove: function(listener) { - listeners.delete(listener); - }, - canDestroyPort() { - return listeners.size === 0; - }, - mustDestroyPort() { - listeners.clear(); - }, - canProcessMessage(details) { - if ( details.broadcast === false ) { return; } - for ( const listener of listeners ) { - listener(details.msg); - } - }, -}; - -vAPI.messaging.extensions.push(vAPI.broadcastListener); - -// <<<<<<<< end of private namespace -})(); - -/******************************************************************************/ - - - - - - - - -/******************************************************************************* - - DO NOT: - - Remove the following code - - Add code beyond the following code - Reason: - - https://github.com/gorhill/uBlock/pull/3721 - - uBO never uses the return value from injected content scripts - -**/ - -void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/common/vapi-client.js ublock-origin-1.67.0+dfsg/platform/common/vapi-client.js --- ublock-origin-1.46.0+dfsg/platform/common/vapi-client.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/common/vapi-client.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-2015 The uBlock Origin authors Copyright (C) 2014-present Raymond Hill @@ -22,8 +22,6 @@ // For non-background page -'use strict'; - /******************************************************************************/ // https://github.com/chrisaljoudi/uBlock/issues/456 @@ -81,10 +79,9 @@ port: null, portTimer: null, portTimerDelay: 10000, - extended: undefined, - extensions: [], msgIdGenerator: 1, pending: new Map(), + waitStartTime: 0, shuttingDown: false, shutdown: function() { @@ -115,33 +112,16 @@ // revisited to isolate the picker dialog DOM from the page DOM. messageListener: function(details) { if ( typeof details !== 'object' || details === null ) { return; } - - // Response to specific message previously sent - if ( details.msgId !== undefined ) { - const resolver = this.pending.get(details.msgId); - if ( resolver !== undefined ) { - this.pending.delete(details.msgId); - resolver(details.msg); - return; - } - } - - // Unhandled messages - this.extensions.every(ext => ext.canProcessMessage(details) !== true); + if ( details.msgId === undefined ) { return; } + const resolver = this.pending.get(details.msgId); + if ( resolver === undefined ) { return; } + this.pending.delete(details.msgId); + resolver(details.msg); }, messageListenerBound: null, canDestroyPort: function() { - return this.pending.size === 0 && ( - this.extensions.length === 0 || - this.extensions.every(e => e.canDestroyPort()) - ); - }, - - mustDestroyPort: function() { - if ( this.extensions.length === 0 ) { return; } - this.extensions.forEach(e => e.mustDestroyPort()); - this.extensions.length = 0; + return this.pending.size === 0; }, portPoller: function() { @@ -166,7 +146,6 @@ port.onDisconnect.removeListener(this.disconnectListenerBound); this.port = null; } - this.mustDestroyPort(); // service pending callbacks if ( this.pending.size !== 0 ) { const pending = this.pending; @@ -186,7 +165,7 @@ } try { this.port = browser.runtime.connect({name: vAPI.sessionId}) || null; - } catch (ex) { + } catch { this.port = null; } // Not having a valid port at this point means the main process is @@ -216,13 +195,18 @@ // the main process is no longer reachable: memory leaks and bad // performance become a risk -- especially for long-lived, dynamic // pages. Guard against this. - if ( this.pending.size > 50 ) { - vAPI.shutdown.exec(); + if ( this.pending.size > 64 ) { + if ( (Date.now() - this.waitStartTime) > 60000 ) { + vAPI.shutdown.exec(); + } } const port = this.getPort(); if ( port === null ) { return Promise.resolve(); } + if ( this.pending.size === 0 ) { + this.waitStartTime = Date.now(); + } const msgId = this.msgIdGenerator++; const promise = new Promise(resolve => { this.pending.set(msgId, resolve); @@ -230,22 +214,6 @@ port.postMessage({ channel, msgId, msg }); return promise; }, - - // Dynamically extend capabilities. - // - // https://github.com/uBlockOrigin/uBlock-issues/issues/1571 - // Don't use `self` to access `vAPI`. - extend: function() { - if ( this.extended === undefined ) { - this.extended = vAPI.messaging.send('vapi', { - what: 'extendClient' - }).then(( ) => - typeof vAPI === 'object' && this.extensions.length !== 0 - ).catch(( ) => { - }); - } - return this.extended; - }, }; vAPI.shutdown.add(( ) => { diff -Nru ublock-origin-1.46.0+dfsg/platform/common/vapi-common.js ublock-origin-1.67.0+dfsg/platform/common/vapi-common.js --- ublock-origin-1.46.0+dfsg/platform/common/vapi-common.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/common/vapi-common.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-2015 The uBlock Origin authors Copyright (C) 2014-present Raymond Hill @@ -22,18 +22,123 @@ // For background page or non-background pages -/* global browser */ - -'use strict'; - -/******************************************************************************/ /******************************************************************************/ vAPI.T0 = Date.now(); +vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self); + /******************************************************************************/ -vAPI.setTimeout = vAPI.setTimeout || self.setTimeout.bind(self); +vAPI.defer = { + create(callback) { + return new this.Client(callback); + }, + once(delay, ...args) { + const delayInMs = vAPI.defer.normalizeDelay(delay); + return new Promise(resolve => { + vAPI.setTimeout( + (...args) => { resolve(...args); }, + delayInMs, + ...args + ); + }); + }, + Client: class { + constructor(callback) { + this.timer = null; + this.type = 0; + this.callback = callback; + } + on(delay, ...args) { + if ( this.timer !== null ) { return; } + const delayInMs = vAPI.defer.normalizeDelay(delay); + this.type = 0; + this.timer = vAPI.setTimeout(( ) => { + this.timer = null; + this.callback(...args); + }, delayInMs || 1); + } + offon(delay, ...args) { + this.off(); + this.on(delay, ...args); + } + onvsync(delay, ...args) { + if ( this.timer !== null ) { return; } + const delayInMs = vAPI.defer.normalizeDelay(delay); + if ( delayInMs !== 0 ) { + this.type = 0; + this.timer = vAPI.setTimeout(( ) => { + this.timer = null; + this.onraf(...args); + }, delayInMs); + } else { + this.onraf(...args); + } + } + onidle(delay, options, ...args) { + if ( this.timer !== null ) { return; } + const delayInMs = vAPI.defer.normalizeDelay(delay); + if ( delayInMs !== 0 ) { + this.type = 0; + this.timer = vAPI.setTimeout(( ) => { + this.timer = null; + this.onric(options, ...args); + }, delayInMs); + } else { + this.onric(options, ...args); + } + } + off() { + if ( this.timer === null ) { return; } + switch ( this.type ) { + case 0: + self.clearTimeout(this.timer); + break; + case 1: + self.cancelAnimationFrame(this.timer); + break; + case 2: + self.cancelIdleCallback(this.timer); + break; + default: + break; + } + this.timer = null; + } + onraf(...args) { + if ( this.timer !== null ) { return; } + this.type = 1; + this.timer = requestAnimationFrame(( ) => { + this.timer = null; + this.callback(...args); + }); + } + onric(options, ...args) { + if ( this.timer !== null ) { return; } + this.type = 2; + this.timer = self.requestIdleCallback(deadline => { + this.timer = null; + this.callback(deadline, ...args); + }, options); + } + ongoing() { + return this.timer !== null; + } + }, + normalizeDelay(delay = 0) { + if ( typeof delay === 'object' ) { + if ( delay.sec !== undefined ) { + return delay.sec * 1000; + } else if ( delay.min !== undefined ) { + return delay.min * 60000; + } else if ( delay.hr !== undefined ) { + return delay.hr * 3600000; + } + } + return delay; + } +}; /******************************************************************************/ @@ -45,6 +150,9 @@ } }; +// https://bugzilla.mozilla.org/show_bug.cgi?id=1858743 +// Add support for native `:has()` for Firefox 121+ + (( ) => { const ua = navigator.userAgent; const flavor = vAPI.webextFlavor; @@ -55,9 +163,12 @@ // This is always true. soup.add('ublock').add('webext'); + soup.add('ipaddress'); // Whether this is a dev build. - if ( /^\d+\.\d+\.\d+\D/.test(browser.runtime.getManifest().version) ) { + const manifest = browser.runtime.getManifest(); + const version = manifest.version_name || manifest.version; + if ( /^\d+\.\d+\.\d+\D/.test(version) ) { soup.add('devbuild'); } @@ -65,35 +176,27 @@ soup.add('mobile'); } - // Asynchronous - if ( - browser instanceof Object && - typeof browser.runtime.getBrowserInfo === 'function' - ) { - browser.runtime.getBrowserInfo().then(info => { - flavor.major = parseInt(info.version, 10) || flavor.major; - soup.add(info.vendor.toLowerCase()) - .add(info.name.toLowerCase()); - dispatch(); - }); - if ( browser.runtime.getURL('').startsWith('moz-extension://') ) { - soup.add('firefox') - .add('user_stylesheet') - .add('html_filtering'); - flavor.major = 91; - } - return; - } - - // Synchronous -- order of tests is important - const match = /\bChrom(?:e|ium)\/([\d.]+)/.exec(ua); - if ( match !== null ) { - soup.add('chromium') - .add('user_stylesheet'); - flavor.major = parseInt(match[1], 10) || 0; - if ( flavor.major >= 105 ) { - soup.add('native_css_has'); + if ( CSS.supports('selector(a:has(b))') ) { + soup.add('native_css_has'); + } + + const extensionOrigin = browser.runtime.getURL(''); + + // Order of tests is important + flavor.isGecko = extensionOrigin.startsWith('moz-extension://'); + if ( flavor.isGecko ) { + soup.add('firefox') + .add('user_stylesheet') + .add('html_filtering'); + const match = /Firefox\/(\d+)/.exec(ua); + flavor.major = match && parseInt(match[1], 10) || 115; + } else { + const match = /\bChrom(?:e|ium)\/(\d+)/.exec(ua); + if ( match !== null ) { + soup.add('chromium') + .add('user_stylesheet'); } + flavor.major = match && parseInt(match[1], 10) || 120; } // Don't starve potential listeners diff -Nru ublock-origin-1.46.0+dfsg/platform/common/vapi.js ublock-origin-1.67.0+dfsg/platform/common/vapi.js --- ublock-origin-1.46.0+dfsg/platform/common/vapi.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/common/vapi.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2017-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/* global HTMLDocument, XMLDocument */ - // For background page, auxiliary pages, and content scripts. /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/dig/snfe.js ublock-origin-1.67.0+dfsg/platform/dig/snfe.js --- ublock-origin-1.46.0+dfsg/platform/dig/snfe.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/dig/snfe.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,22 +19,12 @@ Home: https://github.com/gorhill/uBlock */ -/* eslint-disable-next-line no-redeclare */ /* globals process */ -'use strict'; - -/******************************************************************************/ - -import { strict as assert } from 'assert'; +import { StaticNetFilteringEngine, enableWASM } from './index.js'; +import { mkdir, readFile, writeFile } from 'fs/promises'; import { createRequire } from 'module'; -import { readFileSync, writeFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -import { enableWASM, StaticNetFilteringEngine } from './index.js'; +import { dirname } from 'path'; /******************************************************************************/ @@ -81,11 +71,12 @@ } async function read(path) { - return readFileSync(resolve(__dirname, path), 'utf8'); + return readFile(path, 'utf8'); } async function write(path, data) { - return writeFileSync(resolve(__dirname, path), data, 'utf8'); + await mkdir(dirname(path), { recursive: true }); + return writeFile(path, data, 'utf8'); } /******************************************************************************/ @@ -342,23 +333,19 @@ let start = process.hrtime.bigint(); await engine.useLists([ + read('assets/ublock/filters.min.txt') + .then(raw => ({ name: 'filters', raw })), read('assets/ublock/badware.txt') .then(raw => ({ name: 'badware', raw })), - read('assets/ublock/filters.txt') - .then(raw => ({ name: 'filters', raw })), - read('assets/ublock/filters-2020.txt') - .then(raw => ({ name: 'filters-2020', raw })), - read('assets/ublock/filters-2021.txt') - .then(raw => ({ name: 'filters-2021', raw })), - read('assets/ublock/privacy.txt') + read('assets/ublock/privacy.min.txt') .then(raw => ({ name: 'privacy', raw })), - read('assets/ublock/resource-abuse.txt') - .then(raw => ({ name: 'resource-abuse', raw })), + read('assets/ublock/quick-fixes.txt') + .then(raw => ({ name: 'quick-fixes.txt', raw })), read('assets/ublock/unbreak.txt') .then(raw => ({ name: 'unbreak.txt', raw })), - read('assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt') + read('assets/thirdparties/easylist/easylist.txt') .then(raw => ({ name: 'easylist', raw })), - read('assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt') + read('assets/thirdparties/easylist/easyprivacy.txt') .then(raw => ({ name: 'easyprivacy', raw })), read('assets/thirdparties/pgl.yoyo.org/as/serverlist') .then(raw => ({ name: 'PGL', raw })), diff -Nru ublock-origin-1.46.0+dfsg/platform/firefox/manifest.json ublock-origin-1.67.0+dfsg/platform/firefox/manifest.json --- ublock-origin-1.46.0+dfsg/platform/firefox/manifest.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/firefox/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -5,9 +5,11 @@ }, "browser_action": { "browser_style": false, + "default_area": "navbar", "default_icon": { "16": "img/icon_16.png", - "32": "img/icon_32.png" + "32": "img/icon_32.png", + "64": "img/icon_64.png" }, "default_title": "uBlock Origin", "default_popup": "popup-fenix.html" @@ -15,7 +17,10 @@ "browser_specific_settings": { "gecko": { "id": "uBlock0@raymondhill.net", - "strict_min_version": "68.0" + "strict_min_version": "92.0" + }, + "gecko_android": { + "strict_min_version": "92.0" } }, "commands": { @@ -38,6 +43,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ @@ -63,14 +71,25 @@ "https://filterlists.com/*", "https://forums.lanik.us/*", "https://github.com/*", - "https://*.github.io/*", - "https://*.letsblock.it/*" + "https://*.github.io/*" ], "js": [ "/js/scriptlets/subscriber.js" ], "run_at": "document_idle", "all_frames": false + }, + { + "matches": [ + "https://github.com/uBlockOrigin/*", + "https://ublockorigin.github.io/*", + "https://*.reddit.com/r/uBlockOrigin/*" + ], + "js": [ + "/js/scriptlets/updater.js" + ], + "run_at": "document_idle", + "all_frames": false } ], "default_locale": "en", @@ -80,7 +99,8 @@ "32": "img/ublock.svg", "48": "img/ublock.svg", "64": "img/ublock.svg", - "96": "img/ublock.svg" + "96": "img/ublock.svg", + "128": "img/ublock.svg" }, "manifest_version": 2, "name": "uBlock Origin", @@ -89,6 +109,7 @@ "open_in_tab": true }, "permissions": [ + "alarms", "dns", "menus", "privacy", diff -Nru ublock-origin-1.46.0+dfsg/platform/firefox/vapi-background-ext.js ublock-origin-1.67.0+dfsg/platform/firefox/vapi-background-ext.js --- ublock-origin-1.46.0+dfsg/platform/firefox/vapi-background-ext.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/firefox/vapi-background-ext.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2017-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,12 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser */ - -'use strict'; - -/******************************************************************************/ - import { domainFromHostname, hostnameFromNetworkURL, @@ -32,26 +26,20 @@ /******************************************************************************/ -// Canonical name-uncloaking feature. -let cnameUncloakEnabled = browser.dns instanceof Object; -let cnameUncloakProxied = false; - -// https://github.com/uBlockOrigin/uBlock-issues/issues/911 -// We detect here whether network requests are proxied, and if so, -// de-aliasing of hostnames will be disabled to avoid possible -// DNS leaks. -const proxyDetector = function(details) { - if ( details.proxyInfo instanceof Object ) { - cnameUncloakEnabled = false; - proxyDetectorTryCount = 0; - } - if ( proxyDetectorTryCount === 0 ) { - browser.webRequest.onHeadersReceived.removeListener(proxyDetector); - return; +const dnsAPI = browser.dns || { + resolve() { + return Promise.resolve(); } - proxyDetectorTryCount -= 1; }; -let proxyDetectorTryCount = 0; + +const isPromise = o => o instanceof Promise; +const isResolvedObject = o => o instanceof Object && + o instanceof Promise === false; +const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/ +const skipDNS = proxyInfo => + proxyInfo && (proxyInfo.proxyDNS || proxyInfo.type?.charCodeAt(0) === 0x68 /* h */); + +/******************************************************************************/ // Related issues: // - https://github.com/gorhill/uBlock/issues/1327 @@ -64,26 +52,27 @@ constructor() { super(); this.pendingRequests = []; - this.canUncloakCnames = browser.dns instanceof Object; - this.cnames = new Map([ [ '', null ] ]); + this.dnsList = []; // ring buffer + this.dnsWritePtr = 0; // next write pointer in ring buffer + this.dnsMaxCount = 512; // max size of ring buffer + this.dnsDict = new Map(); // hn to index in ring buffer + this.dnsCacheTTL = 600; // TTL in seconds + this.canUncloakCnames = true; + this.cnameUncloakEnabled = true; this.cnameIgnoreList = null; this.cnameIgnore1stParty = true; this.cnameIgnoreExceptions = true; this.cnameIgnoreRootDocument = true; - this.cnameMaxTTL = 120; this.cnameReplayFullURL = false; - this.cnameFlushTime = Date.now() + this.cnameMaxTTL * 60000; + this.dnsResolveEnabled = true; } + setOptions(options) { super.setOptions(options); if ( 'cnameUncloakEnabled' in options ) { - cnameUncloakEnabled = - this.canUncloakCnames && + this.cnameUncloakEnabled = options.cnameUncloakEnabled !== false; } - if ( 'cnameUncloakProxied' in options ) { - cnameUncloakProxied = options.cnameUncloakProxied === true; - } if ( 'cnameIgnoreList' in options ) { this.cnameIgnoreList = this.regexFromStrList(options.cnameIgnoreList); @@ -100,54 +89,41 @@ this.cnameIgnoreRootDocument = options.cnameIgnoreRootDocument !== false; } - if ( 'cnameMaxTTL' in options ) { - this.cnameMaxTTL = options.cnameMaxTTL || 120; - } if ( 'cnameReplayFullURL' in options ) { this.cnameReplayFullURL = options.cnameReplayFullURL === true; } - this.cnames.clear(); this.cnames.set('', null); - this.cnameFlushTime = Date.now() + this.cnameMaxTTL * 60000; - // https://github.com/uBlockOrigin/uBlock-issues/issues/911 - // Install/remove proxy detector. - if ( vAPI.webextFlavor.major < 80 ) { - const wrohr = browser.webRequest.onHeadersReceived; - if ( cnameUncloakEnabled === false || cnameUncloakProxied ) { - if ( wrohr.hasListener(proxyDetector) ) { - wrohr.removeListener(proxyDetector); - } - } else if ( wrohr.hasListener(proxyDetector) === false ) { - wrohr.addListener( - proxyDetector, - { urls: [ '*://*/*' ] }, - [ 'blocking' ] - ); - } - proxyDetectorTryCount = 32; + if ( 'dnsCacheTTL' in options ) { + this.dnsCacheTTL = options.dnsCacheTTL; + } + if ( 'dnsResolveEnabled' in options ) { + this.dnsResolveEnabled = options.dnsResolveEnabled === true; } + this.dnsList.fill(null); + this.dnsDict.clear(); } + normalizeDetails(details) { + // https://github.com/uBlockOrigin/uBlock-issues/issues/3379 + if ( skipDNS(details.proxyInfo) && details.ip === '0.0.0.0' ) { + details.ip = null; + } const type = details.type; - if ( type === 'imageset' ) { details.type = 'image'; return; } - + if ( type !== 'object' ) { return; } + // Try to extract type from response headers if present. + if ( details.responseHeaders === undefined ) { return; } + const ctype = this.headerValue(details.responseHeaders, 'content-type'); // https://github.com/uBlockOrigin/uBlock-issues/issues/345 // Re-categorize an embedded object as a `sub_frame` if its // content type is that of a HTML document. - if ( type === 'object' && Array.isArray(details.responseHeaders) ) { - for ( const header of details.responseHeaders ) { - if ( header.name.toLowerCase() === 'content-type' ) { - if ( header.value.startsWith('text/html') ) { - details.type = 'sub_frame'; - } - break; - } - } + if ( ctype === 'text/html' ) { + details.type = 'sub_frame'; } } + denormalizeTypes(types) { if ( types.length === 0 ) { return Array.from(this.validTypes); @@ -166,77 +142,21 @@ } return Array.from(out); } + canonicalNameFromHostname(hn) { - const cnRecord = this.cnames.get(hn); - if ( cnRecord !== undefined && cnRecord !== null ) { - return cnRecord.cname; - } - } - processCanonicalName(hn, cnRecord, details) { - if ( cnRecord === null ) { return; } - if ( cnRecord.isRootDocument ) { return; } - const hnBeg = details.url.indexOf(hn); - if ( hnBeg === -1 ) { return; } - const oldURL = details.url; - let newURL = oldURL.slice(0, hnBeg) + cnRecord.cname; - const hnEnd = hnBeg + hn.length; - if ( this.cnameReplayFullURL ) { - newURL += oldURL.slice(hnEnd); - } else { - const pathBeg = oldURL.indexOf('/', hnEnd); - if ( pathBeg !== -1 ) { - newURL += oldURL.slice(hnEnd, pathBeg + 1); - } - } - details.url = newURL; - details.aliasURL = oldURL; - return super.onBeforeSuspendableRequest(details); - } - recordCanonicalName(hn, record, isRootDocument) { - if ( (this.cnames.size & 0b111111) === 0 ) { - const now = Date.now(); - if ( now >= this.cnameFlushTime ) { - this.cnames.clear(); this.cnames.set('', null); - this.cnameFlushTime = now + this.cnameMaxTTL * 60000; - } - } - let cname = - typeof record.canonicalName === 'string' && - record.canonicalName !== hn - ? record.canonicalName - : ''; - if ( - cname !== '' && - this.cnameIgnore1stParty && - domainFromHostname(cname) === domainFromHostname(hn) - ) { - cname = ''; - } - if ( - cname !== '' && - this.cnameIgnoreList !== null && - this.cnameIgnoreList.test(cname) - ) { - cname = ''; - } - const cnRecord = cname !== '' ? { cname, isRootDocument } : null; - this.cnames.set(hn, cnRecord); - return cnRecord; + if ( hn === '' ) { return; } + const dnsEntry = this.dnsFromCache(hn, true); + if ( isResolvedObject(dnsEntry) === false ) { return; } + return dnsEntry.cname; } + regexFromStrList(list) { - if ( - typeof list !== 'string' || - list.length === 0 || - list === 'unset' || - browser.dns instanceof Object === false - ) { + if ( typeof list !== 'string' || list.length === 0 || list === 'unset' ) { return null; } - if ( list === '*' ) { - return /^./; - } + if ( list === '*' ) { return /^./; } return new RegExp( - '(?:^|\.)(?:' + + '(?:^|\\.)(?:' + list.trim() .split(/\s+/) .map(a => a.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) @@ -244,9 +164,14 @@ ')$' ); } + onBeforeSuspendableRequest(details) { + const hn = hostnameFromNetworkURL(details.url); + const dnsEntry = this.dnsFromCache(hn); + if ( isResolvedObject(dnsEntry) && dnsEntry.ip ) { + details.ip = dnsEntry.ip; + } const r = super.onBeforeSuspendableRequest(details); - if ( cnameUncloakEnabled === false ) { return r; } if ( r !== undefined ) { if ( r.cancel === true || @@ -256,24 +181,144 @@ return r; } } - const hn = hostnameFromNetworkURL(details.url); - const cnRecord = this.cnames.get(hn); - if ( cnRecord !== undefined ) { - return this.processCanonicalName(hn, cnRecord, details); - } - const documentUrl = details.documentUrl || details.url; - const isRootDocument = this.cnameIgnoreRootDocument && - hn === hostnameFromNetworkURL(documentUrl); - return browser.dns.resolve(hn, [ 'canonical_name' ]).then( - rec => { - const cnRecord = this.recordCanonicalName(hn, rec, isRootDocument); - return this.processCanonicalName(hn, cnRecord, details); - }, - ( ) => { - this.cnames.set(hn, null); + if ( isResolvedObject(dnsEntry) ) { + return this.onAfterDNSResolution(hn, details, dnsEntry); + } + if ( skipDNS(details.proxyInfo) ) { return; } + if ( this.dnsShouldResolve(hn) === false ) { return; } + const promise = dnsEntry || this.dnsResolve(hn, details); + return promise.then(( ) => this.onAfterDNSResolution(hn, details)); + } + + onAfterDNSResolution(hn, details, dnsEntry) { + if ( dnsEntry === undefined ) { + dnsEntry = this.dnsFromCache(hn); + if ( isResolvedObject(dnsEntry) === false ) { return; } + } + let proceed = false; + if ( dnsEntry.cname && this.cnameUncloakEnabled ) { + const newURL = this.uncloakURL(hn, dnsEntry, details); + if ( newURL ) { + details.aliasURL = details.url; + details.url = newURL; + proceed = true; } + } + if ( dnsEntry.ip && details.ip !== dnsEntry.ip ) { + details.ip = dnsEntry.ip + proceed = true; + } + if ( proceed === false ) { return; } + // Must call method on base class + return super.onBeforeSuspendableRequest(details); + } + + dnsToCache(hn, record, details) { + const dnsEntry = { hn, until: Date.now() + this.dnsCacheTTL * 1000 }; + if ( record ) { + const cname = this.cnameFromRecord(hn, record, details); + if ( cname ) { dnsEntry.cname = cname; } + const ip = this.ipFromRecord(record); + if ( ip ) { dnsEntry.ip = ip; } + } + this.dnsSetCache(-1, hn, dnsEntry); + return dnsEntry; + } + + dnsFromCache(hn, passive = false) { + const i = this.dnsDict.get(hn); + if ( i === undefined ) { return; } + if ( isPromise(i) ) { return i; } + const dnsEntry = this.dnsList[i]; + if ( dnsEntry !== null && dnsEntry.hn === hn ) { + if ( passive || dnsEntry.until >= Date.now() ) { + return dnsEntry; + } + } + this.dnsSetCache(i); + } + + dnsSetCache(i, hn, after) { + if ( i < 0 ) { + const j = this.dnsDict.get(hn); + if ( typeof j === 'number' ) { + this.dnsList[j] = after; + return; + } + i = this.dnsWritePtr++; + this.dnsWritePtr %= this.dnsMaxCount; + } + const before = this.dnsList[i]; + if ( before ) { + this.dnsDict.delete(before.hn); + } + if ( after ) { + this.dnsDict.set(hn, i); + this.dnsList[i] = after; + } else { + if ( hn ) { this.dnsDict.delete(hn); } + this.dnsList[i] = null; + } + } + + dnsShouldResolve(hn) { + if ( this.dnsResolveEnabled === false ) { return false; } + if ( hn === '' ) { return false; } + const c0 = hn.charCodeAt(0); + if ( c0 === 0x5B /* [ */ ) { return false; } + if ( c0 > 0x39 /* 9 */ ) { return true; } + return reIPv4.test(hn) === false; + } + + dnsResolve(hn, details) { + const promise = dnsAPI.resolve(hn, [ 'canonical_name' ]).then( + rec => this.dnsToCache(hn, rec, details), + ( ) => this.dnsToCache(hn) ); + this.dnsDict.set(hn, promise); + return promise; + } + + cnameFromRecord(hn, record, details) { + const cn = record.canonicalName; + if ( cn === undefined ) { return; } + if ( cn === hn ) { return; } + if ( this.cnameIgnore1stParty ) { + if ( domainFromHostname(cn) === domainFromHostname(hn) ) { return; } + } + if ( this.cnameIgnoreList !== null ) { + if ( this.cnameIgnoreList.test(cn) ) { return; } + } + if ( this.cnameIgnoreRootDocument ) { + const origin = hostnameFromNetworkURL(details.documentUrl || details.url); + if ( hn === origin ) { return; } + } + return cn; } + + uncloakURL(hn, dnsEntry, details) { + const hnBeg = details.url.indexOf(hn); + if ( hnBeg === -1 ) { return; } + const oldURL = details.url; + const newURL = oldURL.slice(0, hnBeg) + dnsEntry.cname; + const hnEnd = hnBeg + hn.length; + if ( this.cnameReplayFullURL ) { + return newURL + oldURL.slice(hnEnd); + } + const pathBeg = oldURL.indexOf('/', hnEnd); + if ( pathBeg !== -1 ) { + return newURL + oldURL.slice(hnEnd, pathBeg + 1); + } + return newURL; + } + + ipFromRecord(record) { + const { addresses } = record; + if ( Array.isArray(addresses) === false ) { return; } + if ( addresses.length === 0 ) { return; } + return addresses.join('\n'); + } + suspendOneRequest(details) { const pending = { details: Object.assign({}, details), @@ -286,6 +331,7 @@ this.pendingRequests.push(pending); return pending.promise; } + unsuspendAllRequests(discard = false) { const pendingRequests = this.pendingRequests; this.pendingRequests = []; @@ -297,6 +343,7 @@ ); } } + static canSuspend() { return true; } @@ -304,22 +351,77 @@ /******************************************************************************/ -vAPI.scriptletsInjector = ((doc, scriptlets) => { - let script, url; - try { - const blob = new self.Blob([ scriptlets ], { type: 'text/javascript' }); - url = self.URL.createObjectURL(blob); - script = doc.createElement('script'); - script.async = false; - script.src = url; - (doc.head || doc.documentElement).appendChild(script); - self.uBO_scriptletsInjected = true; - } catch (ex) { - } - if ( url ) { - if ( script ) { script.remove(); } - self.URL.revokeObjectURL(url); - } -}).toString(); +vAPI.scriptletsInjector = (( ) => { + const parts = [ + '(', + function(details) { + if ( self.uBO_scriptletsInjected !== undefined ) { return; } + const doc = document; + const { location } = doc; + if ( location === null ) { return; } + const { hostname } = location; + if ( hostname !== '' && details.hostname !== hostname ) { return; } + // Use a page world sentinel to verify that execution was + // successful + const { sentinel } = details; + let script; + try { + const code = [ + `self['${sentinel}'] = true;`, + details.scriptlets, + ].join('\n'); + script = doc.createElement('script'); + script.appendChild(doc.createTextNode(code)); + (doc.head || doc.documentElement).appendChild(script); + } catch { + } + if ( script ) { + script.remove(); + script.textContent = ''; + script = undefined; + } + if ( self.wrappedJSObject[sentinel] ) { + delete self.wrappedJSObject[sentinel]; + self.uBO_scriptletsInjected = details.filters; + return 0; + } + // https://github.com/uBlockOrigin/uBlock-issues/issues/235 + // Fall back to blob injection if execution through direct + // injection failed + let url; + try { + const blob = new self.Blob( + [ details.scriptlets ], + { type: 'text/javascript; charset=utf-8' } + ); + url = self.URL.createObjectURL(blob); + script = doc.createElement('script'); + script.async = false; + script.src = url; + (doc.head || doc.documentElement || doc).append(script); + self.uBO_scriptletsInjected = details.filters; + } catch { + } + if ( url ) { + if ( script ) { script.remove(); } + self.URL.revokeObjectURL(url); + } + return 0; + }.toString(), + ')(', + 'json-slot', + ');', + ]; + const jsonSlot = parts.indexOf('json-slot'); + return (hostname, details) => { + parts[jsonSlot] = JSON.stringify({ + hostname, + scriptlets: details.mainWorld, + filters: details.filters, + sentinel: vAPI.generateSecret(3), + }); + return parts.join(''); + }; +})(); /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/firefox/webext.js ublock-origin-1.67.0+dfsg/platform/firefox/webext.js --- ublock-origin-1.46.0+dfsg/platform/firefox/webext.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/firefox/webext.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2019-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,6 +19,4 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - export default browser; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/README.md ublock-origin-1.67.0+dfsg/platform/mv3/README.md --- ublock-origin-1.46.0+dfsg/platform/mv3/README.md 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/README.md 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,34 @@ +# How to build MV3 uBO Lite + +Instructions for reviewers. + +The following assumes a linux environment. + +1. Open Bash console +2. `git clone https://github.com/gorhill/uBlock.git` +3. `cd uBlock` +4. `git submodule init` +5. `git submodule update` +6. `make mv3-[platform]`, where `[platform]` is either `chromium`, `edge`, `firefox`, or `safari` +7. This will fully build uBO Lite, and during the process filter lists will be downloaded from their respective remote servers + +Upon completion of the script, the resulting extension package will become present in: + +- Chromium: `dist/build/uBOLite.chromium` +- Edge: `dist/build/uBOLite.edge` +- Firefox: `dist/build/uBOLite.firefox` +- Safari: `dist/build/uBOLite.safari` + +The folder `dist/build/mv3-data` will cache data fetched from remote servers, so as to avoid fetching repeatedly from remote servers with repeated build commands. Use `make cleanassets` to remove all locally cached filter lists if you want to build with latest versions of filter lists. + +The file `dist/build/uBOLite.[platform]/log.txt` will contain information about what happened during the build process. + +The entry in the `Makefile` which implement the build process is `tools/make-mv3.sh [platform]`.[1] This Bash script copy various files from uBlock Origin branch and MV3-specific branch into a single folder which will be the final extension package. + +Notably, `tools/make-mv3.sh [platform]` calls a Nodejs script which purpose is to convert the filter lists into various rulesets to be used in a declarative way. The Nodejs version required is 17.5.0 or above. + +All the final rulesets are present in the `dist/build/uBOLite.[platform]/rulesets` in the final extension package. + +--- + +[1] https://github.com/gorhill/uBlock/blob/c4d324362fdb95ff8ef20f0b18f42f0eec955433/tools/make-mv3.sh
diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/chromium/manifest.json ublock-origin-1.67.0+dfsg/platform/mv3/chromium/manifest.json --- ublock-origin-1.46.0+dfsg/platform/mv3/chromium/manifest.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/chromium/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,92 @@ +{ + "action": { + "default_icon": { + "16": "img/icon_16.png", + "32": "img/icon_32.png", + "64": "img/icon_64.png" + }, + "default_popup": "popup.html" + }, + "author": "Raymond Hill", + "background": { + "service_worker": "/js/background.js", + "type": "module" + }, + "commands": { + "enter-zapper-mode": { + "description": "__MSG_zapperTipEnter__" + }, + "enter-picker-mode": { + "description": "__MSG_pickerTipEnter__" + } + }, + "declarative_net_request": { + "rule_resources": [ + ] + }, + "default_locale": "en", + "description": "__MSG_extShortDesc__", + "host_permissions": [ + "" + ], + "incognito": "split", + "icons": { + "16": "img/icon_16.png", + "32": "img/icon_32.png", + "64": "img/icon_64.png", + "128": "img/icon_128.png" + }, + "manifest_version": 3, + "minimum_chrome_version": "122.0", + "name": "__MSG_extName__", + "options_page": "dashboard.html", + "permissions": [ + "activeTab", + "declarativeNetRequest", + "scripting", + "storage" + ], + "short_name": "uBO Lite", + "storage": { + "managed_schema": "managed_storage.json" + }, + "version": "1.0", + "web_accessible_resources": [ + { + "resources": [ + "/strictblock.html" + ], + "matches": [ + "" + ], + "use_dynamic_url": true + }, + { + "resources": [ + "/zapper-ui.html" + ], + "matches": [ + "" + ], + "use_dynamic_url": true + }, + { + "resources": [ + "/picker-ui.html" + ], + "matches": [ + "" + ], + "use_dynamic_url": true + }, + { + "resources": [ + "/unpicker-ui.html" + ], + "matches": [ + "" + ], + "use_dynamic_url": true + } + ] +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/en.md ublock-origin-1.67.0+dfsg/platform/mv3/description/en.md --- ublock-origin-1.46.0+dfsg/platform/mv3/description/en.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/en.md 2025-10-25 19:32:51.000000000 +0000 @@ -1,42 +1,14 @@ ## Description -**uBO Lite** (uBOL), an experimental **permission-less** [MV3 API-based](https://developer.chrome.com/docs/extensions/mv3/intro/) content blocker. +**uBO Lite** (uBOL), an efficient [MV3 API-based](https://developer.chrome.com/docs/extensions/mv3/intro/) content blocker. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is [performed reliably](https://developer.chrome.com/docs/extensions/reference/scripting/#method-registerContentScripts) by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. -uBOL does not require broad "read/modify data" [permission](https://developer.chrome.com/docs/extensions/mv3/declare_permissions/) at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read/modify data" permissions at install time.
**However, [...]** - uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using declarative cosmetic and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -![uBOL's popup panel: no permission](https://user-images.githubusercontent.com/585534/195468156-d7e63ab9-abfa-443c-a8f6-e646a29b801e.png) - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request: - -![uBOL's popup panel: browser warning](https://user-images.githubusercontent.com/585534/195342593-2b82b740-70a3-4507-a0e5-d7aee803b286.png) - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site: - -![uBOL's popup panel: permissions to inject content](https://user-images.githubusercontent.com/585534/195342612-85d109d9-9006-4eb5-95a5-fec8a4f233ea.png) - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to modify and read data on all websites: - -![uBOL's options: Default filtering mode](https://user-images.githubusercontent.com/585534/195343335-a0aa103e-621e-4137-9bcf-9821dc881be1.png) - -
- The default ruleset corresponds to at least uBlock Origin's default filterset: - uBlock Origin's built-in filter lists - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.am.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.am.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.am.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.am.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. - -The default ruleset corresponds to uBlock Origin's default filterset: - -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers - -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. - -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ar.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ar.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ar.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ar.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBo لايت (uBOL) عبارة عن مانع محتوى من نوع MV3 تجريبي *أقل طلبا للتصريح*. +uBO Lite (uBOL) هو مانع محتوى يعتمد على MV3. تتوافق مجموعة القواعد الافتراضية مع مجموعة عوامل التصفية الافتراضية لـ uBlock Origin: @@ -6,26 +6,7 @@ - القائمة السهلة - الخصوصية السهلة - قائمة خادم الإعلانات والتتبع لبيتر لوي -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +يمكنك تفعيل المزيد من مجموعات القواعد من خلال زيارة صفحة الخيارات - انقر على أيقونة _الترس_ في لوحة الإشعارات. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL صريح تمامًا، مما يعني أنه لا تحتاج إلى uBOL بشكل دائم لحدوث تصفية المحتوى، يتم إجراء تصفية المحتوى من خلال إضافة CSS/JS بشكل موثوق به بواسطة المتصفح نفسه بدلًا من الإضافة. هذا يعني أن uBOL نفسه لا يستهلك موارد وحدة المعالجة المركزية/الذاكرة أثناء استمراره في حظر المحتوى. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.az.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.az.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.az.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.az.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +Defolt qaydalar dəsti uBlock Origin-in defolt filtr dəstinə uyğundur: -- uBlock Origin's built-in filter lists +- uBlock Origin-in daxili filtr siyahıları - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe-un Reklam və izləyici server siyahısı -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.be.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.be.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.be.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.be.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) гэта базаваны на MV3 блакавальнік змесціва. -The default ruleset corresponds to uBlock Origin's default filterset: +Прадвызначаны набор правіл адпавядае тыпавому набору фільтраў uBlock Origin: -- uBlock Origin's built-in filter lists +- Убудаваныя спісы фільтраў uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Спіс сервераў з рэкламай і адсочвання ад Peter Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Вы можаце ўключыць больш набораў правіл праз старонку налад -- націсніце на значок _Шасцярэнькі_ на ўсплывальнай панэлі. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL цалкам дэкларатыўны, то-бок не мае неабходнасці ў сталым uBOL працэсе дзеля фільтрацыі, а фільтрацыя змесціва на аснове інʼекцыі CSS/JS надзейна выконваецца пераважна самім браўзерам замест пашырэння. Гэта значыць, што uBOL не спажывае рэсурсаў працэсара/памяці пры блакаванні зместу -- службовы працэс uBOL патрэбны _толькі_ падчас узаемадзеяння з усплывальнай панэллю або наладамі. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bg.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bg.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bg.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bg.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) е експериментален блокер за съдържание *без разрешения*, базиран на MV3. +uBO Lite (uBOL) е блокер за съдържание, базиран на MV3. Наборът от правила по подразбиране съответства на набора от филтри по подразбиране на uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Списък със сървъри на Peter Lowe за реклами и проследяване -- Проследяване, скрито под CNAME от AdGuard -Можете да добавите още набори от правила, като посетите страницата с опции – щракнете върху иконата _зъбно колело_ в изскачащия панел. +Можете да включите още набори от правила, като посетите страницата с опции – щракнете върху иконата „зъбно колело“ в изскачащия панел. uBOL е изцяло декларативен, което означава, че няма нужда от постоянен процес на uBOL за филтриране, а филтрирането на съдържание, базирано на инжектиране на CSS/JS, се извършва надеждно от самия браузър, а не от разширението. Това означава, че самият uBOL не консумира ресурси на процесора/паметта, докато тече блокирането на съдържанието – работният процес на услугата на uBOL е необходим _само_ когато взаимодействате с изскачащия панел или страниците с опции. - -uBOL не изисква широко разрешение за "четене и промяна на данни" по време на инсталиране, поради което възможностите му са ограничени в сравнение с uBlock Origin или други блокери на съдържание, изискващи широко разрешение за "четене и промяна на данни" по време на инсталиране. - -Въпреки това uBOL ви позволява да предоставите *изрично* разширени разрешения за определени сайтове по ваш избор, за да може да филтрира по-добре тези сайтове, като използва козметично филтриране и инжектиране на скриптове. - -За да предоставите разширени разрешения за даден сайт, отворете изскачащия панел и изберете по-висок режим на филтриране, например Оптимален или Пълен. - -След това браузърът ще ви предупреди за последиците от предоставянето на допълнителните разрешения, поискани от разширението, за текущия сайт и ще трябва да кажете на браузъра дали приемате или отхвърляте искането. - -Ако приемете искането на uBOL за допълнителни разрешения за текущия сайт, той ще може да филтрира по-добре съдържанието на текущия сайт. - -Можете да зададете режима на филтриране по подразбиране от страницата с опции на uBOL. Ако изберете оптимален или пълен режим по подразбиране, ще трябва да предоставите на uBOL разрешение за четене и промяна на данни във всички уебсайтове. - -Имайте предвид, че това все още е в процес на разработка с тези крайни цели: - -- По време на инсталацията няма широки разрешения за хоста – разширените разрешения се предоставят изрично от потребителя за всеки сайт. - -- Изцяло декларативен за надеждност и ефективност на процесора/паметта. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bn.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bn.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bn.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bn.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) হলো একটি ম্যানিফেস্ট ভার্সন ৩ ভিত্তিক কনটেন্ট ব্লকার -The default ruleset corresponds to uBlock Origin's default filterset: +পূর্ব নির্ধারিত নিয়ম সেট uBlock অরিজিনের ডিফল্ট ফিল্টারসেটের সাথে মিলে যায়: -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- uBlock অরিজিনের বিল্ট ইন ফিল্টার তালিকা +- ইজিলিস্ট +- সহজ গোপনীয়তা +- পিটার লো এর বিজ্ঞাপন এবং ট্র্যাকিং সার্ভার তালিকা -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +তুমি অপশন পাতায় গিয়ে আরও নিয়ম যোগ করতে পারো -- পপআপ প্যানেলে _গিয়ার_ আইকনে ক্লিক করে। -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL সম্পূর্ণরূপে ঘোষণামূলক, অর্থাৎ ফিল্টারিং করতে একটি স্থায়ী uBOL প্রক্রিয়ার প্রয়োজন নেই, এবং CSS/JS ইনজেকশন-ভিত্তিক বিষয়বস্তু ফিল্টারিং এক্সটেনশনের পরিবর্তে ব্রাউজার নিজেই নির্ভরযোগ্যভাবে এই কাজ করে থাকে। এর মানে হল যে কন্টেন্ট ব্লকিং চলমান থাকা অবস্থায় uBOL নিজেই CPU/মেমরি রিসোর্স ব্যবহার করে না -- uBOL-এর পরিষেবার প্রক্রিয়ার প্রয়োজন শুধুমাত্র_ যখন আপনি পপআপ প্যানেল বা অপশন পেজগুলির সাথে ইন্টারঅ্যাক্ট করেন। diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.br_FR.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.br_FR.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.br_FR.txt 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.br_FR.txt 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,12 @@ +uBO Lite (uBOL) zo ur stanker noazadurioù diazezet war ar manifesto MV3. + +Ar reolennoù dre ziouer a glot gant silañ dre ziouer uBlock Origin: + +- Rolloù siloù genidik a uBlock Origin +- EasyList +- EasyPrivacy +- Roll ar servijerioù brudañ ha heuliañ eus Peter Lowe + +Tu zo deoc'h ouzhpennañ reolennoù all en arventennoù -- klikit war an ikon _kendentadur_ er banell popup. + +Disklêriañ a ra uBOL penn-da-benn, da lavaret eo n'eus ket ezhomm eus un argerzh uBOL padus evit ma c'hoarvezfe ar silañ, ha silañ endalc'hadoù diazezet war enlakaat CSS/JS a vez graet en un doare fizius gant ar merdeer e-unan kentoc'h eget gant an astenn. Kement-se a dalvez ne vez ket gounezet gant uBOL e-unan arc'hwelioù CPU/memor e-pad ma vez stanket an endalc'hadoù -- ezhomm zo eus argerzh al labourer servij uBOL _nemet_ pa vez etregweredet gant ar banell digeriñ pe ar pajennoù dibarzhioù. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bs.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bs.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.bs.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bs.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) je blokator sadržaja baziran na MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Zadani skup pravila odgovara zadanom skupu filtera uBlock Origin: -- uBlock Origin's built-in filter lists +- UBlock Origin ugrađene liste filtera - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe-ova lista servera za oglase i praćenje -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Možete omogućiti više skupova pravila posjetom stranice s opcijama -- kliknite na ikonu _Cogs_ u skočnom panelu. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL je potpuno deklarativno, što znači da nema potrebe za trajnim uBOL procesom da bi se filtriranje dogodilo, a filtriranje sadržaja zasnovano na CSS/JS injekcijama se pouzdano izvodi od strane samog pretraživača, a ne ekstenzije. To znači da sam uBOL ne troši CPU/memorijske resurse dok je blokiranje sadržaja u toku -- proces uBOL-a servisnog radnika je potreban _samo_ kada stupite u interakciju sa iskačućim panelom ili stranicama sa opcijama. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ca.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ca.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ca.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ca.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -L'uBO Lite (uBOL) és un blocador de contingut experimental *sense permís* basat en MV3. +L'uBO Lite (uBOL) és un blocador de contingut basat en MV3. El conjunt de regles per defecte correspon al conjunt de filtres per defecte d'uBlock Origin: @@ -6,28 +6,9 @@ - EasyList - EasyPrivacy - Llista de servidors de seguiment i anuncis de Peter Lowe -- Seguidors encoberts de CNAME d'AdGuard -Podeu afegir més conjunts de regles si visiteu la pàgina d'opcions: feu clic a la icona _Cogs_ al tauler emergent. +Podeu habilitar més conjunts de regles si visiteu la pàgina d'opcions: feu clic a la icona _Cogs_ al tauler emergent. L'uBOL és totalment declaratiu, és a dir, no cal un procés uBOL permanent perquè es produeixi el filtratge, i el filtratge de contingut basat en injecció CSS/JS es realitza de manera fiable pel propi navegador més que per l'extensió. Això vol dir que l'uBOL en si no consumeix recursos de CPU/memòria mentre el bloqueig de contingut està en curs; el procés de treballador de servei d'uBOL només es requereix quan interactueu amb el tauler emergent o les pàgines d'opcions. - -L'uBOL no requereix un ampli permís de "lectura i modificació de dades" en el moment de la instal·lació, per tant, les seves capacitats limitades en comparació amb l'uBlock Origin o altres blocadors de contingut que requereixen amplis permisos de "lectura i modificació de dades" en el moment de la instal·lació. - -Tanmateix, l'uBOL us permet concedir *explícitament* permisos ampliats en llocs específics que trieu perquè pugui filtrar millor en aquests llocs mitjançant filtres cosmètics i injeccions de scriptlet. - -Per concedir permisos ampliats en un lloc determinat, obriu el tauler emergent i seleccioneu un mode de filtrat superior, com ara Òptim o Complet. - -Aleshores, el navegador us avisarà sobre els efectes de la concessió dels permisos addicionals sol·licitats per l'extensió al lloc actual, i haureu d'indicar-li al navegador si accepteu o rebutgeu la sol·licitud. - -Si accepteu la sol·licitud d'uBOL de permisos addicionals al lloc actual, podrà filtrar millor el contingut del lloc actual. - -Podeu establir el mode de filtratge per defecte des de la pàgina d'opcions d'uBOL. Si trieu el mode Òptim o Complet per defecte, haureu de concedir a l'uBOL el permís per llegir i modificar dades a tots els llocs web. - -Tingueu en compte que encara és un treball en curs, amb aquests objectius finals: - -- No hi ha permisos d'amfitrió amplis en el moment de la instal·lació; els permisos ampliats els concedeix explícitament l'usuari per lloc. - -- Totalment declaratiu per a la fiabilitat i l'eficiència de la CPU/memòria. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cs.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cs.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cs.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cs.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) je experimentální blokovač obsahu vyžadující méně oprávnění, založených na MV3. +uBO Lite (uBOL) je blokovač obsahu založený na MV3. Výchozí sada pravidel koresponduje k výchozím sadám filtrů uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Můžete přidat více sad pravidel navštívením stránky nastavení -- klikněte na ikonu ozubených kol ve vyskakovácím panelu. +Další sady pravidel můžete povolit na stránce nastavení - klikněte na ikonu _Ozubeného kolečka_ ve vyskakovacím panelu. uBOL je zcela deklarativní, což znamená, že pro filtrování není potřeba permanentní proces uBOL a filtrování obsahu založené na vstřikování CSS/JS je spolehlivě prováděno samotným prohlížečem, nikoli rozšířením. To znamená, že samotný uBOL nespotřebovává zdroje CPU/paměti, zatímco probíhá blokování obsahu – proces servisního pracovníka uBOL je vyžadován _pouze_ při interakci s vyskakovacím panelem nebo stránkami nastavení. - -uBOL nevyžaduje rozsáhlá oprávnění ke "čtení a úpravě dat" v době instalace, a proto má ihned po instalaci omezené možnosti ve srovnání s uBlock Origin nebo jinými blokovači obsahu, které vyžadují rozsáhlá oprávnění ke "čtení a úpravě dat" v době instalace. - -Nicméně, uBOL vám umožňuje *explicitně* udělit rozšířená oprávnění na konkrétních webech podle vašeho výběru, aby mohl na těchto webech lépe filtrovat pomocí kosmetického filtrování a vstřikování skriptů. - -Chcete-li na daném webu udělit rozšířená oprávnění, otevřete vyskakovací panel a vyberte vyšší režim filtrování, například optimální nebo kompletní. - -Prohlížeč vás poté upozorní na důsledky udělení dalších oprávnění požadovaných rozšířením na aktuálním webu a vy budete muset prohlížeči sdělit, zda žádost přijímáte nebo odmítáte. - -Pokud přijmete žádost uBOL o další oprávnění na aktuálním webu, bude moci lépe filtrovat obsah aktuálního webu. - -Výchozí režim filtrování můžete nastavit na stránce nastavení uBOL. Pokud jako výchozí zvolíte režim optimální nebo kompletní, budete muset uBOL udělit oprávnění ke čtení a úpravě dat na všech webových stránkách. - -Mějte na paměti, že toto je stále nedokončená práce s těmito konečnými cíli: - -- Žádná rozsáhlá oprávnění hostitele v době instalace -- rozšířená oprávnění uděluje explicitně uživatel na jednotlivých stránkách. - -- Zcela deklarativní pro spolehlivost a efektivitu CPU/paměti. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cv.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cv.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cv.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cv.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cy.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cy.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.cy.txt 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cy.txt 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,12 @@ +uBO Lite (uBOL) is an MV3-based content blocker. + +Mae'r set reolau ddiofyn yn cyfateb i set hidlo diofyn uBlock Origin: + +- uBlock Origin's built-in filter lists +- EasyList +- EasyPrivacy +- Peter Lowe’s Ad and tracking server list + +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. + +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.da.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.da.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.da.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.da.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) er en eksperimentel *tilladelsesløs* MV3-baseret indholdsblocker. +uBO Lite (uBOL) er en MV3-baseret indholdsblocker. Standardregelsættet svarer til uBlock Origins standardfiltersæt: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Flere regelsæt kan tilføjes ved at gå til indstillingssiden -- klik på ikonet _Cogs_ i pop op-panelet. +Flere regelsæt kan aktiveres ved at gå til indstillingssiden -- klik på ikonet _Tandhjul_ i pop op-panelet. uBOL er fuldstændig deklarativ, hvilket betyder, at ingen permanent uBOL-proces behøves for at filtreringen kan finde sted, og CSS/JS-injektionsbaseret indholdsfiltrering udføres pålideligt af browseren selv i stedet for af udvidelsen. Dette betyder, at uBOL ikke selv forbruger CPU-/hukommelsesressourcer under indholdsblokeringen -- uBOLs tjenestearbejdsproces er _kun_ nødvendig under interaktion med pop op-panelet eller indstillingssiderne. - -uBOL kræver ikke en omfattende "læse og ændre data" tilladelse under installationen, derfor dens begrænsede egenskaber fra start af sammenlignet med uBlock Origin eller andre indholdsblockere, som kræver omfattende "læse/ændre data" tilladelser under installationen. - -uBOL giver dog mulighed for *eksplicit* at tildele udvidede tilladelser på bestemte websteder efter eget valg, så den bedre kan filtrere på disse websteder vha. kosmetisk filtrering og scriptlet-injektioner. - -For at tildele udvidede tilladelser på et givent websted, åbn pop op-panelet og vælg en højere filtreringstilstand, såsom Optimal eller Komplet. - -Browseren advarer derefter om virkningerne af de ekstra tildelte tilladelser, som udvidelsen anmoder om på det aktuelle websted, og man vil skulle fortælle browseren, hvorvidt anmodningen accepteres eller afslås. - -Accepteres uBOLs anmodning om ekstra tilladelser på det aktuelle websted, vil den bedre kunne filtrere indhold på webstedet. - -Standardfiltreringstilstanden kan angives via uBOLs indstillingsside. Hvis tilstanden Optimal eller Komplet vælges som standardtilstand, skal uBOL tildeles tilladelse til at læse og ændre data på alle websteder. - -Husk dog, at dette stadig er et igangværende arbejde med disse slutmål: - -- Ingen omfattende værtstilladelser under installationen -- udvidede tilladelser tildeles eksplicit af brugeren på webstedsbasis. - -- Fuldstændig deklarativ for pålidelighed og CPU-/hukommelseseffektivitet. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.de.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.de.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.de.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.de.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) ist ein experimenteller Inhaltsblocker, der *ohne Berechtigungen* auskommt und auf MV3 basiert. +uBO Lite (uBOL) ist ein MV3-basierter Inhaltsblocker. Die Standardregeln entsprechen den Standardfiltern von uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Sie können weitere Regeln hinzufügen, indem Sie die Optionen aufrufen — klicken Sie dazu im Pop-up-Fenster auf das Symbol mit den _Zahnrädern_. +Sie können weitere Regeln aktivieren, indem Sie die Einstellungen aufrufen — klicken Sie dazu im Pop-up-Fenster auf das Symbol mit den _Zahnrädern_. -uBOL ist vollständig deklarativ, d. h. es ist kein permanenter uBOL-Prozess für die Filterung erforderlich, und die auf CSS/JS-Injektion basierende Inhaltsfilterung wird zuverlässig vom Browser selbst und nicht von der Erweiterung durchgeführt. Das bedeutet, dass uBOL selbst keine CPU-/Speicherressourcen verbraucht, während der Inhalt blockiert wird — der uBOL-Service-Worker-Prozess wird _nur_ benötigt, wenn Sie mit dem Pop-up-Fenster oder den Optionen interagieren. - -uBOL erfordert bei der Installation keine weitreichende Berechtigung zum Lesen und Ändern von Daten, daher sind die Möglichkeiten im Vergleich zu uBlock Origin oder anderen Inhaltsblockern, die bei der Installation weitreichende Berechtigungen zum Lesen und Ändern von Daten erfordern, von vornherein begrenzt. - -Allerdings können Sie mit uBOL *explizit* erweiterte Berechtigungen für bestimmte Websites Ihrer Wahl erteilen, sodass diese Websites mithilfe kosmetischer Filterung und Scriptlet-Injektionen besser gefiltert werden können. - -Um erweiterte Berechtigungen für eine bestimmte Website zu erteilen, öffnen Sie das Pop-up-Fenster und wählen Sie einen stärkeren Filtermodus wie „Optimal” oder „Vollständig”. - -Der Browser warnt Sie anschließend über die Auswirkungen der zusätzlichen Berechtigungen, die von der Erweiterung für die aktuelle Website angefordert werden, und Sie können entscheiden, ob Sie zustimmen oder ablehnen. - -Wenn Sie die Anfrage von uBOL nach zusätzlichen Berechtigungen für die aktuelle Website zustimmen, kann uBOL die Inhalte für die aktuelle Website besser filtern. - -Sie können den Standardfiltermodus in den Optionen von uBOL festlegen. Wenn Sie den Modus „Optimal” oder „Vollständig” als Standardmodus wählen, müssen Sie uBOL die Berechtigung erteilen, Daten auf allen Websites lesen und ändern zu dürfen. - -Denken Sie daran, dass sich dieses Projekt noch in Entwicklung befindet und folgende Ziele verfolgt: - -- Keine weitreichenden Host-Berechtigungen bei der Installation — erweiterte Berechtigungen werden explizit von Ihnen für jede einzelne Website erteilt. - -- Vollständig deklarativ für Zuverlässigkeit und CPU-/Speichereffizienz. +uBOL ist vollständig deklarativ, d. h. es ist kein dauerhafter uBOL-Prozess für das Filtern erforderlich, und die auf CSS/JS-Injektion basierende Inhaltsfilterung wird zuverlässig vom Browser selbst und nicht von der Erweiterung durchgeführt. Das bedeutet, dass uBOL selbst keine CPU-/Speicherressourcen verbraucht, während der Inhalt blockiert wird — der uBOL-Service-Worker-Prozess wird _nur_ benötigt, wenn Sie mit dem Pop-up-Fenster oder den Optionen interagieren. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.el.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.el.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.el.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.el.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -Το uBO Lite (uBOL) είναι ένας πειραματικός αποκλεισμός περιεχομένου *χωρίς άδεια* που βασίζεται σε MV3. +Το uBO Lite (uBOL) είναι εργαλείο φραγής περιεχομένου, που βασίζεται στο MV3. Το προεπιλεγμένο σύνολο κανόνων αντιστοιχεί στο προεπιλεγμένο σύνολο φίλτρων του uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Μπορείτε να προσθέσετε περισσότερα σύνολα κανόνων μεταβαίνοντας στη σελίδα επιλογών -- κάντε κλικ στο εικονίδιο _Cogs_ στον αναδυόμενο πίνακα. +Μπορείτε να προσθέσετε περισσότερα σύνολα κανόνων από τη σελίδα επιλογών -- κάντε κλικ στο εικονίδιο _γρανάζι_ στον αναδυόμενο πίνακα. Το uBOL είναι εξ'ολοκλήρου δηλωτικό, πράγμα που σημαίνει ότι δεν υπάρχει ανάγκη για μόνιμη διαδικασία uBOL για να πραγματοποιηθεί το φιλτράρισμα, και το φιλτράρισμα περιεχομένου που βασίζεται σε έγχυση CSS/JS εκτελείται αξιόπιστα από το ίδιο το πρόγραμμα περιήγησης και όχι από την επέκταση. Αυτό σημαίνει ότι το ίδιο το uBOL δεν καταναλώνει πόρους CPU/μνήμης ενώ ο αποκλεισμός περιεχομένου είναι σε εξέλιξη -- η διαδικασία του service worker του uBOL απαιτείται _μόνο_ όταν αλληλεπιδράτε με τον αναδυόμενο πίνακα ή τις σελίδες επιλογών. - -Το uBOL δεν απαιτεί ευρεία άδεια "ανάγνωσης και τροποποίησης δεδομένων" κατά τον χρόνο εγκατάστασης, επομένως έχει εξαρχής περιορισμένες δυνατότητές σε σύγκριση με το uBlock Origin ή άλλα προγράμματα αποκλεισμού περιεχομένου που απαιτούν ευρείες άδειες "ανάγνωσης/τροποποίησης δεδομένων" κατά την εγκατάσταση. - -Ωστόσο, το uBOL σάς επιτρέπει *ρητά* να εκχωρείτε εκτεταμένες άδειες σε συγκεκριμένους ιστότοπους της επιλογής σας, ώστε να μπορεί να φιλτράρει καλύτερα σε αυτούς τους ιστότοπους χρησιμοποιώντας κοσμητικό φιλτράρισμα και έγχυση scriptlet. - -Για να εκχωρήσετε εκτεταμένα δικαιώματα σε έναν δεδομένο ιστότοπο, ανοίξτε το αναδυόμενο πλαίσιο και επιλέξτε μια υψηλότερη λειτουργία φιλτραρίσματος, όπως Βέλτιστη ή Ολοκληρωμένη. - -Στη συνέχεια, το πρόγραμμα περιήγησης θα σας προειδοποιήσει για τα αποτελέσματα της χορήγησης των πρόσθετων δικαιωμάτων που ζητούνται από την επέκταση στον τρέχοντα ιστότοπο και θα πρέπει να ενημερώσετε το πρόγραμμα περιήγησης εάν αποδέχεστε ή απορρίπτετε το αίτημα. - -Εάν αποδεχτείτε το αίτημα του uBOL για πρόσθετα δικαιώματα στον τρέχοντα ιστότοπο, θα μπορεί να φιλτράρει καλύτερα το περιεχόμενο για τον τρέχοντα ιστότοπο. - -Μπορείτε να ορίσετε την προεπιλεγμένη λειτουργία φιλτραρίσματος από τη σελίδα επιλογών του uBOL. Εάν επιλέξετε τη λειτουργία Βέλτιστη ή Ολοκληρωμένη ως προεπιλεγμένη, θα πρέπει να εκχωρήσετε στην uBOL την άδεια ανάγνωσης και τροποποίησης δεδομένων σε όλους τους ιστότοπους. - -Λάβετε υπόψη ότι αυτό είναι ακόμη ένα έργο σε εξέλιξη, με αυτούς τους τελικούς στόχους: - -- Να μην υπάρχουν ευρείες άδειες hosts κατά την εγκατάσταση -- οι εκτεταμένες άδειες παραχωρούνται ρητά από τον χρήστη σε βάση ανά τοποθεσία. - -- Εντελώς δηλωτικό για αξιοπιστία και απόδοση CPU/μνήμης. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.en_GB.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.en_GB.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.en_GB.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.en_GB.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.eo.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eo.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.eo.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eo.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.es.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.es.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.es.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.es.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) es un bloqueador de contenido experimental con *menos permisos* basado en MV3. +uBO Lite (uBOL) es un bloqueador de contenido basado en MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Por defecto ya trae configuradas las siguientes listas de filtros: -- uBlock Origin's built-in filter lists +- Listas de filtros de uBlock Origin - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Puedes habilitar más conjuntos de reglas visitando la página de opciones, haz clic en el icono de _engranaje_ del panel emergente. -uBOL es completamente declarativo, lo que significa que no hay necesidad de un proceso uBOL permanente para que se produzca el filtrado, y el filtrado de contenido basado en la inyección de CSS/JS es realizado de forma confiable por el propio navegador y no por la extensión. Esto significa que uBOL en sí mismo no consume recursos de CPU/memoria mientras el bloqueo de contenido está en curso, el proceso service worker de uBOL se requiere _solo_ cuando se interactúa con el panel emergente o las páginas de opciones. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Completamente declarativo para confiabilidad y eficiencia de la CPU/memoria. +uBOL es completamente declarativo, lo que significa que no hay necesidad de un proceso uBOL permanente para que se produzca el filtrado, y el filtrado de contenido basado en la inyección de CSS/JS se realiza de forma confiable por el propio navegador en lugar de la extensión. Esto significa que uBOL en sí mismo no consume recursos de CPU/memoria mientras el bloqueo de contenido está en curso, el proceso service worker de uBOL se requiere _solo_ cuando se interactúa con el panel emergente o las páginas de opciones. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.et.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.et.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.et.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.et.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) on MV3-l põhinev katsetusjärgus *lubadeta* sisutõkestaja. +uBO Lite (uBOL) on MV3-l põhinev sisutõkestaja. Tavaline reeglitekogum vastab uBlock Origini tavalisele filtritekogumile: -- uBlock Origini sisseehitatud filtriteloendid +- uBlock Origini sisseehitatud filtriloendid - EasyList - EasyPrivacy -Peter Lowe'i reklaamides ja jälitamisserverite loend -- AdGuardi CNAME-varjatud jälgijad +Peter Lowe'i reklaamide ja jälitusserverite loend -Reeglitekogumeid saate lisada valikute lehelt ehk avanenud paneelis klõpsake _Cogs_ ikooni. +Rohkem reegleid valikutest ehk toksake _Cogs_ ikooni hüpikpaneelis. uBOL on läbinisti deklaratiivne ehk filtreerimiseks pole vaja kogu aeg töötavat uBOLi protsessi ja CSS/JS süstipõhist sisu filtreerib tegelikult brauser, mitte laiendus. Teisisõnu, uBOL ei kasuta sisu tõkestamisel protsessori/mälu ressursse. uBOLi teenuse toimimise protsessi on vaja _vaid_ juhul, kui kasutate hüpikpaneeli või valikute lehekülgi. - -uBOL ei nõua paigaldamise ajal teadatuntud andmete lugemise ja muutmise luba, seega võrreldes seda nõudva äpiga uBlock Origin või muu sisutõkestiga on uBOL-i piiratus üks selle funktsioonidest. - -Kuid uBOL võimaldab *selgesõnaliselt* anda täpsemaid lubasid teie valitud veebilehtedele, et neid saaks paremini filtreerida ilufiltrite ja skriptisüstidega. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. Kui määrate optimaalse või põhjaliku režiimi tavaliseks, peate andma uBOLile loa kõikide veebilehtede andmete lugemiseks ja muutmiseks. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.eu.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eu.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.eu.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eu.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +Lehenespenez, iragazki-zerrenda hauek ditu konfiguratuta: -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +UblockOrigin-eko filtro lista +ZerrendaErraza +PribazitateaErraza +Peter Lowe-ren Ad and tracker zerrenda -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Ruleta gehiago aktibatu ahal duzu aukerak orria --klikatu _Cogs_ ikonoa panelearen lehioan -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL guztiz deklaratiboa da, hau da, ez dago uBOL prozesu iraunkor baten beharrik iragazketa gertatzeko, eta CSS/JS injekzioan oinarritutako edukien iragazketa nabigatzaileak berak egiten du fidagarritasunez, luzapenaren arabera beharrean. Horrek esan nahi du uBOLek berak ez duela CPU/memoria baliabiderik kontsumitzen edukien blokeoa martxan dagoen bitartean... uBOLren zerbitzuko langileen prozesua _only_ behar da popup panelarekin edo aukera orriekin elkarreragiten denean. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fa.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fa.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fa.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fa.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +مجموعه قوانین پیش فرض آن مطابق با مجموعه قوانین پیش فرض uBlock Origin است: - uBlock Origin's built-in filter lists - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fi.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fi.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fi.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fi.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) on kokeellinen *käyttöoikeudeton* MV3-pohjainen sisällönestotyökalu. +uBO Lite (uBOL) on MV3-pohjainen sisällönestotyökalu. Oletusarvoiset sääntömääritykset vastaavat uBlock Origin -laajennuksen oletuksia: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Voit lisätä sääntömäärityksiä asetussivulta -- paina ponnahduspaneelin _Rataskuvaketta_. +Voit aktivoida lisää sääntömäärityksiä laajennuksen asetuksista – paina ponnahduspaneelin _Ratas_-kuvaketta. -uBOL on täysin deklaratiivinen, eli suodatus ei edellytä pysyvää uBOL-prosessia ja CSS-/JS-koodin manipulointiin perustuva sisällöneston suorittaa laajennuksen sijaan luotettavasti selainsovellus. Tämän ansiosta itse uBOL-laajennus ei kuormita prosessoria tai keskusmuistia suodatuksen tapahtuessa -- uBOL:n työprosessia tarvitaan _ainoastaan_ ponnahduspaneelin ja asetussivun käytön yhteydessä. - -uBO lite ei asennuksen jälkeen vaadi erityistä "oikeutta kaikkien tietojesi lukuun ja muokkaukseen" ja sen vuoksi sen toiminta on muita tätä käyttöoikeutta heti edellyttäviä estotyökaluja, kuten uBlock Orginia, rajoittuneempaa. - -On kuitenkin mahdollista myöntää *yksinomaisesti* uBOL:lle laajennetut käyttöoikeudet valikoiduille sivustoille niiden suodatuksen tehostamiseksi deklaratiivisella kosmeettisella suodatuksella ja scriplet-injektoinnilla. - -Laajemmat oikeudet myönnetään avoimelle sivustolle avaamalla ponnahduspaneeli ja valitsemalla korkeampi suodatustasi, kuten Optimaalinen tai Täysi. - -Tällöin selain varoittaa laajennuksen avoimelle sivustolle pyytämien käyttöoikeuksien seurauksista ja pyytää käyttäjää hyväksymään tai hyläämään pyynnön. - -Jos uBOL:n käyttöoikeuspyyntö avoimelle sivustolle hyväksytään, se pystyy suodattamaan sivuston sisältöä tehokkaammin. - -Voit määrittää oletusarvoisen suodatustilan uBOL:n asetussivulta. Jos oletustilaksi valitaan Optimaalinen tai Täysi, on uBOL:lle myönnettävä "oikeus lukea ja muokata tietojasi kaikilla sivustoilla". - -Huomioithan, että laajennusta kehitetään edelleen seuraavien tavoitteiden saavuttamiseksi: - -- Laajoja käyttöoikeuksia ei tarvita asennusvaiheesssa, vaan laajennetut oikeudet myönnetään aina sivustokohtaisesti käyttäjän toimesta. - -- Täysin deklaratiivinen luotettavuutta ja alhaista prosessorin/muistin kuormitusta varten. +uBOL on täysin deklaratiivinen, eli suodatus ei edellytä pysyvää uBOL-prosessia ja CSS-/JS-koodin manipulointiin perustuva sisällönsuodatuksen suorittaa laajennusprosessin sijaan luotettavasti selainsovellus. Tämän ansiosta itse uBOL ei kuormita prosessoria tai keskusmuistia sisällöneston tapahtuessa -- uBOL:n työprosessia tarvitaan _ainoastaan_ ponnahduspaneelia ja asetussivuja käytettäessä. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fil.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fil.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fil.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fil.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -Ang uBO Lite (uBOL) ay isang eksperimental at *permission-less* na pangharang ng content na nakabase sa MV3. +Isang content blocker na nakabase sa MV3 ang uBO Lite (uBOL). Tulad ng uBlock Origin, ito rin ang mga default na listahan ng mga filter: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Listahan ni Peter Lowe sa mga ad at tracking server (Peter Lowe’s Ad and tracking server list) -- Listahan ng AdGuard sa mga Tracker na Nagkukunwari gamit ang CNAME (AdGuard CNAME-Cloaked Trackers) -Makakapagdagdag ka ng higit pang mga patakaran sa pahina ng mga opsyon -- pindutin ang icon ng _gulong_ sa popup panel. +Maaring magpagana ng mas maraming ruleset sa page ng options -- pindutin ang _Cogs_ sa popup na panel. Deklaratibo lamang ang uBOL, kaya hindi nito kailangan ng permanenteng proseso upang mag-filter, at mainam na ginagawa ng browser mismo imbes na ekstensyon ang pagfi-filter sa content na nakabase sa CSS o JS. Ibig-sabihin, hindi kumokonsyumo ng CPU o memorya ang uBOL habang nanghaharang -- ang proseso ng trabahante ng serbisyo ay kailangan _lang_ kung nasa popup panel o pahina ng opsyon ka. - -Hindi kailangan ng uBOL ang malawakang pahintulot para "basahin at baguhin ang data" pagka-install, kaya kung bago pa lang itong install ay limitado ang kakayahan nito kumpara sa uBlock Origin o iba pang mga pangharang ng content na nangangailangan ng malawakang pahintulot para "basahin at baguhin ang data" pagka-install. - -Ngunit, pwede mong *pasadyang* pahintulutan ang uBOL na magkaroon ng pinalawak na pahintulot sa mga website na pipiliin mo para mas mapabuti ang pagfi-filter sa mga site na iyon gamit ang kosmetikong pagfi-filter at injeksyon ng scriptlet. - -Upang bigyan ito ng pinalawak na pahintulot sa isang site, buksan ang popup panel at pumili ng isang mode sa pagfi-filter tulad ng Pinainam o Kumpleto. - -Babalaan ka ng browser tungkol sa mga epekto ng pagbibigay ng karagdagang pahintulot na hinihiling ng ekstensyon sa kasalukuyang site, at kailangan mong tumugon kung pinapahintulutan mo ba ito o hindi. - -Kung tatanggapin mo ang hiling ng uBOL para sa karagdagang mga pahintulot sa kasalukuyang site, mas magiging mainam ang pagfi-filter nito sa content para sa kasalukuyang site. - -Maitatakda mo ang default na mode sa pagfi-filter sa pahina ng mga opsyon ng uBOL. Kailangan mong pahintulutan ang uBOL na basahin o baguhin ang datos sa lahat ng mga website kung pipiliin mo ang Pinainam o Kumpleto bilang default na mode sa pagfi-filter. - -Tandaang kasalukuyan pang binubuo ang ekstensyong ito, at nilalayon nitong: - -- Walang kakailanganing malawakang pahintulot pagka-install -- ibibigay lang ng user ang karagdagang pahintulot sa mga piling site. - -- Deklaratibo lamang upang maging mapagkakatiwalaan at matipid sa CPU at memorya. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fr.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fr.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fr.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fr.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) est un bloqueur expérimental *à permissions réduites* basé sur le manifeste MV3. +uBO Lite (uBOL) est un bloqueur de contenu basé sur le manifeste MV3. Les règles par défaut correspondent au filtrage par défaut d'uBlock Origin : @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - La liste anti-serveurs pub et pistage de Peter Lowe -- La liste AdGuard anti-pisteurs à camouflage CNAME -Vous pouvez ajouter plus de règles en consultant la page des paramètres -- Cliquez sur l'_Engrenage_ dans le panneau pop-up. +Vous pouvez ajouter plus de règles en consultant la page des paramètres -- Cliquez sur l'icône de l'_Engrenage_ dans le panneau pop-up. uBOL est entièrement déclarative, c'est-à-dire qu'il n'y a pas besoin d'un processus uBOL permanent pour filtrer, et le filtrage basé sur l'injection CSS/JavaScript se fait en toute fiabilité par le navigateur lui-même. Cela veut dire qu'en soi, uBOL ne consomme pas de ressources processeur/mémoire pendant le blocage de contenu -- l'agent de service d'uBOL n'est sollicité _que_ quand vous interagissez avec le panneau pop-up ou la page des paramètres. - -Contrairement à uBlock Origin ou d'autres extensions de blocage, uBOL ne nécessite pas de larges permissions de "lecture/modification des données" au moment de l'installation, ce qui explique ses capacités au départ limitées. - -Cependant, uBOL vous permet *explicitement* d'accorder des permissions étendues sur les sites Web de votre choix, pour qu'elle puisse mieux les filtrer en utilisant le filtrage esthétique et des injections de scriptlet. - -Pour accorder des permissions étendues sur un site Web donné, ouvrez le panneau pop-up et choisissez un mode de filtrage plus élevé comme le mode Optimal ou le mode Complet. - -Le navigateur vous préviendra alors des effets de l'accord de permissions additionnelles requises par l'extension sur le site Web en cours de consultation et vous devrez indiquer votre choix au navigateur (Accepter/Refuser). - -Si vous acceptez la requête d'uBOL pour des permissions additionnelles sur le site Web en cours de consultation, le filtrage de son contenu sera renforcé. - -Vous pouvez définir le mode de filtrage par défaut depuis la page des paramètres d'uBOL. Si vous choisissez le mode Optimal ou Complet en tant que mode par défaut, vous devrez accorder à uBOL l'autorisation de lire et de modifier des données sur tous les sites Web. - -Gardez à l'esprit que c'est en cours de développement, avec comme objectifs : - -- De ne pas accorder de permissions globales au moment de l'installation -- les permissions étendues s'accordent explicitement par l'utilisateur site par site. - -- De travailler de manière entièrement déclarative pour la fiabilité et l'efficacité processeur/mémoire. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fy.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fy.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.fy.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fy.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is in eksperimintele, *tastimmingsleaze* MV3-basearre ynhâldsblokkearder. +uBO Lite (uBOL) is in MV3-basearre ynhâldsblokkearder. De standert regelset komt oerien mei de standert filterset fan uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking-serverlist -- AdGuard CNAME-Cloaked Trackers -Jo kinne mear regelsets tafoegje troch de opsjesside te besykjen – klik op it _tântsjilpiktogram_ yn it pop-uppaniel. +Jo kinne mear regelsets ynskeakelje troch de opsjesside te besykjen – klik op it _tântsjilpiktogram_ yn it pop-uppaniel. uBOL is folslein deklaratyf, wat betsjut dat in permanint uBOL-proses foar de filtering net nedich is, en ynhâldsfiltering op basis fan CSS/JS-ynjeksje op in betroubere manier troch de browser sels útfierd wurdt yn stee fan de útwreiding. Dit betsjut dat uBOL sels gjin CPU-/ûnthâldboarnen brûkt wylst ynhâldsblokkearring aktyf is – it serviceworker-proses fan uBOL is _allinnich_ fereaske as jo mei it pop-uppaniel of de opsjessiden wurkje. - -uBOL fereasket gjin brede tastimming foar it ‘lêzen en oanpassen fan gegevens’ wylst ynstallaasje, fan dêr de beheinde ynboude mooglikheden dêrfan yn fergeliking mei uBlock Origin of oare ynhâldsblokkearders dy’t brede tastimmingen foar it ‘lêzen en oanpassen fan gegevens’ fereaskje wylst de ynstallaasje. - -Jo kinne yn uBOL echter *eksplisyt* wiidweidige tastimmingen ferliene op bepaalde websites fan jo kar, sadat it op dy websites better filterje kin fia kosmetyske filtering en scriptlet-ynjeksjes. - -Om wiidweidige tastimmingen op in bepaalde website te ferlienen, iepenje jo it pop-uppaniel en kieze jo in hegere filtermodus, lykas Optimaal of Folslein. - -De browser warskôget jo dan oer de gefolgen fan it ferlienen fan de troch de útwreiding oanfrege oanfoljende tastimmingen op de aktuele website, en jo moatte de browser witte litte oft jo de oanfraach akseptearje of wegerje. - -As jo de oanfraach fan uBOL foar oanfoljende tastimmingen op de aktuele website akseptearje, sil it ynhâld foar de aktuele website better filterje kinne. - -Jo kinne de standert filtermodus ynstelle fan de opsjesside fan uBOL ôf. As jo de modus Optimaal of Folslein as de standertmodus kieze, moatte jo uBOL de tastimming foar it lêzen en oanpassen fan gegevens op alle websites te ferlienen. - -Unthâld dat dit noch wurk yn útfiering is, mei dizze eindoelen: - -- Gjin brede host-tastimmingen wylst ynstallaasje – wiidweidige tastimmingen wurde eksplisyt en per website ferliend troch de brûker. - -- Folslein deklaratyf omwille fan betrouberheid en CPU-/ûnthâldeffisjinsje. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ga.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ga.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ga.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ga.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. - -The default ruleset corresponds to uBlock Origin's default filterset: - -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers - -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. - -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.gl.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gl.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.gl.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gl.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) é un bloqueador de contido baseado en MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +O conxunto de regras predeterminado corresponde ao conxunto de filtros predeterminado de uBlock Origin: -- uBlock Origin's built-in filter lists +- Listas de filtros integradas de uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +Lista de servidores de seguimento e anuncios de Peter Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Podes activar máis grupos de regras indo á páxina de opcións -- preme na roda dentada no panel emerxente. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL é totalmente declarativo, o que significa que non é necesario un proceso permanente de uBOL para que se produza o filtrado e o filtrado de contido baseado en inxección de CSS/JS realízao de forma fiable o propio navegador en lugar da extensión. Isto significa que o propio uBOL non consume recursos de CPU/memoria mentres o bloqueo de contido está en curso -- o proceso do traballador do servizo de uBOL é necesario _só_ cando interactúas co panel emerxente ou coas páxinas de opcións. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.gu.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gu.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.gu.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gu.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.he.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.he.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.he.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.he.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) הוא חוסם תוכן מבוסס MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +ערכת הכללים ברירת מחדל שמתכתבת עם ערכת המסננים של uBlock Origin: -- uBlock Origin's built-in filter lists +- רשימת מסננים מובנים של uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- רשימת שרתי מודעות ומעקב של פיטר לואו -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +ניתן לאפשר קבוצות חוקים נוספות בדף האפשרויות - עם לחיצה על סמליל _גלגלי השיניים_ בחלונית הקופצת. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL הוא הכרזתי לחלוטין, כלומר אין צורך בתהליך uBOL קבוע כדי שהסינון יתרחש, וסינון תוכן מבוסס הזרקת CSS/JS מבוצע באופן אמין על ידי הדפדפן עצמו ולא על ידי ההרחבה. המשמעות היא ש־uBOL עצמו לא צורכך משאבי מעבד/זיכרון בזמן שחסימת התוכן מתרחשת – תהליך ה־service worker של uBOL נדרש _אך ורק_ בזמן הידוד עם החלון הקופץ או עם עמוד האפשרויות. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hi.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hi.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hi.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hi.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +डिफ़ॉल्ट रूलसेट uBlock Origin के डिफ़ॉल्ट फ़िल्टर सेट के अनुरूप होता है: -- uBlock Origin's built-in filter lists +- uBlock Origin की बिल्ट-इन फ़िल्टर सूचियां - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe की विज्ञापन एवं ट्रैकिंग सर्वर सू‍ची -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +आप विकल्प पृष्ठ पर जाकर और अधिक नियम-सेट सक्षम कर सकते हैं -- पॉपअप पैनल में _Cogs_ आइकन पर क्लिक करें। -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL पूरी तरह से वर्णनात्मक है, जिसका यह अर्थ है कि फ़िल्टरिंग के लिए एक स्थायी uBOL प्रक्रिया की कोई आवश्यकता नहीं है, और CSS/JS इंजेक्शन-आधारित कन्टेन्ट फ़िल्टरिंग एक्सटेंशन के बजाय ब्राउज़र द्वारा विश्वसनीय रूप से की जाती है। इसका यह अर्थ है कि कन्टेन्ट ब्लॉक करते समय uBOL द्वारा सीपीयू/मेमोरी संसाधनों का उपभोग स्वयं नहीं किया जाता है -- uBOL की सर्विस प्रोसेस की आवश्यकता _केवल_ तब होती है जब आप पॉपअप पैनल या विकल्प पृष्ठों पर कोई अंत:क्रिया करते हैं। diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hr.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hr.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hr.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hr.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) je eksperimantani bloker sadržaja *bez dopuštenja* baziran na MV3. +uBO Lite (uBOL) je bloker sadržaja baziran na MV3. Zadana lista pravila odgovara uBlock Origin-ovoj zadanoj listi filtera: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe-ova lista oglasa i pratećih servera -- AdGuard CNAME-prikriveni pratići serveri -Možete dodati više skupova pravila tako što ćete posjetiti stranicu s opcijama -- kliknite ikonu _zupčanika_ na skočnoj ploči. +Možete omogućiti više skupova pravila tako što ćete posjetiti stranicu s opcijama -- kliknite ikonu _Cogs_ na skočnoj ploči. uBOL je u potpunosti deklarativan, što znači da nema potrebe za trajnim uBOL procesom za filtriranje, a filtriranje sadržaja temeljeno na ubacivanju CSS/JS pouzdano izvodi sam preglednik, a ne ekstenzija. To znači da sam uBOL ne troši CPU/memorijske resurse dok je blokiranje sadržaja u tijeku -- uBOL-ov servisni radni proces potreban je _samo_ kada komunicirate s skočnom pločom ili stranicama s opcijama. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -Međutim, uBOL vam omogućuje da *eksplicitno* dodijelite proširena dopuštenja na određenim web-stranicama po vašem izboru tako da može bolje filtrirati te web-stranice koristeći kozmetičko filtriranje i injekcijske skripte. - -Da biste dodijelili proširena dopuštenja na određenoj web stranici, otvorite skočnu ploču i odaberite viši način filtriranja kao što je Optimalno ili Potpuno. - -Preglednik će vas tada upozoriti o učincima dodjele dodatnih dopuštenja koje traži ekstenzija na trenutnom mjestu, a vi ćete morati reći pregledniku prihvaćate li ili odbijate zahtjev. - -Ako prihvatite uBOL-ov zahtjev za dodatnim dozvolama na trenutnoj stranici, moći će bolje filtrirati sadržaj na njoj. - -Zadani način filtriranja možete postaviti na stranici s opcijama uBOL-a. Ako kao zadano odaberete Optimalni ili Potpuni način rada, morati ćete dati uBOL-u dopuštenje za čitanje i izmjenu podataka na svim web stranicama. - -Imajte na umu da je ovo još u tijeku, sa sljedećim krajnjim ciljevima: - -- Nema širokih dopuštenja hosta u vrijeme instalacije -- proširena dopuštenja izričito dodjeljuje korisnik za svaku pojedinačnu stranicu. - -- Potpuno deklarativno za pouzdanost i učinkovitost CPU/memorije. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hu.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hu.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hu.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hu.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +A uBO Lite (uBOL) egy MV3-alapú tartalomblokkoló. Az alapértelmezett szabálykészlet megfelel a uBlock Origin alapértelmezett szűrőkészletének: -- uBlock Origin beépített filter listái +- uBlock Origin beépített szűrőlistái - EasyList - EasyPrivacy -- Peter Lowe hirdetés és nyomkövető szerver listája -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe hirdetési és nyomkövető-kiszolgálókat tartalmazó listája -További szabályokat adhat hozzá a beállítások oldalon - kattintson a _Cogs_ ikonra a felugró panelen. +További szabályokat engedélyezhet a beállítások oldalon – kattintson a _Fogaskerekek_ ikonra a felugró panelen. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +A uBOL teljes mértékben deklaratív, vagyis nincs szükség állandó uBOL folyamatra a szűréshez, és a CSS/JS injektálás-alapú tartalomszűrést maga a böngésző végzi megbízhatóan, nem pedig a kiegészítő. Ez azt jelenti, hogy az uBOL maga nem fogyaszt CPU/memória erőforrásokat, amíg a tartalom blokkolása folyamatban van – az uBOL service worker folyamatára _csak_ akkor van szükség, amikor az felugró panellel vagy a beállítási oldalakkal érintkezik. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hy.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hy.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.hy.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hy.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +Կանոնների լռելյայն փաթեթը համապատասխանում է uBlock Origin-ի լռելյայն զտիչների փաթեթին։ -- uBlock Origin's built-in filter lists +- uBlock Origin-ի ներկառուցված զտիչների ցանկ - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe-ի գովազդային և հետագծող սպասարկիչների ցուցակ -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL-ն ամբողջությամբ դեկլարատիվ է, այսինքն՝ զտման համար անընդհատ կատարվող uBOL գործընթացի կարիք չկա, իսկ CSS/JS արմատավորման վրա հիմնված բովանդակության զտումը հուսալիորեն իրականացվում է զննիչի կողմից, այլ ոչ թե ընդլայնման միջոցով։ Սա նշանակում է, որ uBOL հավելումը չի սպառում մշակիչի/հիշողության որևէ ռեսուրս, երբ տեղի է ունենում գովազդի արգելափակումը. uBOL աշխատանքային գործընթացն աշխատում է _միայն_ երբ Դուք փոփոխություններ եք կատարում դուրս լողացող վահանակում կամ ընտրանքների էջում։ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.id.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.id.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.id.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.id.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) adalah pemblokir konten berbasis MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Kumpulan aturan bawaan sesuai dengan kumpulan penyaringan bawaan uBlock Origin: -- Daftar filter asli uBlock Origin +- Daftar filter bawaan uBlock Origin - EasyList - EasyPrivacy - Daftar server iklan dan pelacak Peter Lowe -- AdGuard CNAME-Cloaked Trackers -kamu dapat menambahkan rulesets di halaman opsi -- klik ikon _Cogs_ di panel popup. +Anda dapat mengaktifkan lebih banyak rangkaian aturan dengan mengunjungi halaman opsi -- klik ikon _Cogs_ di panel popup. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL sepenuhnya bersifat deklaratif, artinya tidak diperlukan proses uBOL permanen agar penyaringan dapat terjadi, dan penyaringan konten berbasis injeksi CSS/JS dilakukan secara andal oleh browser itu sendiri dan bukan oleh ekstensi. Artinya uBOL sendiri tidak mengonsumsi sumber daya CPU/memori saat pemblokiran konten sedang berlangsung -- proses pekerja layanan uBOL diperlukan _hanya_ saat Anda berinteraksi dengan panel popup atau halaman opsi. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.it.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.it.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.it.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.it.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) è un blocco dei contenuti sperimentale basato su MV3 *senza autorizzazione*. +uBO Lite (uBOL) è un sistema di blocco dei contenuti basato su MV3. -Il set di regole predefinito corrisponde al set di filtri predefinito di uBlock Origin: +L'insieme di regole predefinito corrisponde all'insieme di filtri predefinito di uBlock Origin: -- Elenchi dei filtri integrati di uBlock Origin +- Liste dei filtri integrati di uBlock Origin - EasyList - EasyPrivacy - Elenco dei server pubblicitari e di tracciamento di Peter Lowe -- Tracker mascherati da AdGuard CNAME -Puoi aggiungere altri set di regole visitando la pagina delle opzioni: fai clic sull'icona _Cogs_ nel pannello a comparsa. +Puoi abilitare altri set di regole visitando la pagina delle opzioni: clicca sull'icona _Cogs_ nel pannello a comparsa. -uBOL è interamente dichiarativo ovvero non è necessario un processo uBOL permanente per eseguire il filtraggio e il filtraggio dei contenuti CSS/JS inietattai viene eseguito in modo affidabile dal browser stesso piuttosto che dall'estensione. Ciò significa che lo stesso uBOL non consuma risorse di CPU/memoria mentre il blocco dei contenuti è in corso: il processo di lavoro di servizio di uBOL è richiesto _solo_ quando interagisci con il pannello popup o le pagine delle opzioni. - -uBOL non richiede un'ampia autorizzazione di "lettura e modifica dei dati" al momento dell'installazione, da qui le sue capacità limitate rispetto a uBlock Origin o ad altre estensioni che richiedono ampie autorizzazioni di "lettura e modifica dei dati" al momento dell'installazione. - -Tuttavia, uBOL consente di concedere *esplicitamente* permessi estesi a siti specifici di vostra scelta, in modo da poter filtrare meglio tali siti utilizzando il filtraggio cosmetico e le iniezioni di scriptlet. - -Per concedere autorizzazioni estese su un determinato sito, apri il pannello popup e scegli una modalità di filtraggio più restrittiva come Ottimale o Completa. - -Il browser ti avviserà degli effetti della concessione delle autorizzazioni aggiuntive richieste dall'estensione sul sito corrente e dovrai comunicare al browser se accetti o rifiuti la richiesta. - -Se accetti la richiesta di uBOL per ulteriori autorizzazioni sul sito corrente, sarà in grado di filtrare meglio i contenuti per il sito corrente. - -Puoi impostare la modalità di filtraggio predefinita dalla pagina delle opzioni di uBOL. Se scegli come predefinita la modalità Ottimale o Completa, dovrai concedere a uBOL il permesso di leggere e modificare i dati di tutti i siti web. - -Tieni presente che questo è ancora un work in progress, con questi obiettivi finali: - -- Nessuna autorizzazione host ampia al momento dell'installazione: le autorizzazioni estese vengono concesse esplicitamente dall'utente in base al sito. - -- Interamente dichiarativo per l'affidabilità e l'efficienza della CPU/memoria. +uBOL è interamente dichiarativo, ovvero non è necessario che ci sia un processo di uBOL permanente per poter eseguire il filtraggio; e il filtraggio dei contenuti basato sull'iniezione di elementi CSS/JS viene eseguito in modo affidabile dal browser stesso piuttosto che dall'estensione. Ciò significa che lo stesso uBOL non consuma risorse di CPU o memoria mentre il blocco dei contenuti viene eseguito: il processo che esegue il servizio di uBOL è richiesto _solamente_ quando interagisci con il pannello a comparsa o con le pagine delle opzioni. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ja.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ja.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ja.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ja.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite(uBOL)は実験的な*承認なし*の MV3 ベースのコンテンツ ブロッカーです。 +uBO Lite (uBOL) は MV3 ベースのコンテンツブロッカーです。 -デフォルトのルールセットは uBlock Origin のデフォルトのフィルターセットと一致します。: +デフォルトのルールセットは以下の通りです。uBlock Origin のデフォルトフィルターセットと同じです。 -- uBlock Origin のビルトイン フィルターリスト +- uBlock Origin の内蔵フィルターリスト - EasyList - EasyPrivacy -Peter Lowe の広告とトラッキングサーバーのリスト -- AdGuard の CNAME Cloak トラッカーのリスト +- Peter Lowe’s Ad and tracking server list -オプションページでルールセットを追加できます -- ポップアップ パネルの「歯車」アイコンをクリックします。 +オプションページでルールセットを有効化できます。ポップアップパネルの「歯車」アイコンをクリックしてください。 uBOL は完全に宣言的です。つまり、フィルタリングを行うための恒久的な uBOL プロセスは必要なく、CSS/JS インジェクション ベースのコンテンツフィルタリングは拡張機能ではなくブラウザによって、確実に実行されます。 これは uBOL がコンテンツブロッキングの際に CPU、メモリを消費しないことを意味します。uBOL のサービス ワーカーは ポップアップ パネルや設定ページでのみ必要とされます。 - -uBOL はインストール時に広範な「データの読み取りと変更」の権限を要求しません。したがって uBlock Origin やその他の、インストール時に広範な「データの読み取りと変更」の権限を要求するコンテンツ ブロッカーに比べて、行えることが制限されています。 - -しかし、uBOL は特定のサイトに対してユーザーが *明示的に* 拡張された権限を付与することによって、より良いフィルターや綺麗なスクリプトの挿入を可能とします。 - -特定のサイトで拡張された権限を付与するには、ポップアップ パネルを開いて、「最適」や「完全」のようなより高いフィルタリングモードを選択します。 - -ブラウザは、現在のサイトで拡張機能によってリクエストされた追加の権限を付与することによってもたらされる影響について警告します。承認または拒否することができます。 - -現在のサイトでの uBOL のリクエストを承認すると、現在のサイトにより良いフィルターを適用できるようになります。 - -uBOL の設定ページで規定のフィルタリング モードを設定できます。 「最適」または「完全」を規定のフィルタリング モードに設定した場合、すべてのWebサイトで「データの読み取りと変更」権限を付与する必要があります。 - -注意として、uBOL はまだ開発途中で、これらの開発目標があります。 - -- インストール時に広範なホスト権限は不要 -- 拡張された権限はサイトごとにユーザーによって明示的に付与されます。 - -- 完全に宣言的で、CPU、メモリの効率性が良い diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ka.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ka.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ka.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ka.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) საცდელი, *ნებართვებისგან თავისუფალი*, MV3-ზე დაფუძნებული შიგთავსის შემზღუდავია. +uBO Lite (uBOL) შიგთავსის შემზღუდავია MV3-ის მიხედვით. წესების ნაგულისხმევი კრებული იგივეა, რასაც uBlock Origin იყენებს: -- uBlock Origin – ფილტრების ჩაშენებული სიები +- ჩაშენებული ფილტრებით, uBlock Origin რომ იყენებს - EasyList - EasyPrivacy - Peter Lowe – სარეკლამო სერვერების სია -- AdGuard – CNAME-ით შენიღბული მეთვალყურეები -შეგიძლიათ სხვა კრებულებიც დაამატეთ პარამეტრების გვერდიდან -- დაწკაპეთ _Cogs_ ხატულაზე ამომხტომ არეში. +შეგიძლიათ სხვა კრებულებიც აამოქმედოთ პარამეტრების გვერდიდან -- დაწკაპეთ _Cogs_ ხატულაზე ამომხტომ არეში. -uBOL სრულად დეკლარაციულია, ანუ არაა საჭირო მუდმივად იყოს გაშვებული uBOL-პროცესი გასაფილტრად, CSS/JS ჩანაცვლებით შიგთავსის გაფილტვრას თავად ბრაუზერი უზრუნველყოფს ნაცვლად გაფართოებისა, რაც მეტად საიმედოა. შესაბამისად, uBOL თავად არ დატვირთავს პროცესორს/ოპერატიულს შიგთავსის შეზღუდვის დროს -- uBOL-ის შუამავალი მომსახურე პროცესი საჭიროა _მხოლოდ_ მაშინ, როცა ამომხტომ არესთან ურთიერთქმედებთ ან ცვლით პარამეტრებს. - -uBOL არ საჭიროებს „მონაცემთა წაკითხვისა და შეცვლის“ სრულ ნებართვას დაყენებისას, ვინაიდან მოკვეცილი შესაძლებლობებითაა წარმოდგენილი uBlock Origin-თან ან რეკლამის სხვა შემზღუდავებთან შედარებით, რომლებიც ერთბაშად ითხოვს „მონაცემთა წაკითხვისა და შეცვლის“ უფლებას დაყენებისთანავე. - -თუმცაღა uBOL საშუალებას გაძლევთ *მკაფიო* თანხმობით მიუთითოთ გაფართოებული ნებართვები ცალკეულ საიტებზე სურვილისამებრ, რომ უკეთ შეიზღუდოს შიგთავსი ხილული ელემენტების გაფილტვრითა და პროგრამული ჩამატებებით. - -გაფართოებული ნებართვების მისაცემად მითითებულ საიტზე, გახსენით ამომხტომი არე და აირჩიეთ ფილტრაციის უფრო მაღალი დონე, როგორიცაა „წონასწორული“ ან „სრული“. - -შემდეგ ბრაუზერი გაგაფრთხილებთ გაფართოების მიერ დამატებითი ნებართვების მოთხოვნის შესახებ მოცემულ საიტზე და აირჩევთ, დათანხმდებით თუ უარყოფთ მოთხოვნას. - -თუ დათანხმდებით uBOL-ს მოთხოვნას დამატებითი ნებართვებისთვის მიმდინარე საიტზე, უკეთ შეძლებს შიგთავსის შეზღუდვას აღნიშნულ საიტზე. - -შეგიძლიათ მიუთითოთ გაფილტვრის ნაგულისხმევი რეჟიმი uBOL-ის პარამეტრების გვერდიდან. თუ აირჩევთ „წონასწორულ“ ან „სრულ“ რეჟიმს ნაგულისხმევად, uBOL-ს უნდა დართოთ ყველა საიტზე მონაცემთა წაკითხვისა და შეცვლის ნება. - -დაიხსომეთ, რომ ჯერ კიდევ მუშავდება შემდეგი მიზნებისთვის: - -- არანაირი სრული ნებართვების ერთბაშად მოთხოვნა დაყენებისას -- დამატებითი უფლებები შეიძლება მიეცეს მომხმარებლის მკაფიო თანხმობით თითოეულ საიტზე ცალ-ცალკე. - -- სრულად დეკლარაციულია პროცესორის/მეხსიერების დასაზოგად. +uBOL მოქმედებს სრულად დადგენილი წესებით, შესაბამისად, არ ესაჭიროება მუდმივად გაშვებული uBOL-პროცესი გასაფილტრად, ხოლო როცა შიგთავსის შეზღუდვა ითხოვს ჩანაცვლდეს CSS/JS, ამას თავად ბრაუზერი უზრუნველყოფს საიმედო გზით, ნაცვლად გაფართოებისა. აქედან გამომდინარე, uBOL თავად არ მოიხმარს პროცესორს/მეხსიერებას შიგთავსის შეზღუდვისას -- uBOL საჭიროებს შუამავალ მომსახურე პროცესს _მხოლოდ_ მაშინ, როცა ამომხტომ არესთან ურთიერთქმედებთ ან ცვლით პარამეტრებს. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.kk.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kk.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.kk.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kk.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.kn.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kn.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.kn.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kn.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. ಇದರರ್ಥ ವಿಷಯ ನಿರ್ಬಂಧಿಸುವಿಕೆಯು ನಡೆಯುತ್ತಿರುವಾಗ uBOL ಸ್ವತಃ CPU/ಮೆಮೊರಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುವುದಿಲ್ಲ -- ನೀವು ಪಾಪ್ಅಪ್ ಪ್ಯಾನೆಲ್ ಅಥವಾ ಆಯ್ಕೆಯ ಪುಟಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಿದಾಗ uBOL ನ ಸೇವಾ ವರ್ಕರ್ ಪ್ರಕ್ರಿಯೆಯು _ಮಾತ್ರಾ_ ಅಗತ್ಯವಿದೆ. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ko.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ko.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ko.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ko.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite(uBOL)는 *적은 권한을 요구하는* 실험적인 MV3 기반 콘텐츠 차단기입니다. +uBO Lite (uBOL)는 MV3 기반 콘텐츠 차단기입니다. 기본 규칙 목록은 uBlock Origin의 기본 필터 목록과 대응됩니다. @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -설정 페이지에서 규칙 목록을 더욱 추가할 수 있습니다. 팝업 창의 _Cogs_ 아이콘을 누르세요. +설정 페이지에서 규칙 목록을 더 활성화할 수 있습니다. 팝업 창의 _Cogs_ 아이콘을 누르세요. uBOL은 완전히 선언적이라 필터링 중 영구적으로 실행되는 uBOL 프로세스를 필요로 하지 않으며, CSS/JS 주입 기반 콘텐츠 필터링이 확장 프로그램이 아닌 브라우저 자체에서 더욱 안정적으로 동작합니다. 즉 uBOL 자체는 콘텐츠 차단을 하는 동안 CPU/메모리 리소스를 소비하지 않습니다. uBOL 서비스워커 프로세스는 사용자가 팝업 창이나 설정을 열었을 _때에만_ 동작합니다. - -uBOL은 설치 시 광범위한 "읽기 및 수정" 권한을 요구하지 않으므로, 설치 후 즉시 쓸 수 있는 기능들은 uBlock Origin이나 설치 시 광범위한 "읽기 및 수정" 권한을 요구하는 다른 콘텐츠 차단기에 비해 제한됩니다. - -하지만 uBOL에서는 원하는 특정 사이트에 대해 확장된 권한을 부여하여, 해당 사이트를 표면 필터링 및 스크립트 주입을 바탕으로 더욱 잘 필터링할 수 있습니다. - -주어진 사이트에 확장된 권한을 부여하려면, 팝업 창을 열고 필터링 모드를 '최적'이나 '완전'과 같이 더 높은 수준으로 선택하세요. - -브라우저는 확장 프로그램에 현재 사이트에 대한 추가 권한을 부여했을 때 발생할 수 있는 일에 대해 경고할 것이며, 권한 요청을 수락할지 거부할지 선택해야 합니다. - -현재 사이트에 대해 uBOL에 추가 권한을 부여하면, 해당 사이트의 콘텐츠를 더욱 잘 필터링할 수 있습니다. - -uBOL 설정 페이지에서 기본 필터링 모드를 설정할 수 있습니다. 기본 모드를 '최적' 혹은 '완전'으로 설정하는 경우, uBOL에 모든 웹사이트에서 데이터를 읽고 수정할 수 있는 권한을 부여해야 합니다. - -본 확장 프로그램은 여전히 아래 목표를 달성하기 위해 개발 중인 단계입니다. - -- 설치 시 광범위한 호스트 권한을 요구하지 않고, 사용자가 사이트마다 명시적으로 확장된 권한을 부여할 수 있도록 합니다. - -- 완전히 선언적으로 구현하여 CPU/메모리 효율성과 신뢰성을 확보합니다. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ku.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ku.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ku.txt 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ku.txt 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,30 @@ +uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. + +The default ruleset corresponds to uBlock Origin's default filterset: + +- uBlock Origin's built-in filter lists +- EasyList +- EasyPrivacy +- Peter Lowe’s Ad and tracking server list + +You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. + +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. + +uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. + +However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. + +To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. + +The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. + +If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. + +You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. + +Keep in mind this is still a work in progress, with these end goals: + +- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. + +- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.lt.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lt.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.lt.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lt.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.lv.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lv.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.lv.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lv.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) ir izmēģinājuma *bezatļauju* uz MV# balstīts satura aizturētājs. +uBO Lite (uBOL) — uz MV3 balstīts satura aizturētājs. -Noklusējuma nosacījumu kopa atbilst uBokc Origin noklusējuma aizturēšanas kopai: +Noklusējuma nosacījumu kopa atbilst uBock Origin noklusējuma aizturēšanas kopai: - uBlock Origin iebūvētie aizturēšanas saraksti - EasyList - EasyPrivacy -- Pētera Lova (Peter Lowe) reklāmu un izsakošanas serveru saraksts -- AdGuard ar CNAME aizsegtie izsekotāji +- Pētera Lova (Peter Lowe) reklāmu un izsekošanas serveru saraksts -Vairāk nosacījumu kopu var pievienot iestatījumu sadaļā -- jāklikšķina _Zobratu_ ikona uznirstošajā logā. +Vairāk nosacījumu kopu var iespējot iestatījumu sadaļā -- jāklikšķina _Zobratu_ ikona uznirstošajā logā. uBOL ir pilnībā vispārīgs, kas nozīmē, ka nav nepieciešamības pēc pastāvīga uBOL procesa, lai notiktu aizturēšana, un uz CSS/JS ievietošanu balstīta satura aizturēšanu uzticami veic pārlūks, nevis paplašinājums. Tas nozīmē, ka uBOL pats par sevi neizmanto procesoru un atmiņu, kamēr satura aizturēšana ir notiekoša -- uBOL pakalpojuma strādņa process ir nepieciešams _tikai_ tad, kad notiek mijiedarbība ar uznirstošo logu vai iestatījumu sadaļām. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -Lai nodrošinātu paplašinātas piekļuves tiesības noteiktā vietnē, jāatver uznirstošais logs un jāizvēlas striktāks aizturēšanas veids, kā, piemēram, "Labākais" vai "Pilnīgais". - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.mk.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mk.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.mk.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mk.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +Стандардниот сет на правила одговара на стандардниот филтер сет на uBlock Origin: -- uBlock Origin's built-in filter lists +- Вградени филтер листи на uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Листа на реклами и следачи на Peter Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Можете да овозможите повеќе сетови на правила посетувајќи ја страницата со опции - кликнете на иконата _запчаник_ во попап панел. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL е целосно декларативен, што значи дека не е потребен траен процес на uBOL за филтрирање да се одвива, а филтрирањето на содржини врз основа на инјекција на CSS/JS се извршува со сигурност од самото браузер, а не од самата екстензија. Ова значи дека самиот uBOL не консумира ресурси на CPU/меморија додека блокирањето на содржини е во тек - процесот на службениот работник на uBOL е потребен _само_ кога ќе е потребен со попап панел или страниците со опции. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ml.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ml.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ml.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ml.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +ഡിഫോൾട്ട് റൂൾസെറ്റ് uBlock Origin-ന്റെ ഡിഫോൾട്ട് ഫിൽട്ടർസെറ്റുമായി യോജിക്കുന്നു: -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- uBlock ഒറിജിനിന്റെ ബിൽറ്റ്-ഇൻ ഫിൽട്ടർ ലിസ്റ്റുകൾ +- ഈസി ലിസ്റ്റ് +- ഈസി സ്വകാര്യത +- പീറ്റർ ലോവിന്റെ പരസ്യവും ട്രാക്കിംഗ് സെർവർ ലിസ്റ്റും -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL പൂർണ്ണമായും ഡിക്ലറേറ്റീവ് ആണ്, അതായത് ഫിൽട്ടറിംഗ് സംഭവിക്കുന്നതിന് ഒരു സ്ഥിരമായ uBOL പ്രക്രിയയുടെ ആവശ്യമില്ല, കൂടാതെ CSS/JS ഇഞ്ചക്ഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഉള്ളടക്ക ഫിൽട്ടറിംഗ്, എക്സ്റ്റൻഷനേക്കാൾ വിശ്വസനീയമായി ബ്രൗസർ തന്നെ നിർവഹിക്കുന്നു. ഉള്ളടക്കം തടയൽ നടന്നുകൊണ്ടിരിക്കുമ്പോൾ uBOL തന്നെ CPU/മെമ്മറി ഉറവിടങ്ങൾ ഉപയോഗിക്കില്ല എന്നാണ് ഇതിനർത്ഥം -- നിങ്ങൾ പോപ്പ്അപ്പ് പാനലുമായോ ഓപ്‌ഷൻ പേജുകളുമായോ സംവദിക്കുമ്പോൾ _only_ uBOL-ന്റെ സേവന വർക്കർ പ്രോസസ്സ് ആവശ്യമാണ്. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.mr.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mr.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.mr.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mr.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) हे MV3-आधारित कंटेंट ब्लॉकर आहे. -The default ruleset corresponds to uBlock Origin's default filterset: +डीफॉल्ट नियमसंच uBlock Origin च्या डीफॉल्ट फिल्टरसेटशी संबंधित आहे: -- uBlock Origin's built-in filter lists +- uBlock Origin च्या बिल्ट-इन फिल्टर लिस्ट - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- पीटर लोवची जाहिरात आणि ट्रॅकिंग सर्व्हर यादी -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +तुम्ही पर्याय पृष्ठाला भेट देऊन अधिक नियम संच सक्षम करू शकता -- पॉपअप पॅनेलमधील _Cogs_ चिन्हावर क्लिक करा. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL पूर्णपणे घोषणात्मक आहे, म्हणजे फिल्टरिंगसाठी कायमस्वरूपी uBOL प्रक्रियेची गरज नाही, आणि CSS/JS इंजेक्शनवर आधारित सामग्री फिल्टरिंग ब्राउझरच्याच मदतीने विश्वासार्हपणे होते, विस्ताराद्वारे नव्हे. याचा अर्थ असा की सामग्री ब्लॉकिंग चालू असताना uBOL स्वतः CPU/मेमरी संसाधने वापरत नाही — uBOL चा सर्व्हिस वर्कर प्रोसेस फक्त तेव्हाच लागतो जेव्हा तुम्ही पॉपअप पॅनल किंवा पर्याय पृष्ठांशी संवाद साधता. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ms.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ms.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ms.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ms.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +Set peraturan lalai sepadan dengan set penapis lalai uBlock Origin: -- uBlock Origin's built-in filter lists +- Senarai penapis terbina dalam uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Senarai pelayan iklan dan penjejakan 'Peter Lowe' -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL adalah deklaratif sepenuhnya, bermakna tidak ada keperluan untuk proses uBOL kekal untuk penapisan berlaku, dan penapisan kandungan berasaskan suntikan CSS/JS dilakukan sepenuhnya oleh penyemak imbas itu sendiri dan bukannya oleh sambungan. Ini bermakna uBOL sendiri tidak menggunakan sumber CPU/memori semasa penyekatan kandungan sedang berjalan -- proses pekerja perkhidmatan uBOL diperlukan _hanya_ apabila anda berinteraksi dengan panel timbul atau halaman pilihan. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.nb.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nb.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.nb.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nb.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) er en eksperimentell *tillatelses-begrenset* MV3-basert innholdsblokkerer. +uBO Lite (uBOL) er en MV3-basert innholdsblokkerer. Standardregelsettet tilsvarer standardfiltersettet til uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers Du kan legge til flere regelsett ved å gå til innstillingssiden -- klikk _Tannhjul_-ikonet i oppsprettspanelet. uBOL er fullstendig deklarativ, noe som betyr at det ikke er behov for en permanent uBOL-prosess for at filtreringen skal skje, og CSS/JS-injeksjonsbasert innholdsfiltrering utføres pålitelig av nettleseren selv i stedet for av utvidelsen. Dette betyr at uBOL selv ikke bruker CPU/minneressurser mens innholdsblokkering pågår -- uBOL's service worker-prosess kreves _bare_ når du samhandler med oppsprettspanelet eller innstillingssidene. - -uBOL krever ikke bred "lese og endre data"-tillatelse under installasjonen, derav begrensede muligheter i utgangspunktet sammenlignet med uBlock Origin eller andre innholdsblokkerere som krever bred "lese og endre data"-tillatelse under installasjonen. - -Men, uBOL lar deg *uttrykkelig* gi utvidede tillatelser på bestemte nettsteder du velger, slik at uBOL bedre kan filtrere på disse nettstedene ved bruk av kosmetisk filtrering og skriptlet-injeksjoner. - -For å gi utvidede tillatelser på et gitt nettsted, åpne oppsprettspanelet og velg en høyere filtreringsmodus som Optimal eller Fullstendig. - -Nettleseren vil da advare deg om effektene av å gi de ekstra tillatelsene som utvidelsen ber om på det gjeldende nettstedet, og du må fortelle nettleseren om du godtar eller avslår forespørselen. - -Hvis du godtar forespørselen fra uBOL om ekstra tillatelser på det gjeldende nettstedet, vil uBOL være i stand til å filtrere innhold bedre for det gjeldende nettstedet. - -Du kan angi standard filtreringsmodus fra innstillingssiden i uBOL. Hvis du velger Optimal eller Fullstendig modus som standard, må du gi uBOL tillatelsen til å lese og endre data på alle nettsteder. - -Husk at dette fortsatt er et arbeid som pågår, med disse sluttmålene: - -- Ingen brede vertstillatelser under installasjonen -- utvidede tillatelser gis uttrykkelig av brukeren på per-side-basis. - -- Helt deklarativt for pålitelighet og CPU/minneeffektivitet. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.nl.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nl.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.nl.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nl.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is een experimentele, *toestemmingsloze* MV3-gebaseerde inhoudsblokkeerder. +uBO Lite (uBOL) is een op MV3 gebaseerde inhoudsblokkeerder. De standaard regelset komt overeen met de standaard filterset van uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -U kunt meer regelsets toevoegen door de optiespagina te bezoeken -- klik op het _tandwielpictogram_ in het pop-uppaneel. +U kunt meer regelsets inschakelen door de optiespagina te bezoeken -- klik hiervoor op het _tandwielpictogram_ in het pop-uppaneel. uBOL is volledig declaratief, wat betekent dat er geen permanent uBOL-proces voor de filtering nodig is, en inhoudsfiltering op basis van CSS/JS-injectie op een betrouwbare manier door de browser zelf wordt uitgevoerd in plaats van door de extensie. Dit betekent dat uBOL zelf geen CPU-/geheugenbronnen gebruikt terwijl inhoudsblokkering actief is -- het serviceworker-proces van uBOL is _alleen_ vereist als u met het pop-uppaneel of de optiespagina’s werkt. - -uBOL vereist geen brede toestemming voor het ‘lezen en aanpassen van gegevens’ tijdens installatie, vandaar de beperkte ingebouwde mogelijkheden ervan in vergelijking met uBlock Origin of andere inhoudsblokkeerders die brede toestemmingen voor het ‘lezen en aanpassen van gegevens’ vereisen tijdens installatie. - -U kunt in uBOL echter *expliciet* uitgebreide toestemmingen verlenen op bepaalde websites van uw keuze, zodat het op die websites beter kan filteren via cosmetische filtering en scriptlet-injecties. - -Om uitgebreide toestemmingen op een bepaalde website te verlenen, opent u het pop-uppaneel en kiest u een hogere filtermodus, zoals Optimaal of Volledig. - -De browser waarschuwt u dan over de gevolgen van het verlenen van de door de extensie aangevraagde aanvullende toestemmingen op de huidige website, en u dient de browser te laten weten of u de aanvraag accepteert of weigert. - -Als u de aanvraag van uBOL voor aanvullende toestemmingen op de huidige website accepteert, zal het inhoud voor de huidige website beter kunnen filteren. - -U kunt de standaard filtermodus instellen vanaf de optiespagina van uBOL. Als u de modus Optimaal of Volledig als de standaardmodus kiest, dient u uBOL de toestemming voor het lezen en aanpassen van gegevens op alle websites te verlenen. - -Onthoud dat dit nog werk in uitvoering is, met deze einddoelen: - -- Geen brede host-toestemmingen tijdens installatie -- uitgebreide toestemmingen worden expliciet en per website verleend door de gebruiker. - -- Volledig declaratief omwille van betrouwbaarheid en CPU-/geheugenefficiëntie. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.oc.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.oc.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.oc.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.oc.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pa.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pa.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pa.txt 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pa.txt 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,12 @@ +uBO Lite (uBOL) is an MV3-based content blocker. + +ਮੂਲ ਨਿਯਮ-ਸਮੂਹ uBlock Origin ਦੇ ਮੂਲ ਫਿਲਟਰ-ਸਮੂਹ ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ: + +- uBlock Origin ਦੀਆਂ ਬਿਲਟ-ਇਨ ਫਿਲਟਰ ਸੂਚੀਆਂ +-ਸੌਖੀ-ਸੂਚੀ +-ਸੌਖੀ ਪਰਦੇਦਾਰੀ +- Peter Lowe ਦੀ ਇਸ਼ਤਿਹਾਰ ਅਤੇ ਟਰੈਕਿੰਗ ਸਰਵਰ ਸੂਚੀ + +ਤੁਸੀਂ ਚੋਣਾਂ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹ ਕੇ ਹੋਰ ਰੂਲ-ਸੈੱਟ ਸਮਰੱਥ ਕਰ ਕਦੇ ਹੋ -- ਪੌਪ-ਅੱਪ ਪੈਨਲ ਵਿੱਚ _Cogs_ icon ਨੂੰ ਕਲਿੱਕ ਕਰੋ। + +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pl.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pl.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pl.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pl.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) to eksperymentalny, *niewymagający uprawnień* bloker treści oparty na MV3. +uBO Lite (uBOL) to bloker treści oparty na MV3. Domyślny zestaw reguł odpowiada domyślnemu zestawowi filtrów uBlock Origin: -– wbudowane listy filtrów uBlock Origin +– wbudowane listy filtrów rozszerzenia uBlock Origin – EasyList – EasyPrivacy – lista serwerów śledzących i reklam Petera Lowe'a -– serwery śledzące ukrywające rzeczywistą nazwę domeny (CNAME) AdGuard -Możesz dodać więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _Trybika_ w wyskakującym panelu. +Możesz włączyć więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _koła zębatego_ w wyskakującym panelu. uBOL jest całkowicie deklaratywny, co oznacza, że nie jest potrzebny stały proces uBOL w celu filtrowania, a filtrowanie treści oparte na wstrzykiwaniu CSS/JS jest wykonywane niezawodnie przez samą przeglądarkę, a nie przez rozszerzenie. Oznacza to, że sam uBOL nie zużywa zasobów procesora/pamięci, gdy trwa blokowanie treści – proces Service Worker uBOL jest wymagany _tylko_ podczas interakcji z panelem wyskakującym lub stronami opcji. - -uBOL w trakcie instalacji nie wymaga szerokich uprawnień do „odczytu i modyfikacji danych”, stąd jego ograniczone możliwości w porównaniu z uBlock Origin lub innymi blokerami treści, które w czasie instalacji wymagają szerokich uprawnień do „odczytu i modyfikacji danych”. - -Jednakże uBOL umożliwia *jawnie* udzielanie rozszerzonych uprawnień na określonych wybranych witrynach, dzięki czemu może lepiej filtrować te witryny za pomocą filtrowania kosmetycznego i wstrzykiwania skryptletów. - -Aby przyznać rozszerzone uprawnienia na danej witrynie, otwórz panel wyskakujący i wybierz wyższy tryb filtrowania, taki jak Optymalny lub Kompletny. - -Przeglądarka wyświetli ostrzeżenie o skutkach przyznania dodatkowych uprawnień wymaganych przez rozszerzenie na bieżącej witrynie i będziesz musiał poinformować przeglądarkę, czy akceptujesz, czy odrzucasz żądanie. - -Jeśli zaakceptujesz żądanie uBOL o dodatkowe uprawnienia na bieżącej witrynie, będzie on w stanie lepiej filtrować zawartość bieżącej witryny. - -Możesz ustawić domyślny tryb filtrowania na stronie opcji uBOL. Jeśli tryb Optymalny lub Pełny zostanie wybrany jako domyślny, trzeba będzie przyznać uBOL uprawnienia do odczytu i modyfikacji danych na wszystkich stronach internetowych. - -Należy pamiętać, że nadal trwają prace z następującymi celami końcowymi: - -– Brak szerokich uprawnień hosta w czasie instalacji – rozszerzone uprawnienia są przyznawane jawnie przez użytkownika na podstawie poszczególnych witryn. - -– Całkowicie deklaratywna niezawodność i wydajność procesora/pamięci. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pt_BR.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_BR.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pt_BR.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_BR.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBlock Origin Lite (uBOL) é um bloqueador de conteúdo baseado em MV3 experimental *sem permissão*. +O uBO Lite (uBOL) é um bloqueador de conteúdo baseado no MV3. O conjunto de regras padrão corresponde ao conjunto de filtros padrão do uBlock Origin: -- Listas de filtros integradas do uBlock Origin +- Listas embutidas dos filtros do uBlock Origin - EasyList - EasyPrivacy -- Lista de filtros de anúncios e rastreadores do Pete Lowe -- Lista de domínios mascarados do AdGuard +- Lista de servidores de anúncios e rastreamento por Peter Lowe -Você pode adicionar mais conjuntos de regras visitando a página de opções -- clique no ícone _Engrenagem_ no painel pop-up. +Você pode ativar mais conjuntos de regras visitando a página de opções — clique no ícone da _Engranagem_ no painel do pop-up. -O uBOL é totalmente declarativo, o que significa que não há necessidade de um processo uBOL permanente para que a filtragem ocorra, e a filtragem de conteúdo baseada em injeção de CSS/JS é realizada de forma confiável pelo próprio navegador e não pela extensão. Isso significa que o próprio uBOL não consome recursos de CPU/memória enquanto o bloqueio de conteúdo está em andamento -- o processo de service worker do uBOL é necessário _apenas_ quando você interage com o painel pop-up ou as páginas de opções. - -O uBOL não requer permissão ampla de "ler e modificar dados" no momento da instalação, portanto, seus recursos limitados prontos para uso em comparação com o uBlock Origin ou outros bloqueadores de conteúdo que exigem permissões amplas de "ler e modificar dados" no momento da instalação. - -No entanto, o uBOL permite que você *explicitamente* conceda permissões estendidas em sites específicos de sua escolha, para que possa filtrar melhor esses sites usando filtragem cosmética e injeções de scriptlet. - -Para conceder permissões estendidas em um determinado site, abra o painel pop-up e escolha um modo de filtragem superior, como Otimizado ou Completo. - -O navegador irá avisá-lo sobre os efeitos da concessão das permissões adicionais solicitadas pela extensão no site atual, e você terá que informar ao navegador se aceita ou recusa a solicitação. - -Se você aceitar a solicitação do uBOL para permissões adicionais no site atual, ele poderá filtrar melhor o conteúdo do site atual. - -Você pode definir o modo de filtragem padrão na página de opções do uBOL. Se você escolher o Modo Otimizado ou Modo Completo como o modo padrão, você vai precisar dar a permissão de ler e modificar dados ao uBOL em todos os sites. - -Tenha em mente que este ainda é um trabalho em andamento, com estes objetivos finais: - -- Sem permissões amplas de host no momento da instalação -- as permissões estendidas são concedidas explicitamente pelo usuário por site. - -- Totalmente declarativo para confiabilidade e eficiência de CPU/memória. +O uBOL é totalmente declarativo, significando que não há necessidade de um processo permanente do uBOL para a filtragem ocorrer, e filtragem de conteúdo baseada em injeção de CSS/JS é realizada corretamente pelo próprio navegador ao invés da extensão. Isto significa que o uBOL em si não consome recursos de CPU/memória ao bloquear conteúdo -- o processo do service worker do uBOL _só_ é necessário quando você interage com o painel do pop-up ou as páginas de opções. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pt_PT.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_PT.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.pt_PT.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_PT.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -O uBO Lite (uBOL) é um bloqueador de conteúdo baseado em MV3 experimental *sem permissão*. +O uBO Lite (uBOL) é um bloqueador de conteúdo baseado em MV3. -O conjunto de regras padrão corresponde ao conjunto de filtros padrão do uBlock Origin: +O conjunto de regras predefinido corresponde ao conjunto de filtros predefinido do uBlock Origin: - Listas de filtros integrados do uBlock Origin - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -Pode adicionar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ no painel pop-up. +Pode ativar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ no painel popup. -O uBOL é totalmente declarativo, o que significa que não há necessidade de um processo uBOL permanente para que a filtragem ocorra, e a filtragem de conteúdo baseada em injeção de CSS/JS é realizada de forma confiável pelo próprio navegador e não pela extensão. Isto significa que o próprio uBOL não consome recursos da CPU/memória enquanto o bloqueio de conteúdo está em curso -- o processo de service worker do uBOL é necessário _apenas_ quando interage com o painel pop-up ou as páginas de opções. - -uBOL não requer ampla permissão de "ler e modificar dados" no momento da instalação, daí as suas capacidades limitadas de pronto a usar em comparação com uBlock Origin ou outros bloqueadores de conteúdo que requerem amplas permissões de "ler e modificar dados" no momento da instalação. - -No entanto, o uBOL permite-lhe que *explicitamente* conceda permissões alargadas em websites específicos de sua escolha, para que possa filtrar melhor esses websites usando filtragem cosmética e injeções de scriptlet. - -Para conceder permissões alargadas num determinado website, abra o painel pop-up e escolha um modo de filtragem superior, como Ideal ou Completo. - -O navegador irá avisá-lo sobre os efeitos da concessão das permissões adicionais solicitadas pela extensão no website atual, e terá que informar ao navegador se aceita ou recusa o pedido. - -Se aceitar o pedido do uBOL para permissões adicionais no website atual, o mesmo poderá filtrar melhor o conteúdo do website atual. - -Pode definir o modo de filtragem padrão na página de opções do uBOL. Se escolher o modo Ideal ou Completo como o modo predefinido, terá de conceder ao uBOL a permissão para ler e modificar dados em todos os sítios web. - -Tenha em mente que este ainda é um trabalho em curso, com estes objetivos finais: - -- Sem permissões amplas de host no momento da instalação -- as permissões alargadas são concedidas explicitamente pelo utilizador por website. - -- Totalmente declarativo para fiabilidade e eficiência da CPU/memória. +O uBOL é totalmente declarativo, o que significa que não é necessário um processo permanente do uBOL para que a filtragem ocorra, e a filtragem de conteúdos baseada em injeção de CSS/JS é realizada de forma fiável pelo próprio navegador, e não pela extensão. Isto significa que o próprio uBOL não consome recursos de CPU/memória enquanto o bloqueio de conteúdo está ativo -- o processo do service worker do uBOL é necessário apenas quando interage com o painel popup ou com as páginas de opções. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ro.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ro.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ro.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ro.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) este un blocker de conținut bazat pe MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Setul de reguli implicit corespunde setului de filtre implicit al uBlock Origin: -- uBlock Origin's built-in filter lists +Listele de filtre încorporate de uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- -Lista de servere de anunț și de urmărire a lui Peter Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Puteți activa mai multe seturi de reguli accesând pagina de opțiuni - faceți clic pe pictograma _Cogs_ din panoul pop-up. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL este în întregime declarativ, ceea ce înseamnă că nu este nevoie de un proces uBOL permanent pentru ca filtrarea să aibă loc, iar filtrarea conținutului pe bază de injecție CSS/JS este realizată în mod sigur de browser în sine, mai degrabă decât de extensie. Aceasta înseamnă că uBOL în sine nu consumă resurse CPU/memorie în timp ce blocarea conținutului este în desfășurare -- procesul de lucru al serviciului uBOL este necesar _doar_ atunci când interacționați cu panoul pop-up sau cu paginile de opțiuni. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ru.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ru.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ru.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ru.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) — экспериментальный блокировщик содержимого, *не требующий разрешений* и основанный на MV3. +uBO Lite (uBOL) — это блокировщик веб-элементов на базе MV3. Стандартный набор правил соответствует типовому набору фильтров uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Список рекламных и отслеживающих серверов от Peter Lowe -- AdGuard трекеры, замаскированные с помощью CNAME -Вы можете добавить больше правил, посетив страницу настроек -- нажмите на значок_Шестеренок на всплывающей панели. +Вы можете активировать больше списков правил на странице настроек -- нажмите на значок _Шестерёнки_ на всплывающей панели. uBOL - полностью декларативный, т.е. для фильтрации не нужен постоянно выполняющийся uBOL процесс, а фильтрация контента, основанная на внедрении CSS/JS, производится непосредственно браузером. Это значит, что дополнение uBOL не расходует ресурсы ЦПУ/памяти, когда происходит блокировка рекламы -- служебный процесс uBOL запускается, _только_ когда вы вносите изменения на всплывающей панели или странице настроек. - -uBOL не требует разрешение на полное "чтение и изменение данных" в момент установки, поэтому имеет ограниченные возможности по сравнению с uBlock Origin, и другими блокировщиками контента, которые требуют полное разрешение на "чтение и изменение данных" в момент установки. - -Однако uBOL позволяет *намеренно* давать расширенные разрешения для определенных сайтов - по вашему усмотрению, чтобы эффективнее работать, используя косметическую фильтрацию и scriptlet-внедрения. - -Для предоставления расширенных разрешений на текущем сайте - откройте всплывающую панель и выберите повышенный режим фильтрации: Оптимальный или Полный. - -Далее браузер выдаст предупреждение об эффектах предоставления расширенных разрешений, запрошенных дополнением на текущем сайте, и надо будет выбрать: принять или отклонить этот запрос. - -Если вы принимаете запрос uBOL на предоставление дополнительных разрешений, тогда дополнение сможет эффективнее фильтровать контент на текущем сайте. - -Вы можете установить стандартный режим фильтрации на странице настроек uBOL. Если вы выбираете Оптимальный или Полный режим - режимом по умолчанию, необходимо предоставить uBOL разрешение на чтение и изменение данных на всех веб-сайтах. - -Помните, что данный проект - в активной фазе разработки, преследующей следующие цели: - -- Работа с ограниченными разрешениями при установке -- расширенные разрешения пользователь выдает по своему усмотрению, каждому сайту отдельно. - -- Полностью декларативная работа - для надежности и эффективного использования ЦПУ/памяти. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.si.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.si.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.si.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.si.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) යනු MV3-පාදක අන්තර්ගත අවහිර කරන්නා වේ. -The default ruleset corresponds to uBlock Origin's default filterset: +පෙරනිමි රීති කට්ටලය uBlock Origin හි පෙරනිමි පෙරහන් කට්ටලයට අනුරූප වේ: -- uBlock Origin's built-in filter lists -- EasyList -- EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- uBlock Origin හි බිල්ට් පෙරහන් ලැයිස්තු +- පහසු ලැයිස්තුව +- පහසු පෞද්ගලිකත්වය +- පීටර් ලෝගේ දැන්වීම් සහ ලුහුබැඳීමේ සේවාදායක ලැයිස්තුව -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +විකල්ප පිටුවට පිවිසීමෙන් ඔබට තවත් නීති කට්ටල සක්‍රීය කළ හැකිය -- උත්පතන පැනලයේ _Cogs_ නිරූපකය ක්ලික් කරන්න. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL සම්පූර්ණයෙන්ම ප්‍රකාශනාත්මකයි, එනම් පෙරීම සිදුවීමට ස්ථිර uBOL ක්‍රියාවලියක් අවශ්‍ය නොවන අතර, CSS/JS එන්නත්-පාදක අන්තර්ගත පෙරීම දිගුව මගින් නොව බ්‍රවුසරය විසින්ම විශ්වාසදායක ලෙස සිදු කරයි. මෙයින් අදහස් කරන්නේ අන්තර්ගත අවහිර කිරීම සිදුවෙමින් පවතින අතරතුර uBOL විසින්ම CPU/මතක සම්පත් පරිභෝජනය නොකරන බවයි -- ඔබ උත්පතන පැනලය හෝ විකල්ප පිටු සමඟ අන්තර් ක්‍රියා කරන විට uBOL හි සේවා සේවක ක්‍රියාවලිය _only_ අවශ්‍ය වේ. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sk.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sk.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sk.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sk.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) je experimentálny blokátor obsahu založený na MV3 *bez povolenia*. +uBO Lite (uBOL) je blokovač obsahu založený na MV3. Predvolený súbor pravidiel zodpovedá predvolenému súboru filtrov uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Zoznam reklamných a sledovacích serverov Petra Lowea -- AdGuard CNAME-Cloaked Trackers -Ďalšie súbory pravidiel môžete pridať na stránke s možnosťami – kliknite na ikonu _súkolesia_ vo vyskakovacom paneli. +Ďalšie súbory pravidiel môžete povoliť na stránke s možnosťami – kliknite na ikonu _súkolesia_ vo vyskakovacom paneli. uBOL je úplne deklaratívny, čo znamená, že na filtrovanie nie je potrebný trvalý proces uBOL a filtrovanie obsahu založené na injektovaní CSS/JS spoľahlivo vykonáva samotný prehliadač, a nie rozšírenie. To znamená, že samotný uBOL nespotrebúva zdroje CPU/pamäte, kým prebieha blokovanie obsahu -- proces uBOL Service Worker je potrebný _len_ pri interakcii s vyskakovacím panelom alebo stránkami možností. - -uBOL pri inštalácii nevyžaduje všeobecné oprávnenie "čítať a upravovať údaje", preto má obmedzené možnosti v porovnaní s uBlock Origin alebo inými blokátormi obsahu, ktoré pri inštalácii vyžadujú všeobecné oprávnenie "čítať a upravovať údaje". - -UBOL vám však umožňuje *výslovne* udeliť všebecné oprávnenia na konkrétne stránky podľa vášho výberu, aby mohol lepšie filtrovať na týchto stránkach pomocou kozmetického filtrovania a injektovaných skriptletov. - -Ak chcete udeliť všeobecné oprávnenia na danom webe, otvorte vyskakovací panel a vyberte vyšší režim filtrovania, napríklad Optimálny alebo Kompletný. - -Prehliadač vás potom upozorní na dôsledky udelenia dodatočných oprávnení požadovaných rozšírením na aktuálnej stránke a vy budete musieť prehliadaču oznámiť, či požiadavku prijímate alebo odmietate. - -Ak prijmete žiadosť uBOL o dodatočné povolenia na aktuálnom webe, bude môcť lepšie filtrovať obsah aktuálneho webu. - -Predvolený režim filtrovania môžete nastaviť na stránke možností uBOL. Ak ako predvolený režim vyberiete Optimálny alebo Kompletný režim, budete musieť uBOL-u udeliť oprávnenie na čítanie a úpravu údajov na všetkých webových stránkach. - -Majte na pamäti, že na tomto projekte sa stále pracuje, pričom jeho konečné ciele sú tieto: - -- Žiadne všeobecné oprávnenia hostiteľa v čase inštalácie -- rozšírené oprávnenia udeľuje používateľ explicitne pre jednotlivé stránky. - -- Úplne deklaratívne pre spoľahlivosť a efektivitu CPU/pamäte. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sl.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sl.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sl.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sl.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.so.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.so.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.so.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.so.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sq.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sq.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sq.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sq.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) është një bllokues eksperimental *i pavarur* që funksionon sipas modelit MV3. +uBO Lite (uBOL) është një bllokues materialesh sipas modelit MV3. Rregullat e tij janë të barasvlershme me filtrat standardë që përdor uBlock Origin: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Lista e Peter Lowe për reklamat dhe gjurmuesit -- Lista e AdGuard për gjurmuesit me bazë CNAME -Në faqen e opsioneve mund të shtoni rregulla të tjera – klikoni ikonën e _ingranazhit_ në panelin modal. +Në faqen e opsioneve mund të aktivizoni rregulla të tjera – klikoni ikonën e _ingranazhit_ në panelin modal. uBOL është tërësisht deklarativ, domethënë filtrimi ndodh pa qenë nevoja që procesi i uBOL të vijojë vazhdimisht në sfond, ndërsa injektimi i filtrave CSS/JS te materialet kryhet me saktësi nga vetë shfletuesi. Pra, uBOL i bllokon materialet pa konsumuar resurset e procesorit/memories – asetet e uBOL nevojiten _vetëm_ kur ndërveproni me panelin modal ose faqen e opsioneve të tij. - -uBO Lite nuk kërkon leje shtesë për "leximin dhe modifikimin e të dhënave" kur e instaloni, prandaj fillimisht ka aftësi më të kufizuara sesa uBlock Origin apo bllokuesit e tjerë që kërkojnë leje shtesë për "leximin dhe modifikimin e të dhënave" gjatë instalimit. - -Megjithatë ju mund t'i jepni uBOL leje të posaçme *eksplicite* për ato uebsajte që doni, në mënyrë që t'i filtrojë më mirë me filtra kozmetikë dhe skripte. - -Lejet e posaçme për uebsajtet jepen nëpërmjet panelit modal duke zgjedhur mënyrën e filtrimit Optimal ose Komplet. - -Më tej shfletuesi do ju informojë për efektet e dhënies së këtyre lejeve për uebsajtin në fjalë dhe ju duhet ta pranoni ose refuzoni kërkesën. - -Po ta pranoni dhënien e lejeve shtesë për uebsajtin në fjalë, uBOL do mundet ta filtrojë më mirë atë. - -Në faqen e opsioneve të uBOL mund të përcaktoni mënyrën standarde të filtrimit. Nëse vendosni si standard mënyrën Optimale ose Komplete, uBOL do ju marrë leje për leximin dhe modifikimin e të dhënave në të gjitha uebsajtet. - -Kini parasysh se ky projekt është në zhvillim e sipër sipas këtyre objektivave: - -- Instalohet pa leje shtesë – lejet e posaçme për çdo uebsajt jepen në mënyrë eksplicite nga përdoruesi. - -- Tërësisht deklarativ për të qenë më i qëndrueshëm dhe eficient me procesorin/memorien. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sr.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sr.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sr.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sr.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) је блокатор садржаја заснован на MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Подразумевани скуп правила одговара подразумеваном скупу филтера uBlock Origin-а: -- uBlock Origin's built-in filter lists +- uBlock Origin листе уграђених филтера - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Можете омогућити још скупова правила тако што ћете посетити страницу са опцијама -- кликните на иконицу зупчаника у искачућем панелу. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL је потпуно декларативан, што значи да нема потребе за трајним uBOL процесом да би дошло до филтрирања, а филтрирање садржаја засновано на убацивању CSS/JS се обавља поуздано од стране самог прегледача, а не проширења. То значи да сам uBOL не троши CPU/меморијске ресурсе док је блокирање садржаја у току -- сервисни радни процес uBOL-а је потребан _само_ када ступите у интеракцију са искачућим панелом или страницама опција. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sv.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sv.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sv.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sv.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) är en experimentell *behörighetsfri* MV3-baserad innehållsblockerare. +uBO Lite (uBOL) är en MV3-baserad innehållsblockerare. Standardregeluppsättningen motsvarar uBlock Origins standardfilteruppsättning: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowes reklam- och spårningsserverlista -- AdGuard CNAME-dolda spårare -Du kan lägga till fler regeluppsättningar genom att besöka alternativsidan -- klicka på ikonen _Kugghjulet_ i popup-panelen. +Du kan lägga till fler regeluppsättningar i alternativ -- klicka på _Kugghjulet_ i popup-panelen. uBOL är helt deklarativt, vilket innebär att det inte finns något behov av en permanent uBOL-process för att filtreringen ska ske och CSS/JS-injektionsbaserad innehållsfiltrering utförs på ett tillförlitligt sätt av webbläsaren själv snarare än av tillägget. Detta innebär att uBOL själv inte förbrukar CPU/minnesresurser medan innehållsblockering pågår -- uBOLs serviceworkerprocess krävs _endast_ när du interagerar med popup-panelen eller alternativsidorna. - -uBOL kräver inte högre behörighet för "läs och ändra data" vid installationen, därav dess begränsade möjligheter jämfört med uBlock Origin eller andra innehållsblockerare som kräver högre behörighet för "läs och ändra data" vid installationen. - -Däremot låter uBOL dig *uttryckligen* ge utökade behörigheter på specifika webbplatser du väljer så att den bättre kan filtrera på dessa webbplatser med hjälp av kosmetisk filtrering och scriptletinjektioner. - -För att ge utökade behörigheter på en viss webbplats, öppna popup-panelen och välj ett högre filtreringsläge som optimal eller fullständig. - -Webbläsaren kommer sedan att varna dig om effekterna av att bevilja de ytterligare behörigheter som tillägget begär på den aktuella webbplatsen och du måste tala om för webbläsaren om du accepterar eller avslår begäran. - -Om du accepterar uBOLs begäran om ytterligare behörigheter på den aktuella webbplatsen kommer den att kunna filtrera innehåll för den aktuella webbplatsen bättre. - -Du kan ställa in standardfiltreringsläget från uBOLs alternativsida. Om du väljer läge optimalt eller fullständigt som standard måste du ge uBOL behörighet att läsa och ändra data på alla webbplatser. - -Tänk på att detta fortfarande är ett pågående arbete med dessa slutmål: - -- Inga högre värdbehörigheter vid installationen - utökade behörigheter ges uttryckligen av användaren per webbplats. - -- Helt deklarativt för tillförlitlighet och CPU/minneseffektivitet. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sw.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sw.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.sw.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sw.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ta.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ta.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ta.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ta.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.te.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.te.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.te.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.te.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.th.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.th.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.th.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.th.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) คือตัวบล็อกเนื้อหาที่ใช้สถาปัตยกรรม MV3 -The default ruleset corresponds to uBlock Origin's default filterset: +ชุดเงื่อนไขเริ่มต้นสอดคล้องกันกับค่าตัวกรองเริ่มต้นของ uBlock Origin: -- uBlock Origin's built-in filter lists +- รายการตัวกรองภายใน uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- รายการติดตามเซิร์ฟเวอร์โฆษณาของ Peter Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +คุณสามารถเปิดใช้งานชุดกฎเพิ่มเติมได้โดยไปที่หน้าตั้งค่า -- คลิกที่ไอคอนรูปเฟือง (Cogs) ในหน้าต่างป๊อปอัป -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL ทำงานในรูปแบบเชิงประกาศ (declarative) ทั้งหมด ซึ่งหมายความว่าไม่จำเป็นต้องมีโพรเซสถาวรของ uBOL สำหรับการกรอง และการกรองเนื้อหาที่อาศัยการฉีดโค้ด CSS/JS จะถูกดำเนินการอย่างมีเสถียรภาพโดยตัวเบราว์เซอร์เอง แทนที่จะทำโดยส่วนขยาย นั่นหมายความว่าตัว uBOL เองจะไม่ใช้ทรัพยากร CPU และหน่วยความจำในขณะที่การบล็อกเนื้อหากำลังทำงาน -- โพรเซส Service Worker ของ uBOL จะถูกเรียกใช้เฉพาะเมื่อคุณใช้งานหน้าต่างป๊อปอัปหรือหน้าตั้งค่าเท่านั้น diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.tr.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.tr.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.tr.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.tr.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL), MV3 tabanlı bir içerik engelleyicidir. -The default ruleset corresponds to uBlock Origin's default filterset: +Varsayılan kural seti, uBlock Origin'in varsayılan filtre setine karşılık gelir: -- uBlock Origin's built-in filter lists +- uBlock Origin'in yerleşik filtre listeleri - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe'un Reklam ve izleme sunucusu listesi -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Seçenekler ekranına uğrayarak daha fazla kuralı aktif hale getirebilirsiniz, bunun için açılır paneldeki _dişli_ simgesine tıklayın. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL tamamen bildirimseldir, yani filtrelemenin gerçekleşmesi için kalıcı bir uBOL işlemine gerek yoktur, içerik filtreleme eklenti yerine tarayıcının kendisi tarafından CSS/JS yerleştirerek gerçekleştirilir. Bu, içerik engelleme devam ederken uBOL'nin kendisinin CPU/bellek kaynaklarını tüketmediği anlamına gelir -- uBOL'un hizmet çalışanı işlemi, _only_ açılan panel veya seçenek sayfalarıyla etkileşim kurduğunuzda gereklidir. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. The default ruleset corresponds to uBlock Origin's default filterset: @@ -6,26 +6,7 @@ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.uk.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.uk.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.uk.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.uk.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) — це експериментальний *бездозвільний* блокувальник вмісту на основі MV3. +uBO Lite (uBOL) - це блокувальник вмісту на основі MV3. -Усталений набір правил відповідає типовому набору фільтрів uBlock Origin: +Набір правил за замовчанням відповідає типовому набору фільтрів uBlock Origin: - Вбудовані списки фільтрів uBlock Origin - EasyList - EasyPrivacy - Список серверів реклами та стеження від Peter Lowe -- Приховані CNAME-трекери AdGuard -Ви можете додати більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму _Шестерень_ на спливній панелі. +Ви можете ввімкнути більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму "Перейти до панелі керування" на спливній панелі. uBOL повністю декларативний, тобто немає необхідності в постійному процесі uBOL для здійснення фільтрації, а фільтрація вмісту на основі CSS/JS-ін'єкцій надійно виконується самим браузером, а не розширенням. Це означає, що сам uBOL не споживає ресурси процесора/пам'яті під час блокування вмісту — службовий робочий процес uBOL потрібен _лише_ під час взаємодії зі спливною панеллю або сторінками опцій. - -uBOL не вимагає широкого дозволу на «читання та зміну даних» під час встановлення, отже, його можливості «з коробки» обмежені порівняно з uBlock Origin або іншими блокувальниками, які вимагають широкого дозволу на «читання/зміну даних» під час встановлення. - -Однак uBOL дозволяє вам *явно* надавати розширені дозволи на певних сайтах на ваш вибір, щоб він міг краще виконувати фільтрування на цих сайтах, використовуючи косметичну фільтрацію та вкладення скриптів. - -Щоб надати розширені дозволи на певному сайті, відкрийте спливну панель і виберіть вищий режим фільтрації, наприклад, «Оптимальний» або «Повний». - -Потім браузер попередить вас про наслідки надання додаткових дозволів, запитуваних розширенням, на поточному сайті, і ви повинні будете повідомити браузеру, чи приймаєте ви запит або відхиляєте його. - -Якщо ви приймете запит uBOL на додаткові дозволи на поточному сайті, він зможе краще фільтрувати вміст для цього сайту. - -Ви можете типовий налаштувати режим фільтрації на сторінці налаштувань uBOL. Якщо ви обираєте типовим режим Оптимальний або Повний, вам потрібно буде надати uBOL дозвіл на читання та зміну даних на всіх вебсайтах. - -Варто пам'ятати, що це досі незавершена робота з такими цілями: - -- Відсутність широких дозволів на хост під час встановлення — розширені дозволи надаються користувачем окремо для кожного сайту. - -- Повністю декларативна оцінка надійності та ефективності роботи процесора/пам'яті. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ur.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ur.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.ur.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ur.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) is an MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +ڈیفالٹ رولسیٹ uBlock Origin کے ڈیفالٹ فلٹر سیٹ سے مساوی ہے: -- uBlock Origin's built-in filter lists +- یو بلاک اوریجن کی بلٹ ان فلٹر لسٹ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.vi.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.vi.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.vi.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.vi.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) is an experimental *permission-less* MV3-based content blocker. +uBO Lite (uBOL) là trình chặn nội dung dựa trên MV3. -The default ruleset corresponds to uBlock Origin's default filterset: +Bộ quy tắc mặc định tương tự bộ lọc của uBlock Origin: -- uBlock Origin's built-in filter lists +- Bộ lọc cài sẵn của uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Danh sách máy chủ chạy quảng cáo và trình theo dõi của Pete Lowe -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Bạn có thể tự thêm quy tắc mới ở trang cài đặt -- click vào biểu tượng _Bánh răng_ ở trong cửa sổ popup. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. - -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. - -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. - -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. - -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. - -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. - -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. - -Keep in mind this is still a work in progress, with these end goals: - -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. - -- Entirely declarative for reliability and CPU/memory efficiency. +uBOL mang tính khai báo hoàn toàn, vì vậy uBOL sẽ không cần phải liên tục chạy để chặn nội dung. Thay vào đó, chính trình duyệt sẽ thực hiện lọc nội dung bằng cách sử dụng công cụ chèn CSS/JS hiệu quả hơn có sẵn của nó. Điều này cũng đồng thời có nghĩa là uBOL sẽ không tiêu tốn tài nguyên CPU/bộ nhớ của bạn để chặn nội dung. uBOL sẽ chỉ chạy _khi và chỉ khi_ bạn đang xem cửa sổ popup của uBOL, hoặc bạn đang cấu hình uBOL ở trang cài đặt. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.zh_CN.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_CN.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.zh_CN.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_CN.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite(uBOL)是一个实验性的,基于浏览器最新扩展接口(Manifest Version 3)打造的“无权限”内容屏蔽工具。 +uBO Lite (uBOL) 是一个基于最新浏览器扩展接口(Manifest Version 3)打造的的内容屏蔽工具。 该扩展预设的规则列表对应 uBlock Origin 的预设过滤规则列表: - uBlock Origin 内置过滤规则列表 - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers +- Peter Lowe 的广告和跟踪服务器列表 -您可以通过设置页面添加更多过滤规则列表——点击弹出面板的“齿轮”图标。 +访问选项页面,点击弹出面板中的 _齿轮_ 图标,即可启用更多规则集。 -uBOL 的过滤规则是完全声明式的,并不需要固定保留一个 uBOL 扩展进程,基于 CSS/JS 注入的内容过滤更是交由浏览器进行调度,比起扩展本身更为可靠。 这也即是说当内容被过滤时 uBOL 自身并不占用额外 CPU 和内存资源,只有在您打开弹出面板或是设置页面时才会生成 uBOL 扩展进程。 - -uBOL 在安装时并不需要宽泛的“读取或修改网页数据”的权限,因此它的开箱即用功能相对于 uBlock Origin 以及其他安装时要求该权限的屏蔽工具显得较为有限。 - -不过,uBOL 可在您“明确”授予额外扩屏权限后,对您指定的网站采用基于 CSS/JS 注入的声明式规则加强内容过滤。 - -若要在特定网站授予扩展权限,请开启弹出面板并选择更高级的过滤模式,例如“优化”或“完全”。 - -接着浏览器会就在当前网站授予扩展额外权限有何影响示以警告,而您要接受或者拒绝该请求。 - -如果您允许 uBOL 在当前网站获取额外权限,它就可以更好地对网站内容进行过滤。 - -您还可以在 uBOL 的设置页面设定默认过滤模式。 如果设定的默认过滤模式是“优化”或“完全”,您必须授予 uBOL 读取或修改所有网页数据的权限。 - -请注意,该扩展尚未完成,其最终实现目标是: - -- 安装时不需要过多扩展权限——额外权限要由用戶指定,按需求及作用域授予。 - -- 采用完全声明式规则,以求可靠性以及更佳 CPU 和内存使用效率。 +uBOL 的过滤规则是完全声明式的,并不需要固定保留一个 uBOL 扩展进程,基于 CSS/JS 注入的内容过滤更是交由浏览器进行调度,比起扩展本身更为可靠。 这也即是说当内容被过滤时 uBOL 自身并不占用额外 CPU 和内存资源,_只有_在您打开弹出面板或是设置页面时才会生成 uBOL 扩展进程。 diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.zh_TW.txt ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_TW.txt --- ublock-origin-1.46.0+dfsg/platform/mv3/description/webstore.zh_TW.txt 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_TW.txt 2025-10-25 19:32:51.000000000 +0000 @@ -1,31 +1,12 @@ -uBO Lite (uBOL) 是款實驗性,以 MV3 為基礎的「免權限」內容阻擋器。 +uBO Lite (uBOL) 是一個基於 MV3 的內容封鎖器。 -預設規則集對應 uBlock Origin 的預設過濾集: +預設規則集對應着 uBlock Origin 的預設過濾集: - uBlock Origin 內建的過濾器清單 - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -- AdGuard CNAME-Cloaked Trackers -您可以前往選項頁面(按下彈出面板的 **齒輪** 按鈕)新增更多規則集。 +您可以前往選項頁面(按下彈出面板的 **齒輪** 按鈕)啟用更多規則集。 -uBOL 是完全宣告式的,意即過濾過程不需要持續性的 uBOL 處理程序參與,且以 CSS/JS 為基礎注入的內容過濾由比較可靠的瀏覽器進行,而非由擴充套件執行。 這就代表 uBOL 在內容阻擋過程不會佔用 CPU 和記憶體資源——除了和彈出面板或選項頁面互動的場景外,都不需要 uBOL 的 Service Worker 程序。 - -uBOL 在安裝期間不需要氾濫的「讀取與修改資料」權限,因此它出廠時的功能和 uBlock Origin 或其他在安裝期要求「讀取與修改資料」權限的內容阻擋程式比較,會比較受限。 - -不過 uBOL 能讓你 **明確** 在自選的特定站台授予更多權限,使其在這些站台的過濾效果可以在修飾過濾 scripetlet 注入的加持下得到提升。 - -若要授予指定網站的延伸權限,請開啟對話框並選擇更高的過濾模式,如「最佳化」或「完整」。 - -瀏覽器接著會警告您「授予擴充套件請求的額外權限會帶來的後果」,而你得告訴瀏覽器要同意還是拒絕請求。 - -如果你接受 uBOL 在目前站台請求的額外權限,其在這個網站的過濾效果會更好。 - -您可以在 uBOL 的選項頁面設定預設的過濾模式。 如果您選擇「最佳化」或預設的「完整」模式,您得授予 uBOL 讀取與修改所有網站資料的權限。 - -注意這尚未完工,最終目標有: - -- 安裝期不要有氾濫的主機權限——延伸權限讓使用者以網站為基準授予。 - -- 完全宣告式,提升可靠性和 CPU / 記憶體效率。 +uBOL 是完全宣告式的,意即過濾過程中不需要持續性的 uBOL 處理程序參與,且以 CSS/JS 注入為基礎的內容過濾由可靠的瀏覽器執行,而非是擴充功能。 這就代表 uBOL 在內容阻擋過程不會佔用 CPU 和記憶體資源——除了和彈出面板或選項頁面互動的場景外,都不需要 uBOL 的 Service Worker 程序。 diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/edge/patch-extension.js ublock-origin-1.67.0+dfsg/platform/mv3/edge/patch-extension.js --- ublock-origin-1.46.0+dfsg/platform/mv3/edge/patch-extension.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/edge/patch-extension.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,71 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import fs from 'fs/promises'; +import process from 'process'; + +/******************************************************************************/ + +const commandLineArgs = (( ) => { + const args = Object.create(null); + let name, value; + for ( const arg of process.argv.slice(2) ) { + const pos = arg.indexOf('='); + if ( pos === -1 ) { + name = arg; + value = ''; + } else { + name = arg.slice(0, pos); + value = arg.slice(pos+1); + } + args[name] = value; + } + return args; +})(); + +/******************************************************************************/ + +async function main() { + const packageDir = commandLineArgs.packageDir; + const manifestPath = `${packageDir}/manifest.json`; + + // Get manifest content + const manifest = await fs.readFile(manifestPath, { encoding: 'utf8' + }).then(text => + JSON.parse(text) + ); + + // https://learn.microsoft.com/answers/questions/918426/cant-update-extension-with-declarative-net-request + // Set all ruleset path to package root + for ( const ruleset of manifest.declarative_net_request.rule_resources ) { + const pos = ruleset.path.lastIndexOf('/'); + if ( pos === -1 ) { continue; } + ruleset.path = ruleset.path.slice(pos + 1); + } + // Commit changes + await fs.writeFile(manifestPath, + JSON.stringify(manifest, null, 2) + ); +} + +main(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/am/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/am/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/am/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/am/messages.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,278 +0,0 @@ -{ - "extName": { - "message": "uBlock Origin Lite", - "description": "extension name." - }, - "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", - "description": "this will be in the Chrome web store: must be 132 characters or less" - }, - "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", - "description": "Appears aside each filter list in the _3rd-party filters_ pane" - }, - "dashboardName": { - "message": "uBO Lite — Dashboard", - "description": "English: uBO Lite — Dashboard" - }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, - "settingsPageName": { - "message": "Settings", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Filter lists", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" - }, - "aboutPageName": { - "message": "About", - "description": "appears as tab name in dashboard" - }, - "aboutPrivacyPolicy": { - "message": "Privacy policy", - "description": "Link to privacy policy on GitHub (English)" - }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" - }, - "popupTipReport": { - "message": "Report an issue on this website", - "description": "Tooltip used for the 'chat' icon in the panel" - }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." - }, - "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, - "popupLessButton": { - "message": "Less", - "description": "Label to be used to hide popup panel sections" - }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupDefault": { - "message": "Default", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupAds": { - "message": "Ads", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupPrivacy": { - "message": "Privacy", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupMalware": { - "message": "Malware domains", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupAnnoyances": { - "message": "Annoyances", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupMisc": { - "message": "Miscellaneous", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupRegions": { - "message": "Regions, languages", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" - }, - "aboutChangelog": { - "message": "Changelog", - "description": "" - }, - "aboutCode": { - "message": "Source code (GPLv3)", - "description": "English: Source code (GPLv3)" - }, - "aboutContributors": { - "message": "Contributors", - "description": "English: Contributors" - }, - "aboutSourceCode": { - "message": "Source code", - "description": "Link text to source code repo" - }, - "aboutTranslations": { - "message": "Translations", - "description": "Link text to translations repo" - }, - "aboutFilterLists": { - "message": "Filter lists", - "description": "Link text to uBO's own filter lists repo" - }, - "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", - "description": "Shown in the About pane" - }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " - }, - "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", - "description": "The header text for the default filtering mode section" - }, - "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", - "description": "This describes the default filtering mode setting" - }, - "filteringMode0Name": { - "message": "no filtering", - "description": "Name of blocking mode 0" - }, - "filteringMode1Name": { - "message": "basic", - "description": "Name of blocking mode 1" - }, - "filteringMode2Name": { - "message": "optimal", - "description": "Name of blocking mode 2" - }, - "filteringMode3Name": { - "message": "complete", - "description": "Name of blocking mode 3" - }, - "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", - "description": "This describes the 'basic' filtering mode" - }, - "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", - "description": "This describes the 'optimal' filtering mode" - }, - "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", - "description": "This describes the 'complete' filtering mode" - }, - "behaviorSectionLabel": { - "message": "Behavior", - "description": "The header text for the 'Behavior' section" - }, - "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", - "description": "Label for a checkbox in the options page" - } -} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ar/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ar/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ar/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ar/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,131 +4,67 @@ "description": "extension name." }, "extShortDesc": { - "message": "حاجب محتوى تجريبي وبلا أذونات. يحجب الإعلانات والمتتبعات والمعدنات والكثير فوراً عند التثبيت.", + "message": "أداة فعالة لحجب المحتوى. تحجب الإعلانات والمتتبعين والمعدنين وغير ذلك فور تثبيتها.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "شروط {{ruleCount}} محولة من مصفيّات الشبكة لـ {{filterCount}}", + "message": "{{ruleCount}} قواعد، محولة من {{filterCount}} فلاتر الشبكة", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "لوحة التحكم", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "تنبيه! لديك تغييرات لم تقم بحفظها", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "إبقى", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "تجاهل", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "الإعدادات", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "قوائم المصفيّات", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "الفلاتر الخاصة بي", + "customFiltersPageName": { + "message": "فلاتر مخصصة", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "المواقع الموثوقة", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "تطوير", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "عن التطبيق", + "message": "حول البرنامج", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { "message": "سياسة الخصوصية", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "عطّل/مكّن uBO Lite لهذه الصفحة", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "افتح لوحة التحكم", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "فعّل طور حذف العناصر", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "فعّل طور اختيار العناصر", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "وضع التصفية", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "على هذا الموقع", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "بلّغ عن مشكلة في هذه الصفحة", + "message": "الإبلاغ عن مشكلة في هذا الموقع", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "اضغط لتجعل تغييراتك دائمة.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "إضغط للتراجع عن تغييراتك.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "افتح لوحة التحكم", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "المزيد", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "اضغط لتمنح uBO Lite أذونات إضافية في هذه الصفحة.\nتتيح الأذونات الإضافية حجب محتوى أكثر فاعلية.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "اضغط لتتراجع عن منح الأذونات الإضافية في هذه الصفحة", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "أقل", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "أظهر عدد الطلبات المحجوبة على الأيقونة", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "المظهر", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "المظهر", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "لون التمييز المخصص", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "احجب تقارير CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "مكّن التصفية الإضافية لكل المواقع", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "يمكن لـ uBO Lite تطبيق تصفية موسعة على موقع ويب معين فقط بعد منح أذونات الامتداد صراحة لتعديل البيانات الموجودة على هذا الموقع. يسمح لك هذا الإعداد بمنح أذونات للتصفية الموسعة لجميع مواقع الويب مرة واحدة.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "افتراضي", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "اعلانات", + "message": "إعلانات", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "نطاقات البرامج الضارة", + "message": "الحماية من البرامج الضارة، الأمان", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,44 +87,20 @@ "message": "المناطق واللغات", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "استيراد وإلحاق", - "description": "English: Import and append" - }, - "1pExport": { - "message": "تصدير", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "استيراد واضافة", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "تصدير", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "استيراد / تصدير", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "الصق هنا فلاتر تجميلية محددة لإضافتها", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "سجل التغييرات", "description": "" }, "aboutCode": { - "message": "شفرة المصدر (GPLv3)", + "message": "كود المصدر (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -196,7 +108,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "شيفرة المصدر", + "message": "كود المصدر", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -204,75 +116,299 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "قوائم الفلاتر", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "التبعيات الخارجية (متوافقة مع GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "تأكيد", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "حفظ التغييرات", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "تراجع", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "الإبلاغ عن مشكلة في الفلاتر", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "الإبلاغ عن مشكلات التصفية الخاصة بمواقع الويب المحددة إلىuBlockOrigin/uAssetsمتتبع المشكلةيتطلب حساب GitHub", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "معلومات استكشاف وإصلاح الأخطاء", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "لتجنب تحميل المتطوعين بتقارير مكررة، يرجى التأكد من أن المشكلة لم يتم الإبلاغ عنها بالفعل.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "العثور على تقارير مماثلة", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "عنوان صفحة الويب:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "صفحة الويب…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "— اختر إدخالًا —", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "يظهر الإعلانات أو بقايا الإعلانات", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "يحتوي على تراكبات أو إزعاجات أخرى", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "يكتشف uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "لديه مشاكل متعلقة بالخصوصية", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "تعطل عند تفعيل uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "يفتح علامات تبويب أو نوافذ غير مرغوب فيها", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "يؤدي إلى برامج ضارة وتصيد احتيالي", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "تصنيف صفحة الويب على أنها \"NSFW\" (\"غير آمنة للعمل\")", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "إنشاء تقرير جديد علي GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "وضع التصفية الافتراضي", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "سيتم تجاوز وضع التصفية الافتراضي بواسطة أوضاع التصفية الخاصة بكل موقع ويب. يمكنك ضبط وضع التصفية على أي موقع ويب وفقًا للوضع الذي يعمل بشكل أفضل على ذلك الموقع. لكل وضع مزاياه وعيوبه.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "لا تصفية", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "أساسي", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "الأفضل", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "مكتمل", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "تصفية الشبكة الأساسية من قوائم التصفية المحددة.\n\nلا يتطلب إذنًا لقراءة البيانات وتعديلها على مواقع الويب.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "تصفية الشبكة المتقدمة بالإضافة إلى تصفية موسعة محددة من قوائم التصفية المحددة.\n\nيتطلب إذنًا واسعًا لقراءة البيانات وتعديلها على جميع مواقع الويب.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "تصفية الشبكة المتقدمة بالإضافة إلى تصفية موسعة محددة وعامة من قوائم التصفية المحددة.\n\nيتطلب إذنًا واسعًا لقراءة البيانات وتعديلها على جميع مواقع الويب.\n\nقد تؤدي التصفية الموسعة العامة إلى زيادة استخدام موارد صفحة الويب.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "قائمة المواقع الإلكترونية التي لن يتم تصفية محتواها.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[أسماء النطاقات الرئيسية فقط]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "السلوك", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "إعادة تحميل الصفحة تلقائيًا عند تغيير وضع التصفية", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "إظهار عدد الطلبات المحظورة على أيقونة شريط الأدوات", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "تمكين الحظر الصارم", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "سيتم حظر الانتقال إلى المواقع غير المرغوب فيها، وسيُعرض عليك خيار المتابعة.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "وضع المطور", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "يتيح الوصول إلى الميزات المناسبة للمستخدمين التقنيين.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "النسخ الاحتياطي", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "قم بنسخ الإعدادات المخصصة احتياطيًا إلى ملف، أو استعادة الإعدادات المخصصة من ملف.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "ستؤدي عملية الاستعادة إلى استبدال جميع إعداداتك المخصصة الحالية.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "البحث عن القوائم", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "الصفحة محجوبة", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "لقد منع uBO Lite تحميل الصفحة التالية:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "تم حظر الصفحة بسبب وجود فلتر مطابق في {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "الصفحة المحظورة تريد إعادة التوجيه إلى موقع آخر. إذا اخترت المتابعة، فسوف تنتقل مباشرة إلى: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "دون معلمات", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "رجوع", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "إغلاق هذه النافذة", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "لا تحذرني مرة أخرى من هذا الموقع", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "متابعة", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "إزالة عنصر", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "خروج من وضع مزيل العناصر", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "أنشئ تصفية مخصّصة", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "أزِل التصفية المخصّصة", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "عرض:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "تفاصيل وضع التصفية", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "قواعد DNR مخصصة", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "قواعد DNR لـ …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "مجموعة قواعد متغيرة", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "مجموعة قواعد جَلسة", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "حفظ", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "إرجاع", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "أضِف", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "استيراد وإلحاق…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "تصدير…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "نسخ احتياطي…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "استعادة…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "لا تضف محتوى من مصادر غير موثوقة", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "عدد القواعد المسجلة: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "حرك الشريط لتحديد أفضل تطابق", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "اختيار", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "معاينة", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "إنشاء", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "اختر تصفية أدناه لتمييز العناصر المطابقة في صفحة الويب. انقر على سلة المهملات لإزالة التصفية.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/az/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/az/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/az/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/az/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "İcazəyə ehtiyac duymayan məzmun əngəlləyicisi. Reklamları, izləyiciləri, və daha çoxunu quraşdırmadan dərhal sonra əngəlləyir.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,224 +12,184 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — İdarəetmə paneli", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "Tənzimləmələr", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Haqqında", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Məxfilik siyasəti", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "İdarəetmə panelini aç", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "Daha çox", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Daha az", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Standart", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Reklamlar", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Məxfilik", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Zəhlətökən elementlər", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "Müxtəlif", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Bölgələr, dillər", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Dəyişikliklər siyahısı", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Mənbə kodu (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Töhfə verənlər", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Mənbə kodu", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Tərcümələr", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Filtr siyahıları", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/be/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/be/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/be/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/be/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -8,40 +8,24 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} правілаў, сканвертаваных з {{filterCount}} сеткавых фільтраў", + "message": "Правілы (колькасць: {{ruleCount}}), якія пераўтвораны з сеткавых фільтраў (колькасць: {{filterCount}})", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "uBO Lite — Панэль кіравання", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Увага! Ёсць незахаваныя змены", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Застацца", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Iгнараваць", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Налады", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Спісы фільтраў", + "customFiltersPageName": { + "message": "Уласныя фільтры", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Мае фільтры", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Давераныя сайты", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Распрацоўка", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Пра пашырэнне", @@ -51,78 +35,30 @@ "message": "Палітыка прыватнасці", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Адключыць/уключыць uBO Lite для гэтага сайта", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Адкрыць панэль кіравання", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Перайсці ў рэжым імгненнага хавання элементаў", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Перайсці ў рэжым выбару элементаў", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "рэжым фільтравання", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "На гэтым сайце", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Паведаміць аб праблеме з сайтам", + "message": "Паведаміць пра праблему на гэтым вэб-сайце", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Націсніце, каб захаваць змены.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Націсніце, каб скасаваць змены.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Адкрыць панэль кіравання", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Больш", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Націсніце, каб даць uBO Lite пашыраныя дазволы на гэтым сайце.\nПашыраныя дазволы дазваляюць эфектыўней блакаваць змесціва.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Націсніце, каб адклікаць пашыраныя дазволы на гэтым сайце", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Менш", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Паказваць колькасць заблакаваных запытаў на значцы", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Выгляд", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Тэма", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Уласны колеравы акцэнт", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Блакаваць справаздачы CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Уключыць пашыраную фільтрацыю на ўсіх вэб-сайтах", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite можа прымяняць пашыраную фільтрацыю на пэўным сайце толькі пасля таго, як вы яўна дасце пашырэнню дазвол на змяненне звестак на гэтым сайце. Гэтая налада дазваляе выдаць дазвол на пашыраную фільтрацыю на ўсіх сайтах адначасова.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Прадвызначана", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Рэгіёны, мовы", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Адзін фільтр на радок. Фільтрам можа быць адрас сайта або сумяшчальны з EasyList фільтр. Радкі, што пачынаюцца з !, будуць праігнараваны.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Імпартаваць і дадаць", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Экспартаваць", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Дырэктывы давераных сайтаў указваюць, на якіх вэб-старонках uBO Lite павінен быць выключаны. Адзін запіс на радок.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Імпартаваць і дадаць", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Экспартаваць", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Імпартаваць/экспартаваць", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Журнал змяненняў", @@ -211,25 +123,73 @@ "message": "Вонкавыя залежнасці (GPLv3-сумяшчальныя):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Пацвердзіць", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Ужыць змяненні", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Вярнуць", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Вітаем", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Вы толькі што ўсталявалі uBO Lite. Тут вы можаце выбраць прадвызначаны рэжым фільтравання для ўсіх вэб-сайтаў.\n\nКалі не ўказана іншае, выбраны базавы рэжым, бо ён не патрабуе дазволаў на чытанне і змяненне звестак. Калі вы давяраеце uBO Lite, можаце даць яму шырэйшыя дазволы на чытанне і змяненне звестак на ўсіх вэб-сайтах, каб зрабіць магчымымі больш прасунутыя функцыі фільтравання прадвызначана на ўсіх вэб-сайтах.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Паведаміць пра праблему з фільтрам", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Паведамляйце пра праблемы з фільтрамі, датычныя канкрэтных вэб-сайтаў, праз трэкер праблемuBlockOrigin/uAssets . Патрэбны ўліковы запіс GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Дыягнастычныя звесткі", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Каб не абцяжарваць добраахвотнікаў дубляванымі справаздачамі, калі ласка, пераканайцеся, што пра гэтую праблему не паведамлялі раней.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Знайсці падобныя справаздачы", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адрас вэб-старонкі:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Вэб-старонка…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Выберыце праблему --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Паказвае рэкламу або яе астачу", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Мае накладкі або іншыя недарэчнасці", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Выяўляе uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Мае праблемы, датычныя прыватнасці", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Няспраўнасці пры ўключаным uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Адкрывае непажаданыя карткі або вокны", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Вядзе да шкодных праграм, фішынгу", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Пазначыць вэб-старонку як “NSFW” (“небяспечна для працы”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Стварыць новую справаздачу", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Прадвызначаны рэжым фільтравання", @@ -267,6 +227,14 @@ "message": "Пашыранае сеткавае фільтраванне плюс дакладнае і агульнае пашыранае фільтраванне па выбраных спісах фільтраў.\n\nПатрабуе шырокі дазвол на чытанне і змяненне звестак на ўсіх вэб-сайтах.\n\nАгульнае пашыранае фільтраванне можа прывесці да павышанага спажывання рэсурсаў вэб-старонкі.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Спіс назваў хостаў, для якіх не будзе праводзіцца фільтраванне", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[толькі назвы вузлоў]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Паводзіны", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Аўтаматычна абнаўляць старонку пры змене рэжыму фільтравання", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Паказваць колькасць заблакаваных запытаў на значку панэлі інструментаў", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Уключыць строгае блакаванне", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Пераход да патэнцыйна непажаданых сайтаў будзе заблакаваны, і вам будзе прапанавана магчымасць працягнуць.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Рэжым распрацоўніка", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Забяспечвае доступ да функцый, прыдатным для тэхнічных карыстальнікаў.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Знайсці спісы", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Старонка заблакаваная", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite папярэдзіў чытанне наступнай старонкі:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Старонка была заблакаваная, бо трапіла ў фільтр праз {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Заблакаваная старонка мае намер перанакіраваць на іншы сайт. Калі вырашыце працягнуць, вы пяройдзеце непасрэдна на: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "без параметраў", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Вярнуцца", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Закрыць гэтае акно", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Не папярэджваць больш пра гэты сайт", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Працягнуць", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Перайсці ў рэжым імгненнага хавання элементаў", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Выйсці з рэжыму імгненнага хавання элементаў", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Стварыць уласны фільтр", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Выдаліць уласны фільтр", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Выгляд", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Падрабязныя звесткі аб рэжыме фільтрацыі", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Уласныя правілы DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Правілы у DNR", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Дынамічны набор правілаў", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Набор правілаў сеансу", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Захаваць", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Вярнуць", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Дадаць", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Імпартаваць ды дадаць…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Экспартаваць…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Не дадавайце кантэнт з ненадзейных крыніц", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Колькасць зарэгістраваных правілаў: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Перасуньце паўзунок, каб выбраць найлепшы варыянт", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Выбраць", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Папярэдні прагляд", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Стварыць", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Выберыце фільтр ніжэй, каб вылучыць адпаведныя элементы на старонцы. Націсніце на кошык, каб выдаліць фільтр.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bg/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bg/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bg/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bg/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Експериментален блокер за съдържание без разрешения. Блокира реклами, тракери, миньори и други веднага след инсталирането.", + "message": "Блокиране на съдържание без разрешение. Блокира реклами, тракери, миньори и други веднага след инсталирането.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Табло", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Внимание! Има незапазени промени", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Оставане", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Игнориране", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Настройки", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Списъци с филтри", + "customFiltersPageName": { + "message": "Персонализирани филтри", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Мои филтри", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Доверени сайтове", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Разработка", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Относно", @@ -51,78 +35,30 @@ "message": "Политика за поверителност", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Изключва/включва uBO Lite за този сайт", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Табло с настройки", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Временно блокиране на отделен елемент", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Блокиране на отделен елемент", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "режим на филтриране", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "На този уебсайт", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Докладване на проблем с този уебсайт", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Щракнете, за да направите промените постоянни.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Щракнете, за да отмените направените промени.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Табло с настройки", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Още", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Щракнете, за да предоставите на uBO Lite разширени разрешения за този сайт.\nРазширените разрешения позволяват по-ефективно блокиране на съдържанието.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Щракнете, за да отмените разширените разрешения за този сайт", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "По-малко", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Показване на брояч в иконката за блокираните заявки", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Външен вид", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Тема", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Потребителски цвят на акцента", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Блокиране на CSP отчетите", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Активиране на разширеното филтриране на всички уебсайтове", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite може да приложи разширено филтриране на даден уебсайт само след като изрично предоставите разрешения на разширението за промяна на данни на този уебсайт. Тази настройка ви позволява да предоставите разрешения за разширено филтриране на всички уебсайтове наведнъж.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Стандартни", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Региони, езици", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Един филтър на ред. Това може да бъде обикновен адрес или филтър, съвместим с EasyList. Редовете с представка ! ще бъдат игнорирани.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Внасяне от файл", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Изнасяне във файл", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-мои-филтри_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Указанията за доверени сайтове определят кои уеб страници трябва да бъдат изключени от uBO Lite. По един запис на ред.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Внасяне от файл", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Изнасяне във файл", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-доверени_сайтове_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Импортиране / експортиране", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Поставете тук конкретни козметични филтри, които искате да добавите", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Списък с промени", @@ -211,25 +123,73 @@ "message": "Външни зависимости (съвместими с GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Изпращане", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Прилагане на промените", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Връщане", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Добре дошли", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Току-що инсталирахте uBO Lite. Тук можете да изберете режима на филтриране по подразбиране, който да се използва за всички уебсайтове.\n\nПо подразбиране е избран основен режим, тъй като той не изисква разрешение за четене и промяна на данни. Ако се доверите на uBO Lite, можете да му дадете широко разрешение да чете и променя данни на всички уебсайтове, за да активирате по-разширени възможности за филтриране за всички уебсайтове по подразбиране.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Докладване на проблем с филтъра", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Докладвайте за проблеми с филтрирането на конкретни уебсайтове в uBlockOrigin/uAssets за проследяване на проблеми. Изисква се акаунт в GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Информация за отстраняване на неизправности", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "За да се избегне натоварването на доброволците с дублиращи се доклади, моля, проверете дали проблемът вече не е докладван.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Намиране на подобни доклади", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адрес на уеб страницата:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Уеб страницата...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Изберете --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Показва реклами или остатъци от реклами", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Има наслагвания или други неудобства", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Засича uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Има проблеми, свързани с поверителността", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Неправилно функциониране, когато uBO Lite е активиран", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Отваря нежелани раздели или прозорци", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Води до зловреден софтуер, фишинг", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Маркиране на уебстраницата като \"NSFW\" (\"Не е безопасно за работа\")", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Създаване на нов доклад", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Режим на филтриране по подразбиране", @@ -267,6 +227,14 @@ "message": "Разширено мрежово филтриране и специфично и общо разширено филтриране от избрани списъци с филтри.\n\nИзисква широко разрешение за четене и промяна на данни във всички уебсайтове.\n\nОбщото разширено филтриране може да доведе до по-голямо използване на ресурси от уебстраницата.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Списък с имена на хостове, за които няма да се извършва филтриране.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[само имена на хостове]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведение", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Автоматично презареждане на страницата при промяна на режима на филтриране", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показване на брояч в иконката за блокираните заявки", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Активиране на строгото блокиране", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Навигацията към потенциално нежелани сайтове ще бъде блокирана и ще ви бъде предложена възможността да продължите.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Режим за програмисти", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Активиране на достъпа до функции, подходящи за технически потребители.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Архивиране", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Архивирайте персонализираните си настройки във файл или ги възстановете от файл.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Възстановяването ще презапише всичките ви текущи персонализирани настройки.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Намиране на списъци", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Страницата е блокирана", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite попречи на зареждането на следната страница:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Страницата е блокирана поради съвпадащ филтър в {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Блокираната страница иска да ви пренасочи към друг сайт. Ако изберете да продължите, ще преминете директно към: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "без параметри", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Назад", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Затворяне на прозореца", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Не ме предупреждавайте отново за този сайт", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Продължаване", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Влизане в режима на временно скриване на елемента", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Излизане от режима на временно скриване на елемента", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Създаване на персонализиран филтър", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Премахване на потребителски филтър", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Преглед:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Подробности за режима на филтриране", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Потребителски правила на DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Правила на DNR за ...", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Динамичен набор от правила", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Набор от правила на сесията", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Запазване", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Връщане", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Добавяне", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Импортиране и добавяне…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Експортиране…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Архивиране…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Възстановяване…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Не добавяйте съдържание от ненадеждни източници", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Брой регистрирани правила: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Преместете плъзгача, за да изберете най-подходящото съответствие", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Избор", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Преглед", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Създаване", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Изберете филтър по-долу, за да маркирате съвпадащите елементи в уеб страницата. Кликнете върху кошчето, за да премахнете филтъра.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bn/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bn/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bn/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bn/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "একটি পরীক্ষামূলক, অনুমতিহীন কন্টেন্ট নিষিদ্ধকারক। বিজ্ঞাপন, অনুসরণকারী, খননকারী, এবং আরো জিনিস নিষিদ্ধ করো ইন্সটলের সাথে সাথেই।", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,179 +12,91 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — ড্যাশবোর্ড", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "সেটিংস", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "সম্পর্কে", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "গোপনীয়তার নীতিমালা", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "ফিল্টারিং মোড", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "এই ওয়েবসাইট নিয়ে সমস্যা জানাও", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "ড্যাশবোর্ড খুলুন", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "আরো", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "কম", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "পূর্ব-নির্ধারিত", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "বিজ্ঞাপন", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "গোপনীয়তা", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "ম্যালওয়্যার ডোমেইন", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "বিরক্তি", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "বিবিধ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "অঞ্চল, ভাষা", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "পরিবর্তনসূচি", "description": "" }, "aboutCode": { @@ -192,87 +104,311 @@ "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "অবদানকারী", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "উৎস কোড", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "অনুবাদসমূহ", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "ছাঁকন তালিকা", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "বাহ্যিক নির্ভরতা (GPLv3-সামঞ্জস্যপূর্ণ):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "ছাঁকনি নিয়ে সমস্যা জানাও", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "নির্দিষ্ট ছাঁকনি বিষয়ক সমস্যা এখানে জানাও uBlockOrigin/uAssets সমস্যা ট্র্যাকার. গিটহাব অ্যাকাউন্ট প্রয়োজন।", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "সমস্যা সমাধানের তথ্য", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "একই প্রতিবেদন দুইবার এড়াতে ও স্বেচ্ছাসেবকদের বোঝা কমাতে, অনুগ্রহ করে যাচাই করো যে সমস্যাটি ইতিমধ্যে জানানো হয়নি।", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "একই রকম অভিযোগ দেখ", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "ওয়েবপৃষ্ঠার ঠিকানা:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "ওয়েবপৃষ্ঠা…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- একটি ভুক্তি নির্বাচন করো --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "বিজ্ঞাপন বা বিজ্ঞাপনের অবশিষ্টাংশ দেখায়", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "ওভারলে বা অন্যান্য উপদ্রব আছে", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "ইউবিও লাইট শনাক্ত করে", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "গোপনীয়তা-সম্পর্কিত সমস্যা আছে", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "ইউবিও লাইট চালু করলে সমস্যা হয়", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "অবাঞ্ছিত ট্যাব বা জানালা খুলে", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "ব্যাডওয়্যার, প্রতারণমূলক জায়গায় নেয়", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "ওয়েব পৃষ্ঠাটিকে “NSFW” হিসাবে চিহ্নিত করুন (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "নতুন অভিযোগ", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "ডিফল্ট ফিল্টারিং মোড", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "ডিফল্ট ফিল্টারিং মোড প্রতি-ওয়েবসাইটে ফিল্টারিং মোড দ্বারা ওভাররাইড করা হবে। আপনি যে কোনও ওয়েবসাইটে ফিল্টারিং মোড সামঞ্জস্য করতে পারেন যা সেই ওয়েবসাইটে সবচেয়ে ভাল কাজ করে। প্রতিটি মোড এর সুবিধা এবং অসুবিধা আছে।", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "ফিল্টারিং নেই", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "মৌলিক", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "কার্যকরী", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "সম্পূর্ণ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "নির্বাচিত ফিল্টার তালিকা থেকে মৌলিক নেটওয়ার্ক ফিল্টারিং।\n\nওয়েবসাইটগুলোতে ডেটা পড়তে এবং পরিবর্তন করার জন্য অনুমতির প্রয়োজন হয় না।", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "উন্নত নেটওয়ার্ক ফিল্টারিং এবং নির্বাচিত ফিল্টার তালিকা থেকে নির্দিষ্ট বর্ধিত ফিল্টারিং।\n\nসকল ওয়েবসাইটের ডেটা পড়তে এবং পরিবর্তন করার জন্য বিস্তৃত অনুমতির প্রয়োজন৷", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "উন্নত নেটওয়ার্ক ফিল্টারিং এবং নির্বাচিত ফিল্টার তালিকা থেকে নির্দিষ্ট এবং জেনেরিকের বর্ধিত ফিল্টারিং।\n\nসকল ওয়েবসাইটে ডেটা পড়তে এবং পরিবর্তন করার জন্য বিস্তৃত অনুমতির প্রয়োজন৷\n\nজেনেরিক বর্ধিত ফিল্টারিং উচ্চতর ওয়েবপেজ সম্পদসমূহের ব্যবহারের কারণ হতে পারে।", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "হোস্টনেমের তালিকা যেগুলোর কোনো ফিল্টারিং হবে না", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "আচরণ", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "ফিল্টারিং মোড পরিবর্তন করার সময় স্বয়ংক্রিয়ভাবে পুনরায় লোড করুন", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "কতগুলো অনুরোধ অবরুদ্ধ করা হয়েছে তা টুলবার আইকনে দেখাও", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "কঠোর অবরোধ চালু করো", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "সম্ভাব্য অযাচিত ওয়েবসাইট অবরুদ্ধ করা হবে, আর সেখানে আগানোর উপায় দেওয়া থাকবে।", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "ডেভেলপার মোড", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "প্রযুক্তিগত ব্যবহারকারীদের জন্য উপযুক্ত বৈশিষ্ট্যগুলিতে অ্যাক্সেস সক্ষম করুন", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "তালিকা খুঁজো", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "পাতা অবরুদ্ধ", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "ইউবিও লাইট এই পাতা লোড হওয়া আটকিয়েছে:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "{{listname}} এর একটি ছাঁকনির জন্য এই পাতাটি অবরুদ্ধ করা হয়েছে।", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "এই অবরুদ্ধ পাতাটি আরেকটি ওয়েবসাইটে নেয়। এগিয়ে যেতে চাইলে, সরাসরি এই জায়গায় যাবে: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "প্যারামিটার নেই", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "ফিরে যাও", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "জানালা বন্ধ করো", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "এই সাইট নিয়ে পুনরায় সতর্ক করবে না", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "এগিয়ে যাও", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "এলিমেন্ট জ্যাপার মোডে প্রবেশ করুন", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "সেভ করুন", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,414 @@ +{ + "extName": { + "message": "uBlock Origin Lite", + "description": "extension name." + }, + "extShortDesc": { + "message": "Ur stanker saotradurioù hep aotre ebet rekis. Stankañ a ra bruderezh, heulierien, minerien ha kalz muioc'h kerkent ha m'eo staliet.", + "description": "this will be in the Chrome web store: must be 132 characters or less" + }, + "perRulesetStats": { + "message": "{{ruleCount}} reolenn, amdroet diwar {{filterCount}} sil rouedad", + "description": "Appears aside each filter list in the _3rd-party filters_ pane" + }, + "dashboardName": { + "message": "uBO Lite — Taolenn-vourzh", + "description": "English: uBO Lite — Dashboard" + }, + "settingsPageName": { + "message": "Arventennoù", + "description": "appears as tab name in dashboard" + }, + "customFiltersPageName": { + "message": "Siloù personelaet", + "description": "appears as tab name in dashboard" + }, + "developPageName": { + "message": "Diorren", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" + }, + "aboutPageName": { + "message": "Diwar-benn", + "description": "appears as tab name in dashboard" + }, + "aboutPrivacyPolicy": { + "message": "Politikerezh ar vuhez prevez", + "description": "Link to privacy policy on GitHub (English)" + }, + "popupFilteringModeLabel": { + "message": "mod silañ", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "War al lec'hienn-mañ", + "description": "Label in the popup panel for the local tools section" + }, + "popupTipReport": { + "message": "Danevelliñ ur gudenn war al lec'hienn-mañ", + "description": "Tooltip used for the 'chat' icon in the panel" + }, + "popupTipDashboard": { + "message": "Digeriñ an daolenn-vourzh", + "description": "English: Click to open the dashboard" + }, + "popupMoreButton": { + "message": "Muioc'h", + "description": "Label to be used to show popup panel sections" + }, + "popupLessButton": { + "message": "Nebeutoc'h", + "description": "Label to be used to hide popup panel sections" + }, + "3pGroupDefault": { + "message": "Dre ziouer", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAds": { + "message": "Bruderezh", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupPrivacy": { + "message": "Buhez prevez", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMalware": { + "message": "Gwarez a-enep ar malware ha surentez", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAnnoyances": { + "message": "Saotradurioù", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMisc": { + "message": "A bep seurt", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupRegions": { + "message": "Rannvroioù, broioù", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "customFiltersImportExportLabel": { + "message": "Enporzhiañ / Ezporzhiañ", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Eilañ amañ ar siloù kenedel resis da ouzhpennañ", + "description": "Placeholder text which describes the purpose of the textarea widget" + }, + "aboutChangelog": { + "message": "Deizlevr ar cheñchamantoù", + "description": "" + }, + "aboutCode": { + "message": "Kod mammenn (GPLv3)", + "description": "English: Source code (GPLv3)" + }, + "aboutContributors": { + "message": "Kenlabourerien", + "description": "English: Contributors" + }, + "aboutSourceCode": { + "message": "Kod mammenn", + "description": "Link text to source code repo" + }, + "aboutTranslations": { + "message": "Treiñ", + "description": "Link text to translations repo" + }, + "aboutFilterLists": { + "message": "Rolloù ar siloù", + "description": "Link text to uBO's own filter lists repo" + }, + "aboutDependencies": { + "message": "Dalc'hioù diavaez (a glot gant GPLv3)", + "description": "Shown in the About pane" + }, + "supportS6H": { + "message": "Danevelliñ ur gudenn gant ur sil", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Danevellit kudennoù ar siloù e lec'hiennoù resis e-barzh uBlockOrigin/uAssets roll evezhiañ kudennoù. Ur c'hont GitHub zo rekis.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Titouroù diagnostikañ kudennoù", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Evit nompas sammañ ar genlabourerien a-youl vat gant meur a zanevell heñvel, gwiriit ma n'eo ket bet danevellet ho kudenn en a-raok mar plij. Notenn: ma klikit ar bouton e vo kaset anv herberc'hier ar bajenn da c'h-GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Klask danevelloù koulz ha homañ", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Chomlec'h ar bajenn web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Ar bajenn web-mañ…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Dibab ur seurt --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Diskouez a ra bruderezh pe restachoù bruderezh", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Gwiskadoù pe saotradurioù all en deus", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Diguzhat a ra uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Kudennoù a-fed ar vuhez prevez he deus", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Ne ya ket mat en-dro p'eo enaouet uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Digeriñ a ra ivinelloù pe prenestroù noazus", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Kas a ra da veziantoù droukyoulet pe d'an higennañ niverel", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Merkañ ar bejenn web evel \"NSFW\" (“Not Safe For Work”, dizereat evit al labour)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Sevel ur rentañ-kont nevez", + "description": "Text for button which open an external webpage in Support pane" + }, + "defaultFilteringModeSectionLabel": { + "message": "Mod silañ dre ziouer", + "description": "The header text for the default filtering mode section" + }, + "defaultFilteringModeDescription": { + "message": "Ar mod silañ dre ziouer a vo erlec'hiet gant modoù silañ zo evit lec'hiennoù resis. Gallout a rit aozañ ar mod silañ war bep seurt lec'hienn evit ma vo diouzh al lec'hiennoù-se. Pep mod en deus e duioù fall ha mat.", + "description": "This describes the default filtering mode setting" + }, + "filteringMode0Name": { + "message": "Tamm silañ ebet", + "description": "Name of blocking mode 0" + }, + "filteringMode1Name": { + "message": "diazez", + "description": "Name of blocking mode 1" + }, + "filteringMode2Name": { + "message": "ar gwellañ", + "description": "Name of blocking mode 2" + }, + "filteringMode3Name": { + "message": "klok", + "description": "Name of blocking mode 3" + }, + "basicFilteringModeDescription": { + "message": "Silañ diazez ar rouedad diouzh ar rolloù siloù diuzet.\n\nN'eus ket ezhomm a aotre evit lenn hag aozañ roadennoù el lec'hiennoù.", + "description": "This describes the 'basic' filtering mode" + }, + "optimalFilteringModeDescription": { + "message": "Silañ rouedad araokaet ha silañ amplaet termenet diouzh ar rolloù siloù bet dibabet.\n\nRet eo reiñ aotreoù ouzhpenn a-benn lenn ha kemmañ roadennoù en holl lec'hiennoù.", + "description": "This describes the 'optimal' filtering mode" + }, + "completeFilteringModeDescription": { + "message": "Silañ rouedad araokaet ha silañ amplaet resis ha hollek diouzh ar rolloù siloù diuzet.\n\nRet eo reiñ aotreoù ouzhpenn a-benn lenn ha kemmañ roadennoù en holl lec'hiennoù.\n\nGant ar silañ amplaet hollek e c'hallfe ar bajenn web implijout muioc'h a zanvezioù.", + "description": "This describes the 'complete' filtering mode" + }, + "noFilteringModeDescription": { + "message": "Roll anvioù domanioù ha ne vint ket silet.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[anvioù herberc'hierien hepken]\nskouer.com\nchoariou.skouer\n...", + "description": "Default text for in edit field" + }, + "behaviorSectionLabel": { + "message": "Emzalc'h", + "description": "The header text for the 'Behavior' section" + }, + "autoReloadLabel": { + "message": "Adkargañ ar bajenn ent-emgefreek pa vez cheñchet an doare silañ", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Diskouez an niver a rekedoù bet stanket war arouez ar varrenn-ostilhoù", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enaouiñ ar stankañ strizh", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Stanket e vo ar merdeiñ etrezek lec'hiennoù a c'hallfe bezañ dañjerus, ha moaien a vo deoc'h dibab da genderc'hel pe get.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Mod diorroer", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Gweredekaat a ra ar fonksionelezhioù azasaet d'an implijerien deknikel.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Gwared", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Kavout rolloù", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Pajenn stanket", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite en deus miret ar bajenn-mañ da gargañ:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Stanket eo bet ar bajenn abalamour d'ur sil dereat e-barzh {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Ar bajenn stanket a fell dezhi adkas d'ul lec'hienn all. M'ho peus c'hoant da genderc'hel e vioc'h kaset d'ar chomlec'h-mañ: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "kuit a arventennoù", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Distreiñ", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Serriñ ar prenestr-mañ", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Arabat kemenn din diwar-benn al lec'hienn-mañ en-dro", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Kenderc'hel", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Mont er mod \"dilemel elfennoù\"", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Kuitaat ar mod \"dilemel elfennoù\"", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Krouiñ ur sil personelaet", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Lemel ur sil personelaet", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Gwelet:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Munudoù ar mod silañ", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Reolennoù DNR personelaet", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Reolennoù DNR eus …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Hollad reolennoù dinamek", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Hollad reolennoù an estez", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Enrollañ", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Nullañ", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Ouzhpennañ", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Enporzhiañ hag ouzhpennañ", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Ezporzhiañ", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Gwarediñ…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Arabat ouzhpennañ danvez a zeu diouzh mammennoù douetus.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Niver a reolennoù marilhet: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Dibunit ar reti evit diuzañ ar pezh a glot ar muiañ", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Diuzañ", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Rakwel", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Krouiñ", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Diuzit ur sil amañ-dindan evit sklêrijennañ an elfennoù kendere er bajenn web. Klikit ar pod-lastez evit lemel ur sil.", + "description": "Summary description on how to use the tool to remove custom filters" + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bs/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bs/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/bs/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bs/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — Nadzorna Ploča", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Upozorenje! Imate nesačuvane izmjene", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Ostanite", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Zanemarite", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Postavke", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Zapis filtera", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Moji filteri", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Pouzdane stranice", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Razvoj", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "O aplikaciji", @@ -51,78 +35,30 @@ "message": "Politika privatnosti", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Uključite/isključite uBO Lite za ovu stranicu", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Otvorite nadzornu ploču", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Uđite u režim rada uklanjanja elementa", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Uđite u režim rada odabiranja elementa", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "način filtriranja", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Na ovoj web stranici", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Prijavite slučaj na ovoj stranici", + "message": "Prijavi problem", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Kliknite kako biste vaše promjene stalne napravili.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kliknite da poništite promjene.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Otvorite nadzornu ploču", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Više", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Kliknite da dodijelite uBO Lite proširene dozvole na ovoj stranici.\nProširene dozvole omogućavaju efikasnije blokiranje sadržaja.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kliknite da opozovete proširene dozvole na ovoj stranici", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Manje", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Pokažite broj blokiranih zahtjeva na oznaci", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Izgled", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Prilagođena glavna boja", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokirajte CSP izvještaje", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Zadano", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regije, jezici", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Jedan filter po redu. Filter može biti obično ime hosta ili filter kompatibilan s EasyList-om. Redovi sa prefiksom ! će biti zanemareni.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Uvezite i dodajte", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Izvezite", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "moji-ublock-statični-filteri_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Smjernice pouzdanih stranica diktiraju na kojim web stranicama treba onemogućiti uBO Lite. Jedan unos po redu.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Uvezite i dodajte", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Izvezite", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "moje-ublock-pouzdane-stranice_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Dnevnik izmjena", @@ -211,68 +123,292 @@ "message": "Vanjske ovisnosti (kompatibilno s GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Potvrdi", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Primijenite izmjene", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Vrati", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Prijavi problem s filterom", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Prijavite probleme s filterima na određenim web stranicama uBlockOrigin/uAssets sistemu za praćenje problema . Potreban je GitHub račun.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informacije o rješavanju problema", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Kako biste izbjegli opterećivanje volontera duplim prijavama, molimo vas da provjerite da problem već nije prijavljen. Napomena: klikom na dugme, porijeklo stranice će biti poslano GitHubu.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Pronađite slične izvještaje na GitHubu", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa web stranice:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Web stranica…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Odaberite unos --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Prikazuje oglase ili ostatke oglasa", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ima prekrivajuće slojeve ili druge smetnje", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detektira uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ima problema s privatnošću", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Kvarovi kada je uBO Lite omogućen", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Otvara neželjene kartice ili prozore", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Vodi do zlonamjernog softvera i phishinga", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Označite web stranicu kao \"NSFW\" ( \"Nije sigurno za rad\" )", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Kreiraj novi izvještaj na GitHubu", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Zadani način filtriranja", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Zadani način filtriranja bit će zamijenjen načinima filtriranja po web stranici. Možete podesiti način filtriranja na bilo kojoj web stranici prema tome koji način rada najbolje funkcionira na toj web stranici. Svaki način rada ima svoje prednosti i nedostatke.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "nema filtriranja", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "osnovno", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "optimalno", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "kompletan", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Osnovno filtriranje mreže iz odabranih lista filtera.\n\nNe zahtijeva dozvolu za čitanje i izmjenu podataka na web stranicama.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Napredno mrežno filtriranje plus specifično prošireno filtriranje sa odabranih lista filtera.\n\nZahtijeva široku dozvolu za čitanje i izmjenu podataka na svim web stranicama.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Napredno mrežno filtriranje plus specifično i generičko prošireno filtriranje sa odabranih lista filtera.\n\nZahtijeva široku dozvolu za čitanje i izmjenu podataka na svim web stranicama.\n\nGeneričko prošireno filtriranje može uzrokovati veću upotrebu resursa web stranice.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista web stranica za koje se neće vršiti filtriranje.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[samo imena hostova]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Ponašanje", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Automatski ponovo učitajte stranicu prilikom promjene načina filtriranja", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Prikažite broj blokiranih zahtjeva na ikoni trake sa alatkama", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Omogući strogo blokiranje", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigacija do potencijalno neželjenih stranica bit će blokirana i bit će vam ponuđena mogućnost da nastavite.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Režim za razvojne programere", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Omogućava pristup funkcijama pogodnim za tehničke korisnike.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Pronađi liste", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Stranica je blokirana", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite je spriječio učitavanje sljedeće stranice:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Stranica je blokirana zbog odgovarajućeg filtera u {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Blokirana stranica želi preusmjeriti na drugu stranicu. Ako odlučite nastaviti, bit ćete direktno na: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametara", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Nazad", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Zatvori ovaj prozor", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ne upozoravaj me više o ovoj stranici", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Nastavite", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Ukloni element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Izlaz iz načina rada za zatvaranje elemenata", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Kreirajte prilagođeni filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Uklonite prilagođeni filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Prikaz:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalji načina filtriranja", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Prilagođena pravila DNR-a", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR pravila …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dinamički skup pravila", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Skup pravila sesije", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Sačuvaj", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Vrati", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Uvezi i dodaj…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Izvoz…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Ne dodavajte sadržaj iz nepouzdanih izvora", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Broj registrovanih pravila: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Pomaknite klizač da biste odabrali najbolje podudaranje", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Odaberite", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Pregled", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Napravi", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Odaberite filter ispod da biste istaknuli odgovarajuće elemente na web stranici. Kliknite na kantu za smeće da biste uklonili filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ca/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ca/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ca/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ca/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — Tauler", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Atenció! Hi ha canvis sense desar", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Roman", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignora", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Configuració", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Llistat de filtres", + "customFiltersPageName": { + "message": "Filtres personalitzats", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Els meus filtres", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Llocs de confiança", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Desenvolupament", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Quant a", @@ -51,78 +35,30 @@ "message": "Política de privadesa", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Desactiva/activa uBO Lite per aquest lloc", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Obre el tauler", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Accedeix al mode d'eliminació d'elements", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Accedeix al mode de selecció d'elements", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "mode de filtre", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "En aquest lloc web", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Informa d'un problema en aquest lloc web", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Feu clic per fer que els vostres canvis siguin permanents.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Feu clic per revertir els canvis.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Obre el tauler", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Més", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Feu clic per concedir permisos ampliats a l'uBO Lite en aquest web.\nEls permisos ampliats permeten un bloqueig de contingut més efectiu.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Feu clic per revocar els permisos ampliats en aquest web", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Menys", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Mostra el nombre de sol·licituds blocades a la icona", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Aparença", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Color d'accent personalitzat", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bloca els informes CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Habilita el filtratge addicional a tots els llocs web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "L'uBO Lite pot aplicar el filtratge estès a un lloc web determinat, només després que concediu permisos al complement per modificar les dades de forma explícita. Aquesta configuració us permet concedir permisos de filtratge estès a tots els llocs web alhora.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Per defecte", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regions, llengües", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Un filtre per línia. Un filtre pot ser un nom d'amfitrió simple o un filtre compatible amb EasyList. Les línies amb el prefix ! seran ignorades.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importa i annexa", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exporta", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Les directives del lloc de confiança dicten en quines pàgines web s'ha de desactivar l'uBO Lite. Una entrada per línia.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importa i annexa", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exporta", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importa/Exporta", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Enganxeu aquí els filtres cosmètics que voleu afegir", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Registre de canvis", @@ -211,25 +123,73 @@ "message": "Dependències externes (compatibles amb GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Envia", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplica els canvis", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Desfés", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Us donem la benvinguda", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Acabeu d'instal·lar l'uBO Lite. Aquí podeu triar el mode de filtrat per defecte per utilitzar-lo a tots els llocs web.\n\nPer defecte, el mode Bàsic està seleccionat perquè no requereix permís per llegir i canviar dades. Si confieu en l'uBO Lite, podeu donar-li un ampli permís per llegir i canviar dades a tots els llocs web per tal d'activar capacitats de filtratge més avançades per a tots els llocs web per defecete.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Informeu d'un problema de filtre", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Informeu d'un problema en llocs web específics mitjançant el uBlockOrigin/uAssets seguiment d'errors. Cal un compte al GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informació de resolució de problemes", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Per a evitar la sobrecàrrega del nostre voluntariat amb informes duplicats, verifiqueu abans que el problema encara no s'ha notificat. Nota: En fer clic, enviareu la pàgina causant al nostre GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Cerca d'informes semblants", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adreça de la pàgina web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "La pàgina web...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Trieu una entrada --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Mostra anuncis o restes d'anuncis", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Té superposicions o altres errors", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detecta l'ús de l'uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Té problemes relacionats amb la privadesa", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "No es mostra correctament amb l'uBO Lite habilitat", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Obre pestanyes o finestres no desitjades", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Condueix a programari maliciós, pesca electrònica", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Etiqueta l'enllaç com a «NSFW» (“No apte per al treball”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Crea un informe nou", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Mode de filtratge per defecte", @@ -267,6 +227,14 @@ "message": "Filtratge de xarxa avançat més un filtratge estès específic i genèric de les llistes de filtres seleccionades.\n\nRequereix un ampli permís per llegir i canviar dades a tots els llocs web.\n\nEl filtratge estès genèric pot provocar un ús més elevat dels recursos de la pàgina web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Llistat de noms d'amfitrió als quals no s'aplicarà cap filtre", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[només noms d'amfitrió]\nexemple.com\njocs.exemple\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportament", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Recarrega automàticament la pàgina quan canvieu el mode de filtratge", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostra el nombre de sol·licituds blocades a la icona de la barra d'eines", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Habilita el blocatge estricte", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Es blocarà la navegació en webs potencialment no desitjables, oferint-vos la possibilitat de continuar.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Mode de desenvolupador", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Habilita l'accés a funcions adequades per a usuaris tècnics.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Còpia de seguretat / Restaura", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Feu una còpia de seguretat de la vostra configuració personalitzada a un fitxer o restaureu la vostra configuració personalitzada des d'un fitxer.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "La restauració sobreescriurà tots els paràmetres personalitzats actuals.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Cerca llistes", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Pàgina blocada", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "L'uBO Lite ha evitat la càrrega d'aquesta pàgina:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "La pàgina s'ha blocat a causa d'un filtre coincident a {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "La pàgina blocada vol redirigir-vos a un altre web diferent. Si continueu, si us reenviarà a: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sense paràmetres", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Enrere", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Tanca aquesta finestra", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "No em tornis a avisar sobre aquest lloc", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Continua", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Accedeix al mode d'eliminació d'elements", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Surt del mode d'eliminació d'elements", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Crea un filtre personalitzat", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Elimina un filtre personalitzat", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vista:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalls del mode de filtratge", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Regles DNR personalitzades", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Regles DNR de…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Conjunt de regles dinàmiques", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Conjunt de regles de sessió", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Desa", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Restaura", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Afegeix", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importa i annexa…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exporta…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Còpia de seguretat…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restaura…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "No afegiu contingut de fonts no fiables", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Nombre de regles registrades: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Moveu el control lliscant per a seleccionar la millor coincidència", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Selecciona", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Previsualitza", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Crea", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Seleccioneu un filtre a continuació per a ressaltar els elements coincidents de la pàgina web. Feu clic a la paperera per a eliminar un filtre.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cs/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cs/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cs/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cs/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Experimentální blokovač obsahu vyžadující méně oprávnění. Blokuje reklamy, sledovače, těžaře a jiné ihned po instalaci.", + "message": "Účinný blokátor obsahu. Okamžitě po instalaci blokuje reklamy, sledovače, těžaře a další.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Ovládací panel", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Varování! Máte neuložené změny", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Zůstat", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorovat", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Nastavení", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filtry třetích stran", + "customFiltersPageName": { + "message": "Vlastní filtry", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Vaše filtry", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Povolené domény", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Vývoj", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "O rozšíření", @@ -51,78 +35,30 @@ "message": "Ochrana soukromí", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Trvale zakázat uBO Lite pro celý tento web.", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Otevřít ovládací panel", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Zapnout režim likvidace prvků", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Zapnout režim výběru prvků", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Filtrovací režim", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Na této webové stránce", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Nahlásit problém na této webové stránce", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Kliknutím natrvalo uložíte provedené změny.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kliknutím zrušíte provedené změny.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Otevřít ovládací panel", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Více", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Kliknutím udělíte rozšířená oprávnění uBO Lite na tomto webu.\nRozšířená oprávnění umožňují efektivnější blokování obsahu.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kliknutím odeberete rozšířená oprávnění na tomto webu", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Méně", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Zobrazit počet blokovaných požadavků u ikony", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Vzhled", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Motiv", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Vlastní barva motivu", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokovat CSP reporty", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Zapnout rozšířené filtrování na všech webových stránkách", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite může použít rozšířené filtrování na dané webové stránce pouze poté, co výslovně udělíte oprávnění k úpravě dat na této webové stránce. Toto nastavení umožňuje udělit oprávnění pro rozšířené filtrování všem webům najednou.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Výchozí", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regionální, jazykové", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Jeden filtr na řádek. Filtr může být prostý název hostitele nebo filtr kompatibilní s Adblock Plus. Řádky začínající vykřičníkem ! budou ignorovány.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importovat a připojit", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportovat", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-me-vlastni-filtry_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Pravidla v seznamu povolených domén určují, pro které webové stránky bude uBO Lite vypnutý. Jedna položka na řádek. Neplatná pravidla budou tiše ignorována a zakomentována.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importovat a připojit", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportovat", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-muj-whitelist_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Vložte sem konkrétní kosmetické filtry, které chcete přidat", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Přehled změn", @@ -204,35 +116,83 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Seznam filtrů", + "message": "Seznamy filtrů", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { "message": "Externí závislosti (kompatibilní s GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Odeslat", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Použít změny", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Vrátit", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Vítejte", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Právě jste nainstalovali uBO Lite. Zde si můžete vybrat výchozí režim filtrování pro použití na všech webových stránkách.\n\nVe výchozím nastavení je vybrán režim Základní, protože nevyžaduje oprávnění ke čtení a změně dat. Pokud důvěřujete uBO Lite, můžete mu udělit široké oprávnění číst a měnit data na všech webových stránkách, abyste ve výchozím nastavení povolili pokročilejší možnosti filtrování pro všechny webové stránky.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Nahlásit problém s filtrem", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Nahlaste problémy s filtrem u učitých webových stránek do sledovače problémů uBlockOrigin/uAssets. Vyžaduje účet GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informace o řešení problémů", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Abyste dobrovolníky nezatěžovali duplicitními hlášeními, ověřte si, zda již problém nebyl nahlášen.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Vyhledat podobná hlášení", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa webové stránky:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Webová stránka…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Vyberte položku --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Zobrazuje reklamy nebo zbytky reklam", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Je překrytá nebo má jiné nedostatky", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detekuje uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Má problémy související se soukromím", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Je rozbitá, když je povolen uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Otevírá nechtěné karty nebo okna", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Vede k badwaru, phishingu", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Označit webovou stránku jako “NSFW” (“Není bezpečné pro práci”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Vytvořit nové hlášení", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Výchozí režim filtrování", + "message": "Výchozí filtrovací režim", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { @@ -267,12 +227,188 @@ "message": "Pokročilé síťové filtrování plus specificky a obecně rozšířené filtrování z vybraných seznamů filtrů.\n\nVyžaduje rozsáhlé oprávnění ke čtení a změně dat na všech webech.\n\nObecně rozšířené filtrování může způsobit vyšší využití zdrojů webových stránek.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Seznam názvů hostitelů, pro které nebude probíhat žádné filtrování", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[pouze názvy hostitelů]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Chování", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automaticky znovu načíst stránku při změně filtračního režimu", + "message": "Automaticky znovu načíst stránku při změně filtrovacího režimu", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Zobrazit počet blokovaných požadavků u ikony v panelu nástrojů", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Povolit přísné blokování", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigace na potenciálně nežádoucí stránky bude zablokována a bude vám nabídnuta možnost pokračovat.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Vývojářský režim", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Umožňuje přístup k funkcím vhodným pro technicky zdatné uživatele.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Záloha", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Zálohování vlastních nastavení do souboru nebo obnovení vlastních nastavení ze souboru.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Obnovení přepíše všechna vaše aktuální vlastní nastavení.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Najít seznamy", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Stránka zablokována", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite zabránil načtení následující stránky:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Stránka byla zablokována z důvodu shodného filtru v {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Zablokovaná stránka vás chce přesměrovat na jiný web. Pokud se rozhodnete pokračovat, přejdete přímo na: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametrů", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Zpět", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Zavřít okno", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Nevarujte mě znovu o této stránce", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Pokračovat", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Přejít do režimu dočasného skrytí prvků", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Opustit režim dočasného skrytí prvků", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Vytvořit vlastní filtr", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Odebrat vlastní filtr", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Zobrazit:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detaily filtovacího módu", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Vlastní pravidla DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR pravidla …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamický seznam pravidel", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Uložit", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Vrátit", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Přidat", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importovat a připojit…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportovat…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Zálohovat…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Obnovit…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Nepřidávat filtry z nedůvěryhodných zdrojů", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Počet registrovaných pravidel: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Posunutím jezdce vyberte nejlepší shodu", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Vybrat", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Náhled", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Vytvořit", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Výběrem níže uvedeného filtru zvýrazníte odpovídající prvky na webové stránce. Kliknutím na koš filtr odstraníte.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cv/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cv/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cv/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cv/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cy/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cy/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/cy/messages.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cy/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,414 @@ +{ + "extName": { + "message": "uBlock Origin Lite", + "description": "extension name." + }, + "extShortDesc": { + "message": "Rhwystrydd cynnwys nad yw'n gofyn am hawliau. Rhwystrwch hysbysebion, tracwyr, cloddwyr, a mwy, yn syth ar ôl gosod.", + "description": "this will be in the Chrome web store: must be 132 characters or less" + }, + "perRulesetStats": { + "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "description": "Appears aside each filter list in the _3rd-party filters_ pane" + }, + "dashboardName": { + "message": "uBO Lite — Dangosfwrdd", + "description": "English: uBO Lite — Dashboard" + }, + "settingsPageName": { + "message": "Gosodiadau", + "description": "appears as tab name in dashboard" + }, + "customFiltersPageName": { + "message": "Custom filters", + "description": "appears as tab name in dashboard" + }, + "developPageName": { + "message": "Datblygu", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" + }, + "aboutPageName": { + "message": "Ynghylch", + "description": "appears as tab name in dashboard" + }, + "aboutPrivacyPolicy": { + "message": "Polisi preifatrwydd", + "description": "Link to privacy policy on GitHub (English)" + }, + "popupFilteringModeLabel": { + "message": "modd hidlo", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Ar y wefan hon", + "description": "Label in the popup panel for the local tools section" + }, + "popupTipReport": { + "message": "Rhoi gwybod am broblem ar y wefan hon", + "description": "Tooltip used for the 'chat' icon in the panel" + }, + "popupTipDashboard": { + "message": "Agor y dashfwrdd", + "description": "English: Click to open the dashboard" + }, + "popupMoreButton": { + "message": "Mwy", + "description": "Label to be used to show popup panel sections" + }, + "popupLessButton": { + "message": "Llai", + "description": "Label to be used to hide popup panel sections" + }, + "3pGroupDefault": { + "message": "Diofyn", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAds": { + "message": "Hysbysebion", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupPrivacy": { + "message": "Preifatrwydd", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMalware": { + "message": "Malware protection, security", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAnnoyances": { + "message": "Pethau diflas", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMisc": { + "message": "Amrywiol", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupRegions": { + "message": "Rhanbarthau, ieithoedd", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" + }, + "aboutChangelog": { + "message": "Cofnod newidiadau", + "description": "" + }, + "aboutCode": { + "message": "Cod ffynhonnell (GPLv3)", + "description": "English: Source code (GPLv3)" + }, + "aboutContributors": { + "message": "Cyfranwyr", + "description": "English: Contributors" + }, + "aboutSourceCode": { + "message": "Cod ffynhonnell", + "description": "Link text to source code repo" + }, + "aboutTranslations": { + "message": "Cyfieithiadau", + "description": "Link text to translations repo" + }, + "aboutFilterLists": { + "message": "Rhestri hidlo", + "description": "Link text to uBO's own filter lists repo" + }, + "aboutDependencies": { + "message": "Gofynion allanol (cydnaws â GPLv3):", + "description": "Shown in the About pane" + }, + "supportS6H": { + "message": "Adrodd nam ar hidlydd", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Dod o hyd i adroddiadau tebyg ar GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Cyfeiriad y dudalen we:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Y dudalen we…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" + }, + "defaultFilteringModeSectionLabel": { + "message": "Default filtering mode", + "description": "The header text for the default filtering mode section" + }, + "defaultFilteringModeDescription": { + "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "description": "This describes the default filtering mode setting" + }, + "filteringMode0Name": { + "message": "dim hidlo", + "description": "Name of blocking mode 0" + }, + "filteringMode1Name": { + "message": "sylfaenol", + "description": "Name of blocking mode 1" + }, + "filteringMode2Name": { + "message": "priodol", + "description": "Name of blocking mode 2" + }, + "filteringMode3Name": { + "message": "cyflawn", + "description": "Name of blocking mode 3" + }, + "basicFilteringModeDescription": { + "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "description": "This describes the 'basic' filtering mode" + }, + "optimalFilteringModeDescription": { + "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "description": "This describes the 'optimal' filtering mode" + }, + "completeFilteringModeDescription": { + "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "description": "This describes the 'complete' filtering mode" + }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, + "behaviorSectionLabel": { + "message": "Ymddygiad", + "description": "The header text for the 'Behavior' section" + }, + "autoReloadLabel": { + "message": "Ail-lwytho tudalen ar ôl newid y modd hidlo", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modd datblygwr", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Yn ôl", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Cau'r ffenestr hon", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Peidio â'm rhybuddio eto am y wefan hon", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Parhau", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Galluogi'r modd saethu elfen", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Gadael y modd saethu elfen", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Cadw", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Dychwelwch", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Ychwanegwch", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Allforio", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/da/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/da/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/da/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/da/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "En eksperimentel, tilladelsesløs indholdsblocker – blokerer som standard annoncer, trackere, minere mv.", + "message": "En effektiv indholdsblocker. Blokerer annoncer, trackere, minere mm. umiddelbart efter installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Kontrolpanel", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Advarsel! Der er ikke-gemte ændringer", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Bliv", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorér", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Indstillinger", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlister", + "customFiltersPageName": { + "message": "Tilpassede filtre", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Egne filtre", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Betroede websteder", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Udvikl", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Om", @@ -51,78 +35,30 @@ "message": "Fortrolighedspolitik", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Deaktivér/aktivér uBO Lite for dette websted", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Åbn kontrolpanelet", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Gå til tilstanden elementdræber­", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Gå til tilstanden elementvælger", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtreringstilstand", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "På dette websted", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Anmeld et problem med dette websted", + "message": "Anmeld et problem", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klik for at gøre ændringerne permanente.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klik for at fortryde ændringerne.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Åbn kontrolpanelet", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Flere", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klik for at give uBO Lite udvidede tilladelser på dette websted.\nUdvidede tilladelser tillader mere effektiv blokering af indhold.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klik for at tilbagekalde udvidede tilladelser på dette websted", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Færre", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Vis på ikonet antallet af blokerede forespørgsler", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Udseende", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Tilpasset fremhævningsfarve", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokér CSP-anmldelser", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Aktivér udvidet filtrering på alle websteder", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kan kun anvende udvidet filtrering på et givent websted, efter at du udtrykkeligt har givet udvidelsen tilladelse til at ændre data på webstedet. Denne indstilling giver dig mulighed for at give tilladelse til udvidet filtrering for alle websteder på én gang.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standard", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware-domæner", + "message": "Malware-beskyttelse, sikkerhed", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regioner, sprog", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ét filter pr. linje. Et filter kan være et alm. værtsnavn eller et EasyList-kompatibelt filter. Linjer startende med ! ignoreres.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importér og tilføj", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksport", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "egne-ublock-statiske-filtre_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "De betroede webstedsdirektiver dikterer, på hvilke websider uBO Lite skal deaktiveres. Én post pr. linje.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importér og tilføj", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksport", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "egne-ublock-betroede-websteder_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import/ Eksport", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Indsæt bestemte kosmetiske filtre hér for at tilføje", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Ændringslog", @@ -211,25 +123,73 @@ "message": "Eksterne afhængigheder (GPLv3-kompatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Indsend", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Anvend ændringer", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Tilbagefør", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Velkommen", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Du har netop installeret uBO Lite. Her kan vælges den standardfiltreringstilstand, der skal bruges på alle websteder.\n\nStandardvalget er Basis-tilstand, da den ikke kræver tilladelse til at læse og ændre data. Stoler du på uBO Lite, kan den omfattende tilladelse til at læse og ændre data på alle websteder tildeles for som standard at aktivere mere avancerede filtreringsfunktioner for alle websteder.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Anmeld et filterproblem", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Anmeld filterproblemer med bestemte websteder til uBlockOrigin/uAssets-problemsporingen. Kræver en GitHub-konto.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Fejlfindingsinformation", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "For at undgå at bebyrde frivillige med dubletanmeldelser, så tjek venligst, at problematikken ikke allerede er anmeldt. Bemærk: Ved at klikke på knappen, sendes sidens oprindelse til GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find lign. anmeldelser på GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Websideadressen:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Websiden…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Vælg problemtype --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Viser annoncer eller annoncerester", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Har overlejringer eller andre gener", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detekterer uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Har fortrolighedsrelaterede problemer", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Fejlfungerer, når uBO Lite er aktiveret", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Åbner uønskede faner eller vinduer", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Fører til badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Mærk websiden som “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Opret ny anmeldelse på GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standardfiltreringstilstand", @@ -267,6 +227,14 @@ "message": "Avanceret netværksfiltrering plus specifik og generisk udvidet filtrering ud fra valgte filterlister.\n\nOmfattende tilladelse kræves for at læse og ændre data på alle websteder.\n\nGenerisk, udvidet filtrering kan medføre højere webside-ressourceforbrug.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Liste over websteder, for hvilke ingen filtrering vil ske.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[kun værtsnavne]\neksempel.dk\nspil.eksempel\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Adfærd", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatisk sidegenindlæsning ved skift af filtreringstilstand", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Vis antallet af blokerede forespørgsler på værktøjsbjælkeikonet", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Aktivér striks blokering", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigering til potentielt uønskede websteder blokeres, men man tilbydes muligheden for at fortsætte.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Udviklertilstand", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Aktiverer adgang til funktioner egnede for tekniske brugere.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sikkerhedskopiér", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Sikkerhedskopiér tilpassede indstillinger til en fil, eller gendan tilpassede indstillinger fra en fil.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Gendannelse overskriver alle nuværende tilpassede indstillinger.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lister", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Side blokeret", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite har forhindret flg. side i at blive indlæst:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Siden blev blokeret grundet et matchende filter i {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Den blokerede side ønsker at omdirigere til et andet websted. Vælger man at fortsætte, navigeres direkte til: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "uden parametre", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Gå tilbage", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Luk dette vindue", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Advar ikke igen om dette websted", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Fortsæt", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Fjern et element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Forlad elementdræber­tilstand", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Opret et tilpasset filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Fjern et tilpasset filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vis:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtreringstilstandsdetaljer", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Tilpassede DNR-regler", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-regler for…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamiske regelsæt", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sessionsregelsæt", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Gem", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Tilbagefør", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Tilføj", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importér og tilføj…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Eksportér…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sikkerhedskopiér…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Gendan…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Tilføj ikke indhold fra ikke-betroede kilder.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Antal registrerede regler : {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Flyt skyderen for at vælge det bedste match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Vælg", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Forhåndsvisning", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Opret", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Vælg et filter nedenfor for at fremhæve matchende elementer på websiden. Klik på papirkurven for at fjerne et filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/de/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/de/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/de/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/de/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Experimenteller Inhaltsblocker, der ohne Berechtigungen auskommt. Blockiert Werbung, Tracker & mehr sofort nach der Installation.", + "message": "Ein effizienter Inhaltsblocker. Blockiert Werbung, Tracker und mehr sofort nach der Installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warnung! Nicht gespeicherte Änderungen", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Bleiben", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorieren", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Einstellungen", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlisten", + "customFiltersPageName": { + "message": "Eigene Filter", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Meine Filter", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Ausnahmeregeln", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Entwickeln", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Über", @@ -51,78 +35,30 @@ "message": "Datenschutzhinweise", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "uBO Lite für diese Website ein-/ausschalten", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Dashboard öffnen", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Element-Entfernungsmodus starten", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Element-Auswahlmodus starten", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Filtermodus", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Auf dieser Website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Ein Problem auf dieser Website melden", + "message": "Ein Problem melden", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Hier klicken, um Ihre Änderungen dauerhaft zu übernehmen.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Hier klicken, um Ihre Änderungen rückgängig zu machen.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Dashboard öffnen", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mehr", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klicken Sie hier, um uBO Lite erweiterte Berechtigungen für diese Website zu erteilen.\nErweiterte Berechtigungen ermöglichen ein effektiveres Blockieren von Inhalten.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klicken Sie hier, um erweiterte Berechtigungen für diese Website zu widerrufen.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Weniger", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Anzahl der blockierten Anfragen auf dem Symbol anzeigen", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Erscheinungsbild", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Farbschema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Benutzerdefinierte Akzentfarbe", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP-Berichte blockieren", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Erweitertes Filtern auf allen Websites aktivieren", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kann das erweiterte Filtern nur dann auf eine bestimmte Website anwenden, wenn Sie der Erweiterung ausdrücklich die Berechtigung erteilen, Daten auf dieser Website zu ändern. Mit dieser Einstellung können Sie Berechtigungen für das erweiterte Filtern für alle Websites auf einmal erteilen.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standard", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -132,11 +68,11 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privatsphäre", + "message": "Datenschutz", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domains mit Schadsoftware", + "message": "Schutz vor Schadsoftware, Sicherheit", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regionen, Sprachen", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ein Filter pro Zeile. Ein Filter kann ein einfacher Hostname oder ein EasyList-kompatibler Filter sein. Zeilen mit vorangestelltem ! werden ignoriert.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importieren und anfügen …", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportieren …", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-statische-filter_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Ausnahmeregeln bestimmen, auf welchen Webseiten uBO Lite deaktiviert werden soll. Ein Eintrag pro Zeile.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importieren und anfügen …", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportieren …", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-ausnahmeregeln_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importieren und exportieren", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Kosmetische Filter zum Hinzufügen einfügen", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Änderungsprotokoll", @@ -211,25 +123,73 @@ "message": "Externe Abhängigkeiten (GPLv3-kompatibel):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Absenden", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Änderungen anwenden", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Rückgängig machen", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Willkommen", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Sie haben soeben uBO Lite installiert. Sie können hier den Standardfiltermodus auswählen, der auf allen Websites angewendet werden soll.\n\nStandardmäßig ist der einfache Modus ausgewählt, da er keine Berechtigung zum Lesen und Ändern von Daten erfordert. Wenn Sie uBO Lite vertrauen, können Sie dieser Erweiterung eine weitreichende Berechtigung zum Lesen und Ändern von Daten auf allen Websites erteilen, um standardmäßig erweiterte Filterfunktionen für alle Websites zu aktivieren.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Ein Filterproblem melden", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Bitte melden Sie Filterprobleme mit bestimmten Websites an den uBlockOrigin/uAssets Issue Tracker. Erfordert ein GitHub-Konto.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informationen zur Fehlerbehebung", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Um die Freiwilligen nicht mit doppelten Meldungen zu überlasten, vergewissern Sie sich bitte, dass das Problem noch nicht gemeldet wurde. Hinweis: Das Anklicken der Schaltfläche übermittelt den Ursprung der Seite an GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Ähnliche Meldungen auf GitHub finden", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresse der Webseite:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Die Webseite …", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Einen Eintrag auswählen --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Zeigt Werbung oder Werbereste", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Hat Überdeckungen oder andere Belästigungen", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Erkennt uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Hat Datenschutzprobleme", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Funktioniert nicht richtig, wenn uBO Lite aktiviert ist", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Öffnet unerwünschte Tabs oder Fenster", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Führt zu Schadsoftware, Phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Webseite als »NSFW« kennzeichnen (»Unpassend für den Arbeitsplatz«)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Neue Meldung auf GitHub erstellen", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standardfiltermodus", @@ -240,7 +200,7 @@ "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "keine Filterung", + "message": "nicht filtern", "description": "Name of blocking mode 0" }, "filteringMode1Name": { @@ -256,17 +216,25 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Einfache Netzwerkfilterung aus ausgewählten Filterlisten.\n\nErfordert keine Berechtigung zum Lesen und Ändern von Daten auf Websites.", + "message": "Einfaches Netzwerkfiltern aus gewählten Filterlisten.\n\nErfordert keine Berechtigung zum Lesen und Ändern von Daten auf Websites.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Erweiterte Netzwerkfilterung plus spezifisches erweitertes Filtern aus ausgewählten Filterlisten.\n\nErfordert eine weitreichende Berechtigung zum Lesen und Ändern von Daten auf allen Websites.", + "message": "Erweitertes Netzwerkfiltern plus spezifisches erweitertes Filtern aus ausgewählten Filterlisten.\n\nErfordert eine weitreichende Berechtigung zum Lesen und Ändern von Daten auf allen Websites.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Erweiterte Netzwerkfilterung plus spezifisches und generisches erweitertes Filtern aus ausgewählten Filterlisten.\n\nErfordert eine weitreichende Berechtigung zum Lesen und Ändern von Daten auf allen Websites.\n\nDie generische erweiterte Filterung kann zu einem höheren Ressourcenverbrauch der Website führen.", + "message": "Erweitertes Netzwerkfiltern plus spezifisches und allgemeines erweitertes Filtern aus gewählten Filterlisten.\n\nErfordert eine weitreichende Berechtigung zum Lesen und Ändern von Daten auf allen Websites.\n\nDas allgemeine erweiterte Filtern kann zu einem höheren Ressourcenverbrauch der Webseite führen.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Liste der Websites, für die nicht gefiltert wird.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[nur Hostnamen]\nexample.com\ngames.example\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Verhalten", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Seite beim Ändern des Filtermodus automatisch neu laden", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Anzahl der blockierten Anfragen auf dem Symbol in der Symbolleiste anzeigen", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Striktes Blockieren aktivieren", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Die Navigation zu potenziell unerwünschten Websites wird verhindert, jedoch wird eine Möglichkeit zum Fortfahren angeboten.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Entwicklermodus", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Ermöglicht den Zugriff auf Funktionen, die für technisch Versierte bestimmt sind.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sicherung", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Alle angepassten Einstellungen können in eine Datei gesichert oder aus einer Datei wiederhergestellt werden.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Durch das Wiederherstellen werden alle angepassten Einstellungen überschrieben.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Listen suchen", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Seite blockiert", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite hat das Laden der folgenden Seite verhindert:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Die Seite wurde aufgrund eines übereinstimmenden Filters in {{listname}} blockiert.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Die blockierte Seite möchte zu einer anderen Website weiterleiten. Beim Fortfahren wird folgende Seite aufgerufen: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "ohne Parameter", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Zurück", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Dieses Fenster schließen", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Nicht erneut vor dieser Seite warnen", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Fortfahren", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Ein Element entfernen", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Temporären Modus beenden", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Eigenen Filter erstellen", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Eigenen Filter entfernen", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Ansicht:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Details zum Filtermodus", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Eigene DNR-Regeln", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-Regeln von …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamische Regeln", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Regeln der aktuellen Sitzung", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Speichern", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Rückgängig machen", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Hinzufügen", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importieren und ergänzen …", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportieren …", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sichern …", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Wiederherstellen …", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Verwenden Sie keine Regeln aus unseriösen Quellen", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Anzahl erfasster Regeln: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Schieberegler bewegen, um die beste Übereinstimmung auszuwählen", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Auswählen", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Vorschau", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Erstellen", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Das Auswählen eines unten stehenden Filters hebt übereinstimmende Elemente auf der Webseite hervor. Auf den Mülleimer klicken, um einen Filter zu entfernen.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/el/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/el/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/el/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/el/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,114 +15,50 @@ "message": "uBO Lite — Πίνακας ελέγχου", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Προειδοποίηση! Έχετε μη αποθηκευμένες αλλαγές", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Παραμονή", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Παράβλεψη", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Ρυθμίσεις", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Λίστες φίλτρων", + "customFiltersPageName": { + "message": "Προσαρμοσμένα φίλτρα", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Τα φίλτρα μου", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Έμπιστοι ιστότοποι", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Ανάπτυξη", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "Πληροφορίες", + "message": "Σχετικά", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { "message": "Πολιτική απορρήτου", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Απενεργοποίηση/ενεργοποίηση uBO Lite για αυτόν τον ιστότοπο", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Ανοίξτε τον πίνακα ελέγχου", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Είσοδος σε λειτουργία διαγραφής στοιχείων", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Είσοδος σε λειτουργία επιλογής στοιχείων", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "λειτουργία φιλτραρίσματος", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Για αυτόν τον ιστότοπο", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Αναφέρετε ένα ζήτημα σε αυτόν τον ιστότοπο", + "message": "Αναφορά ενός ζητήματος σε αυτόν τον ιστότοπο", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Κάντε κλικ για να γίνουν οριστικές οι αλλαγές σας.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Κάντε κλικ για να επαναφέρετε τις αλλαγές σας.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Άνοιγμα του πίνακα εργαλείων", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Περισσότερα", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Κάντε κλικ για να παραχωρήσετε εκτεταμένα δικαιώματα στο uBO Lite για αυτόν τον ιστότοπο.\nΤα εκτεταμένα δικαιώματα επιτρέπουν πιο αποτελεσματικό αποκλεισμό περιεχομένου.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Κάντε κλικ για να ανακαλέσετε τα εκτεταμένα δικαιώματα για αυτόν τον ιστότοπο", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Λιγότερα", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Εμφάνιση αριθμού αποκλεισμένων αιτημάτων στο εικονίδιο", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Εμφάνιση", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Θέμα", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Προσαρμοσμένο χρώμα έμφασης", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Φραγή αναφορών CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Ενεργοποιήστε το εκτεταμένο φιλτράρισμα σε όλους τους ιστότοπους", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "Το uBO Lite μπορεί να εφαρμόσει εκτεταμένο φιλτράρισμα σε έναν συγκεκριμένο ιστότοπο μόνο αφού εκχωρήσετε ρητά στην επέκταση δικαιώματα τροποποίησης δεδομένων σε αυτόν τον ιστότοπο. Αυτή η ρύθμιση σάς επιτρέπει να εκχωρήσετε δικαιώματα για εκτεταμένο φιλτράρισμα σε όλους τους ιστότοπους ταυτόχρονα.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Προεπιλογή", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Κακόβουλοι τομείς", + "message": "Τομείς κακόβουλου λογισμικού", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,40 +87,16 @@ "message": "Περιοχές, γλώσσες", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ένα φίλτρο ανά γραμμή. Ένα φίλτρο μπορεί να είναι ένα απλό όνομα κεντρικού υπολογιστή (hostname) ή ένα φίλτρο, συμβατό με το EasyList. Οι γραμμές με το πρόθεμα ! θα παραβλέπονται.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Εισαγωγή και προσάρτηση", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Εξαγωγή", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "statika-filtra-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Οι οδηγίες έμπιστων ιστοτόπων υποδεικνύουν σε ποιες ιστοσελίδες θα πρέπει να απενεργοποιείται το uBO Lite. Μία καταχώρηση ανά γραμμή.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Εισαγωγή και προσάρτηση", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Εξαγωγή", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "empistoi-istotopoi-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Εισαγωγή / Εξαγωγή", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Επικολλήστε εδώ για προσθέσετε φίλτρα για συγκεκριμένα διακοσμητικά", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Αρχείο καταγραφής αλλαγών", + "message": "Αρχείο αλλαγών", "description": "" }, "aboutCode": { @@ -211,25 +123,73 @@ "message": "Εξωτερικές εξαρτήσεις (συμβατές με GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Υποβολή", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Εφαρμογή αλλαγών", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Επαναφορά", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Καλώς ήρθατε", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Μόλις εγκαταστήσατε το uBO Lite. Μπορείτε να επιλέξετε εδώ την προεπιλεγμένη λειτουργία φιλτραρίσματος για χρήση σε όλους τους ιστότοπους.\n\nΑπό προεπιλογή, έχει επιλεγεί η λειτουργία Βασική επειδή δεν απαιτεί άδεια ανάγνωσης και αλλαγής δεδομένων. Εάν εμπιστεύεστε το uBO Lite, μπορείτε να του δώσετε ευρεία άδεια να διαβάζει και να αλλάζει δεδομένα σε όλους τους ιστότοπους, προκειμένου να ενεργοποιηθούν πιο προηγμένες δυνατότητες φιλτραρίσματος για όλους τους ιστότοπους από προεπιλογή.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Αναφορά προβλήματος φίλτρου", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Αναφέρετε προβλήμα φίλτρου για συγκεκριμένους ιστοτόπους στο εργαλείο παρακολούθησης ζητημάτων του uBlockOrigin/uAssets. Απαιτείται λογαριασμός GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Πληροφορίες για αντιμετώπιση προβλημάτων", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Για να μην επιβαρυνθούν οι εθελοντών με διπλές αναφορές, βεβαιωθείτε ότι το ζήτημα δεν έχει ήδη αναφερθεί.Σημείωση: Με το πάτημα του κουμπιού, θα σταλεί η σελίδα προέλευσης στο GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Βρείτε παρόμοιες αναφορές στο GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Διεύθυνση της ιστοσελίδας:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Η ιστοσελίδα…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Επιλέξτε μια καταχώρηση --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Εμφανίζει διαφημίσεις ή υπολείμματα διαφημίσεων", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Έχει επικαλύψεις ή άλλες ενοχλήσεις", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Ανιχνεύει το uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Έχει ζητήματα σχετικά με το απόρρητο", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Δυσλειτουργεί όταν είναι ενεργό το uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Ανοίγει ανεπιθύμητες καρτέλες ή παράθυρα", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Οδηγεί σε κακόβουλο λογισμικό, ηλεκτρονικό «ψάρεμα»", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Επισήμανση ιστοσελίδας ως «NSFW» («Not Safe For Work»)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Δημιουργία νέας αναφοράς", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Προεπιλεγμένη λειτουργία φιλτραρίσματος", @@ -267,12 +227,188 @@ "message": "Προηγμένο φιλτράρισμα δικτύου και ειδικό και γενικό εκτεταμένο φιλτράρισμα από επιλεγμένες λίστες φίλτρων.\n\nΑπαιτεί ευρεία άδεια για την ανάγνωση και την αλλαγή δεδομένων σε όλους τους ιστότοπους.\n\nΤο γενικό εκτεταμένο φιλτράρισμα μπορεί να προκαλέσει μεγαλύτερη χρήση πόρων ιστοσελίδας.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Λίστα των hostnames για τα οποία δεν θα πραγματοποιηθεί φιλτράρισμα", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[μόνο ονόματα κεντρικών υπολογιστών]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Συμπεριφορά", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Αυτόματη επαναφόρτωση της σελίδας κατά την αλλαγή της λειτουργίας φιλτραρίσματος", + "message": "Αυτόματη επαναφόρτωση σελίδας κατά την αλλαγή λειτουργίας φιλτραρίσματος", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Εμφάνιση του αριθμού των αποκλεισμένων αιτημάτων στο εικονίδιο της γραμμής εργαλείων", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Ενεργοποίηση αυστηρής φραγής", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Θα απετραπεί η πρόσβαση σε πιθανά ανεπιθύμητους ιστοτόπους. Θα σας προσφερθεί η επιλογή να συνεχίσετε.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Λειτουργία προγραμματιστή", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Ενεργοποίηση πρόσβασης σε δυνατότητες κατάλληλες για τεχνικούς χρήστες.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Αντίγραφα ασφαλείας", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Δημιουργήστε ένα αντίγραφο ασφαλείας των προσαρμοσμένων ρυθμίσεών σας ή επαναφέρετε τις προσαρμοσμένες ρυθμίσεις από ένα αρχείο αντιγράφου ασφαλείας.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Η επαναφορά θα έχει ως αποτέλεσμα την αντικατάσταση των τρεχόντων προσαρμοσμένων ρυθμίσεών σας.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Εύρεση λιστών", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Αποκλησμένη σελίδα", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "Το uBO Lite εμπόδισε τη φόρτωση στης παρακάτω σελίδας:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Η σελίδα αποκλείστηκε λόγω αντιστοίχισης φίλτρου στη {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Η αποκλεισμένη σελίδα θέλει να κάνει ανακατεύθυνση σε άλλο ιστότοπο. Αν επιλέξετε να συνεχίσετε, θα μεταβείτε απευθείας στο: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "χωρίς παραμέτρους", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Επιστροφή", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Κλείσιμο του παραθύρου", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Να μην προειδοποιηθώ ξανά για αυτόν τον ιστότοπο", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Συνέχεια", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Είσοδος σε λειτουργία αφαίρεσης στοιχείων", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Έξοδος από λειτουργία αφαίρεσης στοιχείων", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Δημιουργία προσαρμοσμένου φίλτρου", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Αφαίρεση προσαρμοσμένου φίλτρου", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Προβολή:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Λεπτομέρειες λειτουργίας φιλτραρίσματος", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Προσαρμοσμένοι κανόνες DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Κανόνες DNR του …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Σετ κανόνων που είναι δυναμικοί", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Σετ κανόνων για τη συνέδρεια", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Αποθήκευση", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Επαναφορά", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Προσθήκη", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Εισαγωγή και προσθήκη…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Εξαγωγή…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Δημιουργία αντιγράφου ασφαλείας…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Επαναφορά ρυθμίσεων…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Να μην προστίθενται περιεχόμενο από μη αξιόπιστες πηγές.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Σύνολο εγγεγραμμένων κανόνων: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Μετακινήστε το ρυθμιστικό για να επιλέξετε την καλύτερη αντιστοίχιση", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Επιλογή", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Προεπισκόπηση", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Δημιουργία", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Επιλέξτε ένα φίλτρο παρακάτω για να επισημάνετε τα στοιχεία που αντιστοιχούν στην ιστοσελίδα. Κάντε κλικ στον κάδο απορριμμάτων για να αφαιρέσετε ένα φίλτρο.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/en/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/en/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Report an issue on this website", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent colour", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Change-log", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,12 +227,188 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of hostnames for which no filtering will take place", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Behaviour", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enable access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Backup your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Enter element zapper mode", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Backup…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the dustbin to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/eo/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eo/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/eo/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eo/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,128 +15,64 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "Agordoj", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Pri", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "Pli", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Malpli", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Defaŭlta", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Reklamoj", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Privateco", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,56 +87,32 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Ŝanĝprotokolo", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Fontkodo (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Kontribuantoj", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Fontkodo", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Tradukoj", "description": "Link text to translations repo" }, "aboutFilterLists": { @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -244,7 +204,7 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "simpla", "description": "Name of blocking mode 1" }, "filteringMode2Name": { @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/es/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/es/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/es/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/es/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Un bloqueador de contenido experimental con menos permisos. Bloquea anuncios, rastreadores, criptomineros y aún más.", + "message": "Un bloqueador de contenido eficiente. Bloquea anuncios, rastreadores, criptomineros y aún más.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Panel de control", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "¡Atención! Tienes cambios sin guardar", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Conservar", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorar", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Configuración", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listas de filtros", + "customFiltersPageName": { + "message": "Filtros personalizados", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mis filtros", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Sitios de confianza", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Desarrollo", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Acerca de", @@ -51,78 +35,30 @@ "message": "Política de privacidad", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Deshabilitar/habilitar uBO Lite en este sitio", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Abrir panel de control", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Entrar al modo eliminación de elementos", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Entrar al modo selección de elementos", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "modo de filtrado", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "En este sitio web", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Reportar un problema en este sitio web", + "message": "Reportar un problema", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Haz clic para hacer tus cambios permanentes.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Haz clic para revertir tus cambios.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Abrir panel de control", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Más", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Clic para otorgar permisos extendidos a uBO Lite en este sitio.\nLos permisos extendidos permiten un bloqueo de contenido más efectivo.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Clic para revocar permisos extendidos en este sitio", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Menos", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Mostrar el número de peticiones bloqueadas en el icono", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Apariencia", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Tono de color personalizado", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bloquear reportes CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Habilitar filtrado extendido en todos los sitios web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite puede aplicar el filtrado extendido en un sitio web determinado solo después de que explícitamente hayas otorgado a la extensión permisos para modificar los datos de ese sitio web. Esta configuración te permite otorgar permisos para el filtrado extendido a todos los sitios web a la vez.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Predeterminado", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Dominios de malware", + "message": "Protección de malware, seguridad", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regiones, idiomas", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Un filtro por línea. El filtro puede ser un nombre de dominio, o un filtro compatible con EasyList. Las líneas que comiencen con ! serán ignoradas.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importar y anexar", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportar", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-mis-filtros-estaticos_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Sitios de confianza para los cuales se deshabilitará uBO Lite. Una entrada por línea.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importar y anexar", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportar", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-mis-sitios-de-confianza_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importar / Exportar", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Pega aquí los filtros cosméticos específicos a añadir", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Registro de cambios", @@ -211,25 +123,73 @@ "message": "Dependencias externas (compatibles con GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Enviar", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplicar cambios", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revertir", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Bienvenida", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Acabas de instalar uBO Lite. Aquí puedes elegir el modo de filtrado predeterminado que se utilizará en todos los sitios web.\n\nPor defecto, el modo básico está seleccionado porque no requiere permiso para leer y modificar datos. Si confías en uBO Lite, puedes otorgarle un permiso amplio para leer y modificar datos en todos los sitios web para habilitar capacidades de filtrado más avanzadas para todos los sitios web de forma predeterminada.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Reportar un problema de filtro", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Reportar problemas de filtros con sitios web específicos en el registro de problemas uBlockOrigin/uAssets. Requiere una cuenta en GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Información para solucionar problemas", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Para evitar sobrecargar a voluntarios con reportes duplicados, verifica que el problema no haya sido reportado. Nota: al hacer clic en el botón, hará que el origen de la página se envíe a GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Encontrar reportes similares en GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Dirección de la página web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "La página web...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Elige una entrada --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Muestra anuncios o restos de anuncios", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Tiene superposiciones u otras molestias", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detecta uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Tiene problemas relacionados con la privacidad", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Funciona mal cuando uBO Lite está habilitado", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Abre pestañas o ventanas no deseadas", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Conduce a malware y phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Etiquetar la página web como “NSFW” (“no es seguro/apropiado para el trabajo”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Crear nuevo reporte en GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Modo de filtrado predeterminado", @@ -267,6 +227,14 @@ "message": "Filtrado de red avanzado más filtrado extendido específico y genérico a partir de listas de filtros seleccionadas.\n\nRequiere un amplio permiso para leer y modificar datos en todos los sitios web.\n\nEl filtrado genérico extendido puede causar un mayor uso de recursos de la página web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista de sitios web para los cuales no se realizará ningún filtrado.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[solo nombres de dominio]\nejemplo.com\njuegos.ejemplo\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamiento", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Recargar automáticamente la página al cambiar el modo de filtrado", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar el número de peticiones bloqueadas en el icono de la barra de herramientas", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Habilitar bloqueo estricto", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "La navegación a sitios potencialmente no deseados será bloqueada, y se te ofrecerá la opción de continuar.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modo desarrollador", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Habilita acceso a características aptas para usuarios técnicos.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Respaldar", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Haz un respaldo de tu configuración personalizada en un archivo o restaura tu configuración personalizada desde uno.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "La restauración sobrescribirá toda tu configuración personalizada actual.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Encontrar listas", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Página bloqueada", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite impidió la carga de la página:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "La página ha sido bloqueada como resultado de un filtro coincidente en {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "La página bloqueada quiere redirigir a otro sitio. Si eliges continuar, navegarás directamente a: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sin parámetros", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Regresar", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Cerrar esta ventana", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "No me adviertas de nuevo sobre este sitio", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Continuar", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Eliminar un elemento", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Salir del modo eliminación de elementos", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Crear un filtro personalizado", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Eliminar un filtro personalizado", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Ver:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalles del modo de filtrado", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Reglas DNR personalizadas", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Reglas DNR de …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Conjunto de reglas dinámicas", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Conjunto de reglas de sesión", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Guardar", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revertir", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Añadir", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importar y anexar…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportar…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Respaldar…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restaurar…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "No añadas contenido de fuentes no confiables", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Número de reglas registradas: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Mueve el control deslizante para seleccionar la mejor coincidencia", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Elegir", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Vista previa", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Crear", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Selecciona un filtro abajo para resaltar los elementos coincidentes en la página web. Haz clic en la papelera para eliminar un filtro.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/et/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/et/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/et/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/et/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Katsetamisel õigustevaba sisublokeerija. Tõkesta koheselt reklaame, jälgijaid, kaevandajaid ja muud.", + "message": "Õigustevaba sisublokeerija. Blokeerib reklaamid, jälitajad, kaevandajad ja teised kohe pärast paigaldust.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Töölaud", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Hoiatus! Sul on salvestamata muudatusi", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Jää lehele", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Eira", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Sätted", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filtriloendid", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Minu filtrid", + "customFiltersPageName": { + "message": "Isetehtud filtrid", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Usaldatud saidid", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Arendajale", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Teave", @@ -51,78 +35,30 @@ "message": "Privaatsusteatis", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Keela/luba uBO Lite sellel saidil", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Ava töölaud", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Sisene elemendi hävitusrežiimi", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Sisene elemendi valikurežiimi", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtreerimisrežiim", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Sellel veebilehel", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Teavita selle veebilehe probleemist", + "message": "Teavita veast", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klõpsa, et teha oma muudatused püsivaks.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klõpsa, et võtta muudatused tagasi.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Ava töölaud", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Rohkem", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klõpsa, et anda uBO Lite'il selle saidi jaoks laiendatud õigused.\nLaiendatud õigused võimaldavad efektiivsemat sisublokeerimist.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klõpsa, et eemaldada selle saidi laiendatud õigused", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Vähem", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Kuva ikoonil blokeeritud elementide arv", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Välimus", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Teema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Kohandatud rõhuvärv", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Keela lehe turvareeglite (CSP-de) aruanded", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Luba põhjalik filtreerimine kõikidel veebilehtedel", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite filtreerib teatud veebilehte põhjalikult vaid juhul, kui lubate selgesõnaliselt laiendi lubades muuta selle veebilehe andmeid. Selle sättega lubate filtreerida kõiki veebilehti põhjalikult ja samal ajal.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Vaikimisi", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regioonid, keeled", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Üks filter rea kohta. Filtriks võib olla tavaline hostinimi või EasyListiga ühilduv filter. Eesliitega ! algavaid ridu eiratakse.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Impordi ja lisa", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Ekspordi", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "minu-ublocki-staatilised-filtrid_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Usaldatud saitide direktiivid määravad, millistel veebilehtedel peaks uBlock Origin keelatud olema. Üks kirje rea kohta.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Impordi ja lisa", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Ekspordi", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "minu-ublocki-usaldatud-saidid_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Impordi/ekspordi", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Kindlate kosmeetiliste filtrite lisamiseks asetage need siia", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Muudatuste logi", @@ -211,25 +123,73 @@ "message": "Välised sõltuvused (ühilduvad GPLv3-ga):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Saada", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Kinnita muudatused", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Ennista", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Tere tulemast", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Olete paigaldanud uBO Lite'i. Nüüd valige kõigil veebilehtedel kasutatav üldine filtreerimisrežiim.\n\nTavaliselt kehtib Põhiline režiim, kuna see ei vaja andmete lugemise ja muutmise luba. uBO Lite'i usaldamisel saate sel lubada andmeid lugeda ja muuta kõigil veebilehtedel, et neid saaks vaikimisi filtreerida põhjalikumalt.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Teavita filtri veast", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Teavita vigasest filtrist kindlate veebilehtedega uBlockOrigin/uAssets vigade andmebaasi kaudu. Nõuab GitHubi kontot.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Tõrkeotsingu teave", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Vabatahtlike koormamise vältimiseks samade teadetega veenduge, et keegi pole selle murega juba varem pöördunud. Märge! Nupule klõpsamisega saadetakse GitHubile lehekülje aadress.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Leia GitHubist sarnaseid aruandeid", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Veebilehe aadress:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Veebileht...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Valige --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Näitab reklaame või reklaami kohatäitjaid", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Omab ülekatteid või teisi nuhtlusi", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Tuvastab uBO Lite'i", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Omab privaatsusega seonduvaid probleeme", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Streigib, kui uBO Lite on kasutusel", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Avab soovimatuid kaarte või aknaid", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Põhjustab pahavara, õngitsuskirju", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Märgi veebileht kui „NSFW” („Ohtlik”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Loo GitHubis uus aruanne", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Tavaline filtreerimisrežiim", @@ -267,6 +227,14 @@ "message": "Interneti põhjalikum filtreerimine ja enda valitud filtreerimisloenditega täpsem ning üldisem filtreerimine.\n\nVajab kõikide veebilehtede andmete lugemise ja muutmise üldist luba.\n\nÜldine ja põhjalikum filtreerimine võib koormata veebilehe ressursse tavapärasest rohkem.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Veebilehtede loend, kus filtreid ei kasutata.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[ainult hostinimed]\nnäide.com\nmängud.näide\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Käitumine", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Leht laadib ise uuesti filtreerimisrežiimi muutmisel", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Kuva tööriistariba ikoonil blokeeritud elementide arv", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Luba range tõkestamine", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Kahtlastele veebilehtedele suunamist takistatakse ja pakutakse võimalust jätkamiseks.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Arendaja režiim", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Luba juurdepääs tehnilise taibuga kasutajatele mõeldud võimalustele.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Varundamine / taastamine", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Varunda eriseadistused faili või taasta need failist.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Taastamine asendab olemasolevad seadistused.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Otsi nimekirju", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Lehe sirvimine piiratud", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite ennetas järgmise veebilehe laadimist:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Lehe avamine keelati {{listname}} tõttu.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Keelatud leht üritab suunata teisele lehele. Jätkates nõustute avama {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "ilma näitajateta", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Tagasi", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Sulge see aken", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Edaspidi luba mul seda sirvida", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Jätka", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Eemalda element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Välju elemendi hävitusrežiimist", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Loo ise filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Eemalda enda filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vaade:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtreerimisrežiimi andmed", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Enda aadressiresolverite avastamise reeglid", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Aadressiresolverite avastamise reeglid sellelt …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dünaamiline reeglitekogumik", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Seansi reeglitekogumik", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Salvesta", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Taasta", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Lisa", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Impordi ja lisa…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Ekspordi…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Varunda…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Taasta…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Lisa sisu vaid usaldusväärsetest allikatest", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Registreeritud reeglite arv: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Parima tulemuse saavutamiseks liigutage liugurit", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Vali", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Eelvaade", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Loo", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Valige allolev filter, et tõsta esile veebilehel kattuvad elemendid. Filtri eemaldamiseks klõpsake prügikasti.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/eu/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eu/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/eu/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eu/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Probatako eta baimenik behar ez duen eduki-blokeatzailea. Iragarkiak, jarraitzeko tresnak, eta gehiago instalatzean bertan [...]", + "message": "Probatako eta baimenik behar ez duen eduki-blokeatzailea. Iragarkiak, jarraitzeko tresnak, eta gehiago instalatzean bertan.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite - Lan-lekua", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Oharra! Gorde gabeko aldaketak dituzu", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Bertan geratu", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ezikusi", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Ezarpenak", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Iragazki-zerrendak", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Nire iragazkiak", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Konfidantzazko webguneak", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Honi buruz", @@ -51,78 +35,30 @@ "message": "Pribatutasun politika", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Desaktibatu/aktibatu uBO Lite webgune honentzat", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Ireki lan-lekua", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Sartu elementuak hiltzeko moduan", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Sartu elementuak aukeratzeko moduan", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Iragazteko modua", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Webgune honetan arazo baten berri eman", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klik egin zure aldaketak gordetzeko.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klik egin zure aldaketak atzera botatzeko.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Ireki lan-lekua", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Gehiago", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Egin klik webgune honetan uBO Literi baimen gehigarriak emateko.\nBaimen gehigarriek edukia era eraginkorragoan blokeatzea ahalbidetzen dute.\n", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Egin klik webgune honen baimen gehigarriak atzera botatzeko", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Gutxiago", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Bistaratu blokeatutako eskari kopurua ikonoan", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Itxura", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Gaia", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Azentu-kolore pertsonalizatua", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokeatu CSP txostenak", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Defektuzkoa", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Eskualdeak, hizkuntzak", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Iragazki bat lerroko. Iragazkia hostalari izen soila izan daiteke, edo EasyList-ekin bateragarria den irgazkia. !-rekin hasten diren lerroak ez dira kontuan hartuko.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Inportatu eta gehitu", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Esportatu", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Konfidantzazko webguneen ezarkepan, uBO Lite zein webgunean desaktibatu behar den zehazten du. Sarrera bat lerro bakoitzean.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Inportatu eta gehitu", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Esportatu", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Aldaketen erregistroa", @@ -211,68 +123,292 @@ "message": "Kanpo menpekotasunak (GPLv3 lizentziarekin bateragarriak):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Bidali", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplikatu aldaketak", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Desegin", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "iragazkiko arazo baten berria eman", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "uBO Lite detektatzen da", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Lehenetsitako iragazteko modua", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Iragazteko aurrez zehaztutako modua webgunearen arabera iragazteko moduen bidez deuseztatuko da. Edozein webgunetan iragazteko modua doitu dezake, webgune horretan hobekien funtzionatzen duen moduaren arabera. Modu bakoitzak bere abantailak eta desabantailak ditu.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "iragazkirik gabe\n", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "Oinarrizkoa", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "optimo", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "eginda", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Oinarrizko sarea iragaztea, hautatutako iragazkien zerrendetatik abiatuta.\n\nEz da baimenik behar webguneetan datuak irakurtzeko eta aldatzeko.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "\nSare aurreratuaren iragazketa gehi hautatutako iragazkien zerrenden berariazko hedapena.\n\nBaimen zabala behar da webgune guztietan datuak irakurri eta aldatzeko.\n", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "\nSare aurreratuko iragazketa gehi hedapen espezifiko eta generikoa hautatutako iragazkien zerrendetan.\n\nBaimen zabala behar da webgune guztietan datuak irakurri eta aldatzeko.\n\nIragazte hedatu generikoak web-orriaren baliabide gehiago erabiltzea eragin dezake.\n", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Filtrorik ezarriko ez zaien zerbitzarien izenak", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[zerbitzari izenak bakarrik]\nadibidea.eus\nexample.com\ngames.example", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "portaera or jokaera", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Orria automatikoki kargatuko da iragazteko modua aldatuko denean", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Tresna-barraren ikonoan blokeatutako eskaeren kopurua erakutsi", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Blokeatutako orrialdea", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "parametrorik gabe", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Joan atzera", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Itxi leiho hau", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ez esan ezer berriz ere orrialde honi buruz", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Aurrera", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Sartu elementua zapper moduan", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Irten elementua zapper moduan", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fa/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fa/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fa/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fa/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "یک مسدود کننده محتوای بدون مجوز که بلافاصله پس از نصب، تبلیغات، ردیاب ها، ابزارهای استخراج و موارد دیگر را مسدود می کند.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,128 +15,64 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "تنظیمات", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "درباره", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "حریم خصوصی", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "باز کردن داشبورد", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "بیشتر", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "کمتر", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "پیش فرض", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "تبلیغات", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "حریم خصوصی", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -144,63 +80,39 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "سایر", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "مناطق، زبانها", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "گزارش دگرگونی", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "سورس کد (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "شرکت کنندگان", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "کد منبع", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "ترجمه‌ها", "description": "Link text to translations repo" }, "aboutFilterLists": { @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fi/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fi/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fi/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fi/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Kokeellinen estotyökalu, joka ei tarvitse erityisiä käyttöoikeuksia. Estää välittömästi mm. mainokset, seurannat ja kryptolouhijat.", + "message": "Tehokas estotyökalu, joka estää heti asennuksen jälkeen mm. mainokset, seurannat ja kryptolouhijat.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Hallintapaneeli", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Varoitus! Et ole tallentanut tekemiäsi muutoksia", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Älä poistu", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ohita", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Asetukset", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Suodatinlistat", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { + "customFiltersPageName": { "message": "Omat suodattimet", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Luotetut sivustot", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Kehitys", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Tietoja", @@ -51,78 +35,30 @@ "message": "Tietosuojakäytäntö", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Poista uBO Lite käytöstä/ota se käyttöön tällä sivustolla", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Avaa hallintapaneeli", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Avaa elementtien piilotustila", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Avaa elementtien valintatila", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "suodatustila", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Tällä sivustolla", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Ilmoita ongelmasta tällä verkkosivustolla", + "message": "Ilmoita ongelmasta", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Tee muutoksistasi pysyviä painamalla tästä.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kumoa muutoksesi painamalla tästä.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Avaa hallintapaneeli", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Enemmän", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Myönnä uBO Litelle laajemmat käyttöoikeudet tämän sivuston sisällön käsittelyyn painamalla tästä.\nLaajemmat oikeudet mahdollistavat tehokkaamman sisällöneston.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Peru tämän sivuston sisällön käsittelyyn myönnetyt laajemmat käyttöoikeudet painamalla tästä.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Vähemmän", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Näytä estettyjen pyyntöjen määrä", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Ulkoasu", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Teema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Oma korostusväri", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Estä CSP-raportit", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Käytä laajennettua suodatusta kaikilla verkkosivustoilla", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Liten laajennettu suodatus voi toimia sivustolla vasta, kun sille erikseen myönnetään sivustokohtainen tietojen muokkausoikeus. Asetuksen avulla nämä käyttöoikeudet voidaan myöntää kattamaan kaikki verkkosivustot.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Oletus", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Haittaohjelmia jakelevat verkkotunnukset", + "message": "Haittaohjelmasuojaus, tietoturva", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Alueet, kielet", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Yksi suodatin riviä kohden. Suodatin voi olla pelkkä osoite tai EasyList-yhteensopiva suodatin. Rivit, joiden alussa on !, ohitetaan.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Tuo ja lisää...", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Vie tiedostoon...", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "omat-staattiset-ublock-suodattimet_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Luotettu sivusto -luokitukset määrittelevät millä sivuilla uBO Litea ei käytetä. Yksi osoite riviä kohden.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Tuo ja lisää...", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Vie tiedostoon...", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "omat-luotetut-ublock-sivustot_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Tuonti / Vienti", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Liitä lisättävät kosmeettiset suodattimet tähän", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Muutoshistoria", @@ -211,25 +123,73 @@ "message": "Ulkopuoliset riippuvuudet (GPLv3-yhteensopiva):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Lähetä", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Käytä muutoksia", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Palauta", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Tervetuloa", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Olet juuri asentanut uBO Liten. Tästä voit valita kaikilla sivustoilla oletusarvoisesti käytettävän suodatustilan.\n\nOletusarvoinen valinta on Perus-tila, koska se ei vaadi tietojen luku- ja muokkausoikeutta. Jos luotat uBO Liteen, voit myöntää sille kaikki sivustot kattavan laajan tietojen luku- ja muokkausoikeuden, jolloin edistyneemmät suodatusominaisuudet ovat oletusarvoisesti käytössä kaikilla sivustoilla.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Ilmoita suodatinongelmasta", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Ilmoita sivustokohtaisista suodatinongelmista uBlockOrigin/uAssets -ongelmaseurantaan. Vaatii GitHub-tilin.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Vianselvitystiedot", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Välttääksesi vapaaehtoisten kuormittamisen ylimääräisillä ilmoituksilla, tarkasta ensin onko ongelmasta jo ilmoitettu. Huomioi: Painikkeen painallus lähettää sivun osoitteen GitHubiin.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Etsi GitHubista vastaavia ilmoituksia", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Verkkosivun osoite:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Verkkosivu…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Valitse aihe --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Näyttää mainoksia tai niiden jäänteitä", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Sisältää peiteruutuja tai muita ärsykkeitä", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Tunnistaa uBO Liten", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Sisältää tietosuojaan liittyviä ongelmia", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Ei toimi oikein uBO Liten ollessa käytössä", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Avaa ei-toivottuja välilehtiä tai ikkunoita", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Johtaa badwareen ja tietojenkalasteluun", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Luokittele verkkosivu \"NSFW\"-tyyppiseksi (\"Not Safe For Work\", eli ns. työpaikalle sopimattomaksi)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Luo GitHubiin uusi ilmoitus", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Oletusarvoinen suodatustila", @@ -256,17 +216,25 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Perustason verkkosuodatus valikoiduilla suodatinlistoilla.\n\nEi edellytä sivustojen tietojen luku- ja muokkausoikeutta.", + "message": "Perustason verkkosuodatus valituilla suodatinlistoilla.\n\nEi edellytä sivustojen tietojen luku- ja muokkausoikeutta.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Edistynyt verkkosuodatus sekä kohdistettu laajempi suodatus valikoiduilla suodatinlistoilla.\n\nEdellyttää kaikki sivustot kattavan, laajemman tietojen luku- ja muokkausoikeuden myöntöä.", + "message": "Edistynyt verkkosuodatus sekä kohdistettu laajempi suodatus valituilla suodatinlistoilla.\n\nEdellyttää kaikki sivustot kattavan, laajemman tietojen luku- ja muokkausoikeuden.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Edistynyt verkkosuodatus sekä kohdistettu ja yleinen laajempi suodatus valikoiduilla suodatinlistoilla.\n\nEdellyttää kaikki sivustot kattavan, laajemman tietojen luku- ja muokkausoikeuden myöntöä.\n\nYleinen laajempi suodatus saattaa kasvattaa sivukohtaista resurssien käyttöä.", + "message": "Edistynyt verkkosuodatus sekä kohdistettu ja yleinen laajempi suodatus valituilla suodatinlistoilla.\n\nEdellyttää kaikki sivustot kattavan, laajemman tietojen luku- ja muokkausoikeuden.\n\nYleinen laajempi suodatus saattaa kasvattaa sivukohtaista resurssien käyttöä.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Listaus osotteista, joita ei suodateta.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[vain isäntänimiä]\nesimerkki.fi\npelit.esimerkki\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Toiminta", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Lataa sivu suodatustilan vaihtuessa automaattisesti uudelleen", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Näytä estettyjen pyyntöjen määrä työkalupalkin kuvakkeessa", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Käytä tiukkaa estoa", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Potentiaalisesti ei-toivottujen sivustojen avaaminen estetään mahdollisuudella jatkaa.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Kehittäjätila", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Aktivoi teknisille käyttäjille suunnatut ominaisuudet.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Varmuuskopioi / Palauta", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Varmuuskopioi asetuksesi tiedostoon, tai palauta aiempi varmuuskopio.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Palautus korvaa kaikki nykyiset asetuksesi.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Etsi listoja", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Sivu estettiin", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite on estänyt seuraavan sivun latauksen:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Sivu estettiin listalla {{listname}} olevan sännön perusteella.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Estetty sivu ohjautuu eri sivustolle. Jos jatkat, siirryt suoraan osoitteeseen {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "parametritön", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Palaa takaisin", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Sulje tämä ikkuna", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Älä varoita minua tästä sivustosta uudelleen", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Jatka", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Poista elementti", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Poistu elementtien piilotustilasta", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Luo uusi suodatin", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Poista oma suodatin", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Näytä:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Suodatustilan tiedot", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Omat DNR-säännöt", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-säännöt lähteestä…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynaaminen sääntöryhmä", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Istunnon sääntöryhmä", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Tallenna", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Palauta", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Lisää", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Tuo ja lisää…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Vie…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Varmuuskopioi…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Palauta…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Älä lisää sisältöä lähteistä, joihin et luota.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Rekisteröityjen sääntöjen määrä: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Valitse sopivin vaihtoehto siirtämällä säädintä", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Valitse", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Esikatsele", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Luo", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Valitse alta suodatin korostaaksesi verkkosivulta sitä vastaavat elementit. Poista suodatin klikkamalla roskakoria.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fil/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fil/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fil/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fil/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Eksperimental at permission-less na pangharang ng content. Hinaharang ang mga ad, tracker, miner, at higit pa pagka-install.", + "message": "Permission-less na tagaharang ng content. Hinaharang ang mga ad, tracker, miner, at higit pa pagka-install.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Babala! Hindi pa na-save ang ilan mong mga pagbabago.", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Manatili", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Balewalain", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Mga Setting", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listahan ng mga filter", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Mga filter ko", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Mga pinagkakatiwalaang site", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Bumuo", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Tungkol", @@ -51,78 +35,30 @@ "message": "Patakaran sa pagkapribado", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Paandarin/patayin ang uBO Lite para sa site na ito", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Buksan ang dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Buksan ang pantanggal sa mga elemento", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Buksan ang tagapili sa mga elemento", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "moda nang pagsasala", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Mag-ulat ng isyu sa website na ito", + "message": "Magulat ng problema sa website na ito", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Pindutin upang gawing permanente ang mga pagbabago mo.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Pindutin upang kanselahin ang mga pagbabago mo.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Buksan ang dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Higit pa", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Pindutin upang magkaroon ng karagdagang pahintulot ang uBO Lite sa site na ito.\nMas epektibo ang pagharang sa content kung may mga karagdagang pahintulot.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Pindutin upang matanggal ang karagdagang pahintulot ng uBO Lite sa site na ito.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mas konti", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Ipakita ang bilang ng mga hinarang na hiling sa icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Hitsura", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Pinasadyang kulay ng accent", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Harangin ang mga ulat ng CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Paandarin ang karagdagang pagfi-filter sa lahat ng mga website", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "Mapapaandar lang ang karagdagang pagfi-filter sa isang website pagkatapos mong pahintulutan ang uBO Lite na baguhin ang datos ng nasabing website. Sa setting na ito, maaari mong bigyan ng pahintulot ang uBO Lite para sa karagdagang pagfi-filter sa lahat ng mga website sa isang pindutan lang.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Mga rehiyon o wika", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Isang filter kada linya. Pwedeng simpleng hostname o EasyList-compatible ang filter. Hindi papansinin ang mga linyang nagsisimula sa !.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "I-import at idagdag", - "description": "English: Import and append" - }, - "1pExport": { - "message": "I-export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "mga-static-filter-ko-sa-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Idinidikta nito kung sa aling mga webpage papatayin ang uBO Lite. Isang entry kada linya.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "I-import at idagdag", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "I-export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "mga-pinagkakatiwalaan-kong-site-sa-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Talaan ng mga pagbabago", @@ -211,25 +123,73 @@ "message": "Mga panlabas na dependency (angkop sa GPLv3)", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Ipadala", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Ilapat ang mga pagbabago", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Kanselahin", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Mabuhay", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Maligayang pagdating sa uBO Lite. Dito mo mapipili ang default na mode sa pagfi-filter para sa lahat ng mga website.\n\nAng default na mode ay Basic dahil hindi nito kailangan ng karagdagang pahintulot na magbasa at magbago ng datos. Pwede mong pahintulutan ang uBO Lite, kung nagtitiwala ka sa amin, na basahin at baguhin ang data ng lahat ng mga website para sa karagdagang kakayahan sa pagfi-filter.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Magulat ng problema sa filter ", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Magreklamo dito ng mga isyu sa filter sa mga website: uBlockOrigin/uAssets issue tracker. Nangangailangan ng account sa GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Inpormasyon para sa troubleshooting", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Upang hindi makagambala ng mga volunteer sa mga umuulit na ulat, pakisigurado na hindi pa narereklamo ang iyong isyu. Paalala: Mapapadala sa Github ang origin ng page na ito pagpindot dito.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Maghanap ng katulad ng ulat sa GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Lokasyon ng webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Ang webpage", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Mamili --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Nagpapakita ng ads o mga bakas ng ads", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "May mga overlay o iba pang harang", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Nakadedetect ng uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "May mga isyu sa privacy", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Hindi gumagana nang maayos kapag nakabukas ang uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Nagbubukas ng mga hindi kailangang tab o window", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Patungo sa badware o phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Markahan ang webpage na \"NSFW\" (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Gumawa ng bagong ulat sa Github", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default na mode sa pagfi-filter", @@ -267,6 +227,14 @@ "message": "Pinainam na network filtering, partikular at generikong karagdagang pagfi-filter mula sa mga napiling listahan ng mga filter.\n\nKailangan ang pahintulot na basahin at baguhin ang mga data ng lahat ng mga website.\n\nMaaaring mas malaki ang konsyumo sa resource dahil sa generikong karagdagang pagfi-filter.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Listahan ng mga website kung saan walang magagawang filtering. ", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames lamang]\nexample.com\ngames.example \n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ugali", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Awtomatikong i-reload ang pahina kapag binago ang mode sa pagfi-filter", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Ipakita ang dami ng napigilang mga request sa toolbar na icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Paganahin ang striktong pagharang", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Haharangan ang pagpunta sa mga hindi nais na mga site, at bibigyan ka ng pagkakataon na magpatuloy.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Nagbibigay ng mga katangian para sa mga teknikal na gumagamit.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Maghanap ng mga listahan", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Nakaharang na page", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "Hindi pinayagan ng uBO Lite ang pagpunta sa page dahil:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Hinarang ang page na ito dahil sa isang filter sa {{listname}}", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Nais magpatuloy ng page na ito sa isa pang site. Kung magpapatuloy ka, dadalhin ka sa: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "walang mga parameter", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Bumalik", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Isara ang window na ito", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Huwag mo na akong balaan tungkol sa site na ito", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Magpatuloy", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Paganahin ang element zapper mode", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Umalis sa element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "I-save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Ibalik", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "I-import at idagdag...", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "I-export...", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Dami ng mga nakaregister na patakaran: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fr/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fr/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fr/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fr/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Un bloqueur allégé, expérimental et sans permission requise. Bloque les publicités, pisteurs, mineurs et plus dès l'installation.", + "message": "Un bloqueur de contenu efficace. Bloque les publicités, pisteurs, mineurs et plus dès l'installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Tableau de bord", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Attention, vous avez des changements non enregistrés !", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Rester", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorer", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Paramètres", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listes de filtres", + "customFiltersPageName": { + "message": "Filtres personnalisés", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mes filtres", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Sites Web fiables", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Développement", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "À propos", @@ -51,78 +35,30 @@ "message": "Politique de confidentialité", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Désactiver/activer uBO Lite pour ce site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Ouvrir le Tableau de bord", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Entrer en mode Zappeur", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Entrer en mode Sélecteur", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Mode de filtrage", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Sur ce site Web", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Rapporter un problème sur ce site Web", + "message": "Rapporter un problème", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Cliquez pour rendre les changements opérés permanents.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Cliquez pour annuler les changements opérés.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Ouvrir le Tableau de bord", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Plus", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Cliquer pour accorder à uBO Lite des permissions étendues pour ce site.\nLes permissions étendues renforcent le blocage de contenu.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Cliquer pour révoquer les permissions étendues pour ce site.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Moins", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Afficher le nombre de requêtes bloquées sur l'icône", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Apparence", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Thème", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Couleur d'accentuation personnalisée", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bloquer les rapports CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Activer le filtrage étendu sur tous les sites Web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite peut appliquer le filtrage étendu sur un site Web lorsque vous donnez à l'extension les permissions de modification des données sur ce site Web. Ce réglage vous permet d'accorder les permissions pour activer le filtrage étendu directement sur tous les sites Web.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Par défaut", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domaines malveillants", + "message": "Protection contre les logiciels malveillants, sécurité", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Régions, langues", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Une règle par défaut. Une règle peut être un simple nom d'hôte, ou encore une règle compatible EasyList. Les lignes débutant par ! seront ignorées.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importer", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exporter", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "mes-filtres-statiques-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Les directives de site de confiance indiquent sur quelles pages Web uBO Lite devrait être désactivée. Une entrée par ligne.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importer", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exporter", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "mes-sites-fiables-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importer / Exporter", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Coller ici les filtres cosmétiques spécifiques à ajouter", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Journal des changements", @@ -211,25 +123,73 @@ "message": "Dépendances externes (compatibles GPLv3) :", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Appliquer", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Appliquer", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Rétablir", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Bienvenue", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Vous venez d'installer uBO Lite. À présent vous pouvez choisir le mode de filtrage par défaut à utiliser sur tous les sites Web.\n\nPar défaut, le mode Basique est sélectionné car il ne requiert pas de permissions pour lire et modifier les données. Si vous faites confiance à uBO Lite, vous pouvez lui donner des permissions étendues pour lire et modifier les données sur tous les sites Web pour activer des capacités de filtrage plus avancées pour tous les sites Web par défaut.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Rapporter un problème de filtre", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Rapportez des problèmes de filtre sur des sites Web spécifiques dans le uBlockOrigin/uAssets suivi des problèmes. Nécessite un compte GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informations de dépannage", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Pour éviter d'encombrer les contributeurs avec des rapports en double, veuillez vérifier que le problème n'a pas déjà été rapporté.\nNote : Cliquer sur le bouton entraînera l'envoi de la page d'origine à GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Trouver des rapports similaires sur GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresse de la page Web :", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "La page Web…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Choisir un type --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "affiche des publicités ou des résidus de publicité", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "a une surcouche ou d'autres nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "détecte uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "a des problèmes de confidentialité", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "fonctionne mal quand uBO Lite est activé", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "ouvre des onglets ou fenêtres indésirables", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "conduit à/redirige vers des logiciels malveillants, du hameçonnage", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Marquer la page Web comme \"IPLT\" (Inapproprié Pour Le Travail)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Créer un nouveau rapport sur GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Mode de filtrage par défaut", @@ -267,6 +227,14 @@ "message": "Du filtrage réseau avancé plus du filtrage étendu générique et spécifique issu de listes de filtres choisies.\n\nNécessite des permissions étendues pour lire et modifier les données sur tous les sites Web.\n\nLe filtrage étendu générique peut augmenter l'utilisation des ressources pour la page Web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Liste des noms de domaine pour lesquels aucun filtrage n'aura lieu.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[noms de domaine uniquement]\nexemple.com\njeux.exemple\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportement", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Recharger automatiquement la page lors du changement de mode de filtrage", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Afficher le nombre de requêtes bloquées sur l'icône", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Activer le blocage strict", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "La navigation vers des sites potentiellement indésirables sera bloquée, et vous aurez la possibilité de continuer", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Mode développeur", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Active l'accès aux fonctionnalités adaptées aux utilisateurs techniques.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sauvegarde", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Sauvegardez vos paramètres personnalisés dans un fichier, ou restaurez vos paramètres personnalisés depuis un fichier.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "La restauration remplacera tous vos paramètres personnalisés actuels.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Trouver des listes", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page bloquée", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite a empêché le chargement de cette page :", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "La page a été bloquée à cause d'un filtre correspondant dans {{listname}}", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "La page bloquée souhaite rediriger vers un autre site. Si vous choisissez de continuer, vous vous rendrez à l'adresse suivante : {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sans paramètres", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Précédent", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Fermer cette fenêtre", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ne plus me prévenir pour ce site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Continuer", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Supprimer un élément", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Quitter le mode Zappeur d'élément", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Créer un filtre personnalisé", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Supprimer un filtre personnalisé", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vue :", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Détails du mode de filtrage", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Règles DNR personnalisées", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Règles DNR de ", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Règles dynamiques", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Règles de session", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Enregistrer", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Rétablir", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Ajouter", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importer", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exporter", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sauvegarder…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restaurer…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Ne pas ajouter de contenu provenant de sources non fiables", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Nombre de règles enregistrées : {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Déplacez le curseur pour sélectionner la meilleure correspondance", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Cibler", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Aperçu", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Créer", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Choisissez un filtre ci-dessous pour surligner les éléments correspondants dans la page Web. Cliquez sur l'icône de poubelle pour supprimer un filtre.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fy/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fy/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/fy/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fy/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "In eksperimintele, tastimmingsleaze ynhâldsblokkearder. Blokkearret daliks nei ynstallaasje advertinsjes, trackers, miners en mear.", + "message": "In, tastimmingsleaze ynhâldsblokkearder. Blokkearret daliks nei ynstallaasje advertinsjes, trackers, miners en mear.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite – Dashboerd", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warskôging! Net bewarre wizigingen", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Bliuwe", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Negearje", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Ynstellingen", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlisten", + "customFiltersPageName": { + "message": "Oanpaste filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Myn filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Fertroude websites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Untwikkelje", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Oer", @@ -51,78 +35,30 @@ "message": "Privacybelied", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "uBO Lite yn-/útskeakelje foar dizze website", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Dashboerd iepenje", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Elemint­wisker­modus iepenje", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Elemint­kiezer­modus iepenje", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtermodus", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Op dizze website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "In probleem op dizze website melde", + "message": "In probleem melde", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klik om jo wizigingen permanint te meitsjen.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klik om jo wizigingen ûngedien te meitsjen.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Dashboerd iepenje", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mear", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klik om uBO Lite wiidweidige machtigingen te ferlienen op dizze website.\nWiidweidige machtigingen soargje foar effektivere ynhâldsblokkearring.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klik om wiidweidige machtigingen op dizze website yn te lûken.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Minder", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "It tal blokkearre oanfragen op it piktogram toane", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Foarmjouwing", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Oanpaste aksintkleur", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP-rapporten blokkearje", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Wiidweidich filterjen op alle websites ynskeakelje", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kin allinnich wiidweidich filterjen op in bepaalde website tapasse, neidat jo de útwreiding eksplisyt tastimmingen ferliend hawwe om gegevens op dy website oan te passen. Fia dizze ynstelling kinne jo tastimmingen foar wiidweidich filterjen oan alle websites tagelyk ferliene.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standert", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malwaredomeinen", + "message": "Beskerming tsjin malware, befeiliging", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Gebieden, talen", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ien filter per rigel. In filter kin in gewoane hostnamme, of in EasyList-kompatibel filter wêze. Rigels begjinnend mei ! wurde negearre.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Ymportearje en tafoegje…", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksportearje…", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "myn-ublock-statyske-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "De fertroude-website-ynstruksjes skriuwe foar op hokker websiden uBO Lite útskeakele wurde moat. Ien fermelding per rigel.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Ymportearje en tafoegje…", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksportearje…", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "myn-ublock-fertroude-websites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Ymportearje / Eksportearje", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Plak hjir spesifike kosmetyske filters om ta te foegjen", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Wizigingslochboek", @@ -211,25 +123,73 @@ "message": "Eksterne ôfhinklikheden (GPLv3-kompatibel):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Ferstjoere", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Wizigingen tapasse", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Ungedien meitsje", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Wolkom", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Jo hawwe sakrekt uBO Lite ynstallearre. Hjir kinne jo de standery filtermodus foar it gebrûk op alle websites kieze.\n\nStandert wurdt de modus Basis selektearre, omdat hjirfoar gjin tastimming foar it lêzen en wizigjen fan gegevens fereaske is. As jo uBO Lite fertrouwe, kinne jo it brede tastimming foar it lêzen en wizigjen fan gegevens op alle websites ferliene, sadat standert mear avansearre filtermooglikheden foar alle websites beskikber binne.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "In filterprobleem melde", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Meld filterproblemen mei spesifike websites yn de uBlockOrigin/uAssets-probleemtracker. Fereasket in GitHub-account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Probleemoplossingsynformaasje", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Kontrolearje oft it probleem net earder meld is om foar te kommen dat frijwilligers mei dûbele meldingen belêst wurde.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Soartgelikense meldingen sykje", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adres fan de webside:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "De webside…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Meitsje in kar --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Toant advertinsjes of restanten", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Hat oerlapingen of oare ûngemakken", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detektearret uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Hat privacy-relatearre problemen", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Wurket net as uBO Lite ynskeakele is", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Iepenet net-winske ljepblêden of finsters", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Liedt ta badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "De webside labelje as ‘NSFW’ (‘Not Safe For Work’)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Nije melding meitsje", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standert filtermodus", @@ -267,6 +227,14 @@ "message": "Avansearre netwurkfiltering plus spesifike en algemiene wiidweidige filtering fan selektearre filterlisten út.\n\nFereasket brede tastimming foar it lêzen en wizigjen fan gegevens op alle websites.\n\nAlgemiene wiidweidige filtering kin in heger gebrûk fan websideboarnen feroarsaakje.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List fan hostnammen wêrfoar gjin filtering plakfynt.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[allinnich hostnammen]\nexample.com\ngames.example\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Gedrach", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Side automatysk fernije by wizigjen fan filtermodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "It tal blokkearre oanfragen op it arkbalkepiktogram toane", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Strange blokkearring ynskeakelje", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigaasje nei potinsjeel net-winske websites wurdt blokkearre, en jo krije de opsje om troch te gean.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Untwikkelersmodus", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Skeakelet tagong ta foar technyske brûkers geskikte funksjes yn.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Reservekopy", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Meitsje i reservekopy fan jo oanpaste ynstellingen neiei bestân, of set jo oanpaste ynstellingen werom fan in bestân út.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Weromsette oerskriuwt al jo aktuele oanpaste ynstellingen.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Listen sykje", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Side blokkearre", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite hat it laden fan de folgjende side opkeard:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "De side is blokkearre fanwegen in oerienkommend filter yn {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "De blokkearre side wol jo omliede nei in oare website. As jo trochgean, navigearje jo streekrjocht nei: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sûnder parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Tebek", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Dit finster slute", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "My net mear warskôgje oer dizze website", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Tochgean", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "In elemint­ fuortsmite", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Elemint­wisker­modus slute", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "In oanpast filter meitsje", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "In oanpast filter fuortsmite", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Werjefte:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Details fan filtermodus", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Oanpaste DNR-regels", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-regels fan …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamyske regelset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sesjeregelset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Bewarje", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Ungedien meitsje", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Tafoegje", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Ymportearje en tafoegje…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Eksportearje…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Reservekopy meitje…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Weromsette…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Foegje gjin ynhâld fan net-fertroude boarnen ta.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Oantal registrearre regels: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Ferpleats de skowregeler foar de beste oerienkomst", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Kieze", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Foarbyld", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Oanmeitsje", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Selektearje hjirûnder in filter om oerienkommende eleminten yn de webside te markearjen. Klik op it jiskefet om in filter fuort te smiten.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ga/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ga/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ga/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ga/messages.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,278 +0,0 @@ -{ - "extName": { - "message": "uBlock Origin Lite", - "description": "extension name." - }, - "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", - "description": "this will be in the Chrome web store: must be 132 characters or less" - }, - "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", - "description": "Appears aside each filter list in the _3rd-party filters_ pane" - }, - "dashboardName": { - "message": "uBO Lite — Dashboard", - "description": "English: uBO Lite — Dashboard" - }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, - "settingsPageName": { - "message": "Settings", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Filter lists", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" - }, - "aboutPageName": { - "message": "About", - "description": "appears as tab name in dashboard" - }, - "aboutPrivacyPolicy": { - "message": "Privacy policy", - "description": "Link to privacy policy on GitHub (English)" - }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" - }, - "popupTipReport": { - "message": "Report an issue on this website", - "description": "Tooltip used for the 'chat' icon in the panel" - }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." - }, - "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, - "popupLessButton": { - "message": "Less", - "description": "Label to be used to hide popup panel sections" - }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupDefault": { - "message": "Default", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupAds": { - "message": "Ads", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupPrivacy": { - "message": "Privacy", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupMalware": { - "message": "Malware domains", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupAnnoyances": { - "message": "Annoyances", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupMisc": { - "message": "Miscellaneous", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "3pGroupRegions": { - "message": "Regions, languages", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" - }, - "aboutChangelog": { - "message": "Changelog", - "description": "" - }, - "aboutCode": { - "message": "Source code (GPLv3)", - "description": "English: Source code (GPLv3)" - }, - "aboutContributors": { - "message": "Contributors", - "description": "English: Contributors" - }, - "aboutSourceCode": { - "message": "Source code", - "description": "Link text to source code repo" - }, - "aboutTranslations": { - "message": "Translations", - "description": "Link text to translations repo" - }, - "aboutFilterLists": { - "message": "Filter lists", - "description": "Link text to uBO's own filter lists repo" - }, - "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", - "description": "Shown in the About pane" - }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " - }, - "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", - "description": "The header text for the default filtering mode section" - }, - "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", - "description": "This describes the default filtering mode setting" - }, - "filteringMode0Name": { - "message": "no filtering", - "description": "Name of blocking mode 0" - }, - "filteringMode1Name": { - "message": "basic", - "description": "Name of blocking mode 1" - }, - "filteringMode2Name": { - "message": "optimal", - "description": "Name of blocking mode 2" - }, - "filteringMode3Name": { - "message": "complete", - "description": "Name of blocking mode 3" - }, - "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", - "description": "This describes the 'basic' filtering mode" - }, - "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", - "description": "This describes the 'optimal' filtering mode" - }, - "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", - "description": "This describes the 'complete' filtering mode" - }, - "behaviorSectionLabel": { - "message": "Behavior", - "description": "The header text for the 'Behavior' section" - }, - "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", - "description": "Label for a checkbox in the options page" - } -} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/gl/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gl/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/gl/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gl/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Un bloqueador de contido con menos permisos. Bloquea anuncios, rastreadores, criptomineiros e mais despois da instalación.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} regras, convertidas dende {{filterCount}} filtros de redes", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Panel de control", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Filter lists", + "message": "Axustes", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", + "customFiltersPageName": { + "message": "Filtros persoais", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Desenvolvemento", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Acerca de", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Política de privacidade", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "modo de filtrado", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Neste sitio web", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Informar dun problema nesta web", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Abrir o panel", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "Máis", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Menos", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Por defecto", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Anuncios", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Privacidade", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Protección contra malware, seguridade", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Molestias", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "Varios", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Rexións, linguas", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importar/Exportar", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Pega aquí os filtros cosméticos a engadir", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Rexistro de cambios", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Código fonte (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Contribúen", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Código fonte", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Traducións", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Listas de filtrado", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Dependencias externas (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Informar dun problema co filtro", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Informa de problemas cos filtros en webs concretas no seguimento de problemas en uBlockOrigin/uAssets. Require unha conta GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Información para arranxar problemas", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Para evitar a sobrecarga de traballo para as persoas voluntarias con duplicados dos problemas, comproba que aínda non se informou sobre o problema. Nota: ao premer no botón enviarás a orixe da páxina a GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Atopar denuncias parecidas", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Enderezo da páxina web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "A páxina web...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Escolle unha opción --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Mostra publicidade ou restos dela", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ten capas sobreimpostas ou elementos molestos", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detecta uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ten problemas relacionados coa privacidade", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Funciona mal se uBO Lite está activado", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Abre xanelas ou pestanas non solicitadas", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leva a software malicioso, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Etiqueta a páxina como «NSFW» (Non axeitada no traballo)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Crear nova denuncia", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Modo de filtrado por defecto", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "O modo de filtrado por defecto vaise sobrescribir usando os filtros propios para cada web. Podes axustar o modo de filtrado para calquera web acorde ás túas preferencias para esa web. Cada modo ten as súas vantaxes e inconvintes.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "sen filtrar", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "básico", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "óptimo", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "completo", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Filtrado básico na rede usando listas de filtrado seleccionadas.\n\nNon require permiso de lectura ou modificar datos do sitio web.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Filtrado avanzado da rede e filtrado estendido específico usando listas de filtrado seleccionadas.\n\nRequire permisos máis amplos para ler e modificar datos en todas as webs.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Filtro avanzado na rede e filtrado extenso usando listas xenéricas e específicas para as webs.\n\nRequire permisos máis amplos para ler e modificar datos en todas as webs.\n\nO filtrado extendido xenérico podería facer que aumentasen os recursos que usa a páxina web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista de nomes de host para os que non se fará filtrado", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[só nomes de servidor]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Comportamento", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Recargar automáticamente a páxina a cambiar o modo de filtrado", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar na icona da barra o número de peticións bloqueadas", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Activar bloqueo estrito", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Vaise bloquear a navegación en webs potencialmente non desexables, e ofrecerase a opción de bloquealas.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modo desenvolvemento", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Permitir acceso a funcións pensadas para persoas con experiencia técnica.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Copia de apoio", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Garda nun ficheiro a túa configuración ou restablece os axustes desde un ficheiro.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Ao restablecer vas sobrescribir a configuración actual.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Atopa listas", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Páxina bloqueada", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite evitou que a seguinte páxina se cargase:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Bloqueouse a páxina porque concorda cun filtro de {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "A páxina bloqueada quere redirixir a outra web. Se elixes continuar vas ir directamente a: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sen parámetros", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Volver", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Pechar esta xanela", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Non volver avisarme sobre esta web", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceder", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Entrar no modo eliminador de elementos", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Sair do modo eliminador de elementos", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Crear un filtro personalizado", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Retirar un filtro personalizado", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Ver:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalles do modo de filtrado", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Regras DNR persoais", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Regras DNR de…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Conxunto de regras dinámicas", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Conxunto de regras de sesión", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Gardar", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Reverter", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Engadir", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importar e engadir…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportar…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Gardar axustes…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restablecer…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Non engadir contido desde orixes non fiables", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Número de regras rexistradas: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move o desprazador para elixir a mellor concordancia", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Elixir", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Vista previa", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Crear", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Escolle un filtro para destacar os elementos que representa na páxina web. Preme no caldeiro do lixo para eliminar un filtro.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/gu/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gu/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/gu/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gu/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/he/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/he/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/he/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/he/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "חסם תוכן ניסיוני נטול הרשאות. מיד עם ההתקנה החסם יחסום פרסומות, עוקבים, כורים ועוד.", + "message": "חוסם תוכן ניסיוני, נטול הרשאות. חוסם מודעות, עוקבים, כורים, ועוד מיד עם ההתקנה.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "לוח־מחוונים – uBO Lite", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "אזהרה! קיימים שינויים שטרם נשמרו", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "להישאר", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "להתעלם", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "הגדרות", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "רשימות סינון", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "מסננים שלי", + "customFiltersPageName": { + "message": "מסננים בהתאמה אישית", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "אתרים מהימנים", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "פיתוח", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "על אודות", @@ -51,78 +35,30 @@ "message": "מדיניות פרטיות", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "איפשור/השבתת uBO Lite באתר זה", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "פתיחת לוח־המחוונים", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "מצב מסנן", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "באתר זה", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "דווח על בעיה באתר זה", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "פתיחת לוח־המחוונים", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "עוד", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "פחות", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "מראה", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "ערכת נושא", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "חסימת דוחות CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "ברירת מחדל", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "תחומי תוכנות זדוניות", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -148,40 +84,16 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "אזורים, שפות", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "ייצוא", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "ייצוא", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "יבוא / יצוא", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "העתיקו לכאן מסננים קוסמטים ספציפים לשם הוספה", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "יומן שינויים", @@ -208,39 +120,87 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "תלויות חיצוניות (תואם GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "שיגור", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "החזרה לאחור", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "ברוך בואך", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "דיווח על בעיית מסנן", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "לדיווח על בעיות באתרים ספציפים יש לפתוח דיווח חדש במעקב הדיווחים של uBlockOrigin/uAssets. נדרש חשבון ב GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "מידע לפתרון בעיות", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "כדי להימנע מהכבדה על מתנדבים בדווחים כפולים, נא לודא שבעיה דומה טרם דווחה.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "מצאו דיווחים דומים", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "כתובת דף האינטרנט:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "דף האינטרנט…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- בחר קטגוריה --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "הצגת פרסומות או שאריות שלהן", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "קיים ריבוד או מטרד אחר", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "מזהה את uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "בעיות הקשורות לפרטיות", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "כשל תפעולי כאשר uBO Lite פעיל", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "נפתחים לשוניות או חלונות לא רצויים", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "מוביל לנוזקה, פישינג", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "תייג את הדף כ \"NSFW\" (“Not Safe For Work” - לא בטוח למקום העבודה)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "צור דיווח חדש", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "מצב סינון ברירת מחדל", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "אופן סינון ברירת המחדל יעקף על ידי אופני סינון יעודיים לכל אתר. ניתן להתאים את אופן הסינון בכל אתר נתון, לאופן הסינון המיטבי באותו אחר. לכול אופן סינון, יתרונות וחסרונות משלו.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "ללא סינון", "description": "Name of blocking mode 0" }, "filteringMode1Name": { @@ -248,31 +208,207 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "מיטבי", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "מלא", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "סינון רשת בסיסי מרשימות סינון נבחרות.\n\nאינו מצריך הרשאת קריאה ושינוי נתונים באתרי רשת.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "סינון רשת מתקדם פלוס, וסינון נרחב ייחודי מרשימות סינון נבחרות.\n\n מצריך הרשאה לקריאה ושינוי נתונים באתרי רשת.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "סינון רשת מתקדם וסינון נרחב ייחודי מרשימות סינון נבחרות.\n\n מצריך הרשאות נרחבות לקריאה ושינוי נתונים בכל אתרי הרשת.\n\nסינון כללי מורחב עלול לגרום לצריכת משאבי רשת מוגברת.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "רשימה של שמות אתרים שלא יתבצע עליהם סינון", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[שמות אתרים בלבד]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "התנהגות", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { "message": "טעינת עמוד באופן אוטומטי עם שינוי מצב סינון", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "הצגת מספר הבקשות החסומות על הסמל", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "הפעלת חסימה קפדנית", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "ניווט אפשרי לאתרים לא רצויים יחסם ותהיה אפשרות להחליט להמשיך.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "מצב מפתחים", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "מאפשר גישה ליכולות עבור משתמשים טכניים.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "גיבוי / שחזור", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "גיבוי של ההגדרות האישיות לקובץ, או שחזור של ההגדרות האישיות מקובץ.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "השחזור יחליף את כל ההגדרות האישיות הנוכחיות.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "חיפוש רשימות", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "הדף נחסם", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite מנע טעינה של הדפים הבאים:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "הדף נחסם בגלל התאמה למסנן מהרשימה {{listname}}", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "הדף החסום רוצה להעביר אותך לאתר אחר. בחירה להמשיך תעבור ישירות ל {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "ללא פרמטרים", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "חזור", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "סגור חלון זה", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "אל תתריע לי שוב על אתר זה", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "המשך", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "הסר אלמנט", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "צא ממצב מחיקת אלמנטים", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "יצירת מסנן מותאם אישית", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "מחיקת מסנן מותאם אישית", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "הצג", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "פרטי מצב סינון", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "חוקי DNR אישיים", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "חוקי DNR של...", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "קבוצת חוקים דינמיים", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "קבוצת חוקי מפגש (session)", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "שמירה", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "ביטול שינויים", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "הוספה", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "ייבא וצרף…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "ייצוא…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "גיבוי…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "שחזור…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "אל תוסיפו תוכן ממקורות לא מהיימנים", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "מספר החוקים שנרשמו: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "הזיזו את המחוג לבחירת ההתאמה הטובה ביותר", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "בחירה", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "תצוגה מקדימה", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "יצירה", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "בחרו את המסנן למטה להצגת הרכיבים התואמים בדף האינטרנט. לחצו על פח האשפה למחיקת המסנן.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hi/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hi/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hi/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hi/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,114 +15,50 @@ "message": "uBO Lite — डैशबोर्ड", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "चेतावनी! आपके कुछ परिवर्तनों को सहेजना अभी बाकी है", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "रुकें", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "अनदेखा करें", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "सेटिंग्स", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "फिल्टर सूची", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "मेरे फ़िल्टर्स", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "विश्वस्त साइटें", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "विकास", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "परिचय", + "message": "जानकारी", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { "message": "गोपनीयता नीति", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "इस साइट के लिए uBO Lite को अक्षम/सक्षम करें", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "डैशबोर्ड खोलें", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "चीजें मिटाने के मोड में जाएं", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "चीजें चुनने के मोड में जाएं", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "फ़िल्टरिंग मोड", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "इस वेबसाइट पर", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "इस वेबसाइट पर किसी समस्या को रिपोर्ट करें", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "अपने परिवर्तनों को स्थायी बनाने के लिए क्लिक करें.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "आपके परिवर्तनों को पूर्ववत के लिए क्लिक करें", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "डैशबोर्ड खोलें", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "अधिक", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "इस साइट पर uBO Lite को विस्तारित अनुमति देने के लिए क्लिक करें.\nविस्तारित अनुमतियाँ अधिक प्रभावी सामग्री अवरोधन की अनुमति देती हैं.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "इस साइट पर विस्तारित अनुमतियों को निरस्त करने के लिए क्लिक करें", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "कम", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "ब्लॉक कि गयी चीज़ों की गिनती आइकॉन पर दिखाएं", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "रंगरूप", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "थीम", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "निर्मित रंग शैली", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": " CSP रिपोर्टों को ब्लॉक करें", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "सभी वेबसाइटों पर विस्तारित फ़िल्टरिंग सक्षम करें", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite किसी वेबसाइट पर विस्तारित फ़िल्टरिंग तभी लागू कर सकता है जब आप उस वेबसाइट पर डेटा को संशोधित करने के लिए स्पष्ट रूप से विस्तारित अनुमतियाँ प्रदान करते हैं. यह सेटिंग आपको सभी वेबसाइटों को एक साथ विस्तारित फ़िल्टरिंग की अनुमति देने की अनुमति देती है.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "डिफॉल्ट", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,44 +87,20 @@ "message": "क्षेत्र, भाषाएँ", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "प्रति पंक्ति एक फ़िल्टर. कोई फ़िल्टर एक सादा होस्टनाम, या एक EasyList-संगत फ़िल्टर हो सकता है। ! से पहले लगी पंक्तियों को अनदेखा कर दिया जाएगा.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "आयात करके जोड़ें", - "description": "English: Import and append" - }, - "1pExport": { - "message": "निर्यात", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "विश्वसनीय साइट निर्देश तय करते हैं कि कौन से वेब पेज पर uBO Lite को अक्षम किया जाना चाहिए. प्रति पंक्ति एक प्रविष्टि.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "आयात करके जोड़ें", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "निर्यात", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "परिवर्तन लॉग", + "message": "परिवर्तन पत्र", "description": "" }, "aboutCode": { - "message": "सोर्स कोड {GPLv3}", + "message": "सोर्स कोड (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -211,25 +123,73 @@ "message": "बाहरी निर्भरता (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "सबमिट करें", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "परिवर्तन लागू करें", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "पूर्ववत", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "स्वागत", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "आपने अभी-अभी uBO Lite स्थापित किया है. आप यहां सभी वेबसाइटों पर उपयोग करने के लिए डिफ़ॉल्ट फ़िल्टरिंग मोड चुन सकते हैं.\n\nडिफ़ॉल्ट रूप से, बुनियादी मोड चुना जाता है क्योंकि इसमें डेटा को पढ़ने और बदलने की अनुमति की आवश्यकता नहीं होती है. यदि आप uBO Lite पर भरोसा करते हैं, तो आप डिफ़ॉल्ट रूप से सभी वेबसाइटों के लिए अधिक उन्नत फ़िल्टरिंग क्षमताओं को सक्षम करने के लिए सभी वेबसाइटों पर डेटा को पढ़ने और बदलने की व्यापक अनुमति दे सकते हैं.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "फ़िल्टर समस्या को रिपोर्ट करें", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "विशिष्ट वेबसाइट पर फ़िल्टर समस्या को uBlockOrigin/uAssets समस्या ट्रैकर पर रिपोर्ट करें. इसके लिए एक GitHub खाते की आवश्यकता होगी.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "समस्या निवारक जानकारी", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "GitHub पर मिलती-जुलती रिपोर्ट खोजें", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "वेब पेज का पता:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "वेब पेज…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- एक प्रविष्टि चुनें --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "विज्ञापनों को या शेष बचे विज्ञापन को दिखाता है", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "ओवरले या कोई अन्य दिक्कतें हैं", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "यह uBO Lite की पहचान करता है", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "गोपनीयता से संबंधित समस्याएं हैं", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "यह uBO Lite सक्षम होने पर ठीक से काम नहीं करता", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "अवांछित टैब या विंडो खोलता है", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "बैडवेयर, फ़िशिंग की ओर ले जाता है", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "डिफ़ॉल्ट फ़िल्टरिंग मोड", @@ -267,6 +227,14 @@ "message": "चयनित फ़िल्टर सूचियों में से उन्नत नेटवर्क फ़िल्टरिंग के साथ विशिष्ट विस्तारित फ़िल्टरिंग.\n\nसभी वेबसाइटों पर डेटा पढ़ने और बदलने के लिए व्यापक अनुमति की आवश्यकता है.\n\nसामान्य विस्तारित फ़िल्टरिंग के कारण वेबपृष्ठ संसाधनों का अधिक उपयोग हो सकता है.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "होस्टनामों की सूची जिनके लिए कोई फ़िल्टरिंग नहीं होगी", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[केवल होस्ट का नाम]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "व्यवहार", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "फ़िल्टरिंग मोड बदलते समय स्वचालित रूप से पृष्ठ पुनः लोड करें", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "टूलबार आइकन पर अवरुद्ध अनुरोधों की संख्या दिखाएं", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "पृष्ठ को {{listname}} में मेल खाते फ़िल्टर के कारण अवरुद्ध किया गया था.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "ब्लॉक किया गया पेज किसी दूसरी साइट पर रीडायरेक्ट करना चाहता है. अगर आप आगे बढ़ना चुनते हैं, तो आप सीधे इस पर नेविगेट करें: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "देखें:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "सहेजें", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "पूर्ववत", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "इम्पोर्ट करें और जोड़ें…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "निर्यात…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "अविश्वसनीय स्रोतों से सामग्री न जोड़ें", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hr/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hr/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hr/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hr/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Eksperimentalni bloker sadržaja bez dopuštenja. Blokira oglase, oglasne pratitelje, kripto \"rudare\" i ostalo nakon instalacije.", + "message": "Učinkovit blokator sadržaja. Blokira oglase, oglasne pratitelje, kripto \"rudare\" i ostalo odmah nakon instalacije.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — nadzorna ploča", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Upozorenje! Niste spremili promjene", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Ostani", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignoriraj", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Postavke", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Liste filtera", + "customFiltersPageName": { + "message": "Prilagođeni filteri", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Moji filteri", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Pouzdane stranice", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Razvoj", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "O aplikaciji", @@ -51,78 +35,30 @@ "message": "Pravila privatnosti", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Omogući/onemogući uBO Lite za ovu stranicu", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Otvori nadzornu ploču", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Uđite u način rada uklanjanja elementa", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Uđite u način rada odabiranja elementa", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Način filtriranja", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": " Na ovoj web stranici", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Prijavite problem na ovoj web stranici", + "message": "Prijavi problem", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Kliknite kako bi vaše promjene postale trajne.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kliknite za poništavanje promjena.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Otvori nadzornu ploču", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Više", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Kliknite da biste dodijelili uBO Lite proširena dopuštenja na ovoj stranici.\nProširene dozvole omogućuju učinkovitije blokiranje sadržaja.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kliknite za opoziv proširenih dopuštenja na ovoj stranici", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Manje", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Pokaži broj blokiranih zahtjeva na ikoni", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Izgled", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Prilagođena glavna boja", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokiraj CSP izvješća", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Omogući prošireno filtriranje na svim web stranicama", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite može primijeniti prošireno filtriranje na određenoj web stranici samo nakon što izričito dodijelite dopuštenja proširenju za izmjenu podataka na toj web stranici. Ova vam postavka omogućuje dodjeljivanje dopuštenja za prošireno filtriranje svim web stranicama odjednom.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Zadano", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Zloćudne domene", + "message": "Zaštita od zlonamjernog softvera, sigurnost", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regije, jezici", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Jedan filtar po retku. Filtar može biti običan hostname ili filter kompatibilan sa EasyList-om. Linije sa prefiksom ! zanemarit će se.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Uvesti i dodati", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Izvoz", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Smjernice pouzdanih stranica određuju na kojim web stranicama uBO Lite treba biti onemogućen. Jedan unos po retku.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Uvesti i dodati", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Izvoz", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Uvoz / Izvoz", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Ovdje zalijepite određene vizualne filtere koje želite dodati", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Popis promjena", @@ -211,25 +123,73 @@ "message": "Vanjski korišteni programi (GPLv3-kompatiblini):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Pošalji", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Primijeni promjene", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Poništi", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Dobrodošli", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Upravo ste instalirali uBO Lite. Ovdje možete odabrati zadani način filtriranja za korištenje na svim web stranicama.\n\nPrema zadanim postavkama odabran je način rada Osnovni jer ne zahtijeva dopuštenje za čitanje i promjenu podataka. Ako vjerujete uBO Liteu, možete mu dati široko dopuštenje za čitanje i promjenu podataka na svim web stranicama kako biste prema zadanim postavkama omogućili naprednije mogućnosti filtriranja za sva web mjesta.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Prijavi problem sa filterom", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Prijavite probleme s filtrima s određenim web-lokacijama uBlockOrigin/uAssets alatu za praćenje problema. Potreban je GitHub račun.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informacije o rješavanju problema", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Kako biste izbjegli opterećivanje volontera duplim prijavama, provjerite nije li problem već prijavljen. Napomena: klik na gumb uzrokovat će slanje izvorne stranice na GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Nađi slične prijave na GitHub-u", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa web stranice:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Web stranica...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Odaberite unos --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Prikazuje oglase ili ostatke oglasa", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ima overlaye ili druge smetnje", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Otkriva uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ima problema u vezi s privatnošću", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Neispravno kada je uBO Lite omogućen", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Otvara neželjene kartice ili prozore", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Vodi do zloćudnog softvera, krađe identiteta", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Označite web stranicu kao “NSFW” (“Nije sigurno za rad”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Napravi novu prijavu na GitHub-u", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Zadani način filtriranja", @@ -267,6 +227,14 @@ "message": "Napredno mrežno filtriranje plus specifično i generičko prošireno filtriranje s odabranih popisa filtera.\n\nZahtijeva široko dopuštenje za čitanje i promjenu podataka na svim web stranicama.\n\nGeneričko prošireno filtriranje može uzrokovati veće korištenje resursa web stranice.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Popis naziva hostova za koje se neće izvršiti filtriranje.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[samo nazivi hostova]\nexample.com\ngames.example", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ponašanje", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatski ponovno učitaj stranicu pri promjeni načina filtriranja", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Prikaži broj blokiranih zahtjeva na ikoni alatne trake", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Omogući strogo blokiranje", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigacija do potencijalno nepoželjnih stranica bit će blokirana i bit će vam ponuđena opcija za nastavak.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Način rada za programere", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Omogućuje pristup značajkama prikladnim za tehničke korisnike.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sigurnosna kopija", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Napravite sigurnosnu kopiju prilagođenih postavki u datoteku ili ih vratite iz datoteke.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Vraćanje će prebrisati sve vaše trenutne prilagođene postavke.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Pronađi liste", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Stranica blokirana", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite je spriječio učitavanje sljedeće stranice:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Stranica je blokirana zbog odgovarajućeg filtra u {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Blokirana stranica želi preusmjeriti na drugu stranicu. Ako odlučite nastaviti, otići ćete izravno na: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametara", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Idi natrag", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Zatvori ovaj prozor", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ne upozoravaj me više za ovu web stranicu", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Nastavi", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Ukloni element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Zatvori način rada uklanjanja elementa", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Napravi prilagođeni filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Ukloni prilagođeni filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Pregled:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalji načina filtriranja", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Prilagođena pravila DNR-a", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR pravila …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dinamički skup pravila", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Skup pravila sesije", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Spremi", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Poništi", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Dodaj", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Uvesti i dodati...", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Izvoz...", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sigurnosno kopiranje…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Vraćanje…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Ne dodavajte sadržaj iz nepouzdanih izvora", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Broj registriranih pravila: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Pomaknite klizač za odabir najboljeg podudaranja", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Odaberi", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Pregled", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Napravi", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Odaberite filter u nastavku kako biste istaknuli odgovarajuće elemente na web stranici. Kliknite koš za smeće kako biste uklonili filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hu/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hu/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hu/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hu/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Engedélyt nem igénylő tartalomblokkoló. A telepítés után azonnal blokkolja a hirdetéseket, nyomkövetőket, bányászokat és egyebeket.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} szabály, {{filterCount}} hálózati szűrőből átalakítva", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Vezérlőpult", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Filter lists", + "message": "Beállítások", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", + "customFiltersPageName": { + "message": "Saját szűrők", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Fejlesztés", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Névjegy", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Adatvédelmi irányelvek", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "szűrési mód", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Ezen a weboldalon", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Oldalon lévő probléma jelentése", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Vezérlőpult megnyitása", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Kattintson az uBO Lite kiterjesztett hozzáférés engedélyezéséhez ezen az oldalon.\nA kiterjesztett hozzáféréssel a szűrés hatékonysága növekszik.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kattintson a kiterjesztett hozzáférés visszavonásához ezen az oldalon.", + "message": "Több", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Kevesebb", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Alapértelmezett", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Hirdetések", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Adatvédelem", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware domainek", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Bosszúságok", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "Egyéb", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Régiók, nyelvek", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importálás/exportálás", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Illessze be ide a hozzáadandó kozmetikai szűrőket", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Változások listája", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Forráskód (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Közreműködők", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Forráskód", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Fordítások", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Szűrőlisták", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Külső függőségek (GPLv3-kompatibilis):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Szűrőhiba jelentése", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Az adott webhelyeket érintő szűrőhibákat a uBlockOrigin/uAssets hibakövetőjében jelentse. Ehhez GitHub-fiók szükséges.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Hibakeresési információk", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Az önkéntesek terhelésének csökkentése érdekében győződjön meg róla, hogy a hiba még nem lett jelentve. Megjegyzés: a gombra kattintás azt okozza, hogy a lap eredete el lesz küldve a GitHub részére.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Hasonló jelentések keresése", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "A weboldal címe:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "A weboldal…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Válasszon egy bejegyzést --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Hirdetéseket vagy azok maradványait jeleníti meg", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Átfedő vagy egyéb zavaró elemeket tartalmaz", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Észleli az uBO Lite-ot", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Adatvédelmi problémákat vet fel", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Hibásan működik, ha a uBO Lite be van kapcsolva", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Kéretlen lapokat vagy ablakokat nyit meg", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Kártékony programokhoz, adathalászathoz vezet", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "A weboldal megjelölése „NSFW”-ként („Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Új jelentés létrehozása GitHub-ra", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Alapértelmezett szűrési mód", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Az alapértelmezett szűrési módot a webhelyenkénti szűrési módok felülírják. Bármely webhelyen beállíthatja a szűrési módot aszerint, hogy melyik mód működik a legjobban az adott webhelyen. Mindegyik módnak megvannak a maga előnyei és hátrányai.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "nincs szűrés", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "alapvető", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "optimális", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "teljes", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Alapvető hálózati szűrés a kiválasztott szűrőlistákból.\n\nNem igényel engedélyt a webhelyeken található adatok olvasásához és módosításához.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Speciális hálózati szűrés plusz speciális kiterjesztett szűrés a kiválasztott szűrőlistákból.\n\nSzéles körű engedély szükséges az adatok olvasásához és módosításához az összes webhelyen.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Speciális hálózati szűrés, valamint speciális és általános kiterjesztett szűrés a kiválasztott szűrőlistákból.\n\nSzéles körű engedély szükséges az adatok olvasásához és módosításához az összes webhelyen.\n\nAz általános kiterjesztett szűrés nagyobb weboldal-erőforrás-felhasználást eredményezhet.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Azon gépnevek listája, amelyek esetében nem történik szűrés.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[csak kiszolgálónevek]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Viselkedés", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Az oldal automatikus újratöltése a szűrési mód megváltoztatásakor", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Blokkolt kérések számának megjelenítése az eszköztárikonon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Szigorú blokkolás engedélyezése", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Az esetleges nem kívánatos webhelyekre való navigáció blokkolva lesz, és rákérdez arra, hogy folytatja-e.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Fejlesztői mód", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Hozzáférést biztosít a képzettebb felhasználóknak való funkciókhoz.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Biztonsági mentés", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Egyéni beállítások fájlbamentése, vagy az egyéni beállítások helyreállítása egy fájlból.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "A helyreállítás felülírja a jelenlegi egyéni beállításokat.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Listák keresése", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Oldal blokkolva", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "A uBO Lite megakadályozta a következő oldal betöltését:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Az oldal a(z) {{listname}} listában lévő illeszkedő szűrő miatt blokkolva lett.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "A blokkolt oldal egy másik webhelyre akarja átirányítani. Ha a folytatást választja, akkor közvetlenül ide fog navigálni: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "paraméterek nélkül", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Vissza", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Ablak bezárása", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ne figyelmeztessen többet erről az oldalról", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Folytatás", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Belépés az elemeltávolító módba", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Kilépés az elemeltávolító módból", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Egyéni szűrő létrehozása", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Egyéni szűrő eltávolítása", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Nézet:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Szűrési mód részletei", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Egyéni DNR szabályok", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR szabályok ehhez…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dinamikus szabálykészlet", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Munkamenet szabálykészlete", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Mentés", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Visszaállítás", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Hozzáadás", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importálás és hozzáadás…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportálás…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Biztonsági mentés…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Helyreállítás…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Ne adjon hozzá megbízhatatlan forrásokból származó tartalmat.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Regisztrált szabályok száma: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Használja a csúszkát a legjobb egyezés kiválasztásához", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Kiválasztás", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Előnézet", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Létrehozás", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Válasszon alább egy szűrőt, hogy kiemelje az egyező elemeket a weboldalon. Kattintson a kuka ikonra egy szűrő eltávolításához.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hy/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hy/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/hy/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hy/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Փբովանդակության արգելափակիչ, որը չի պահանջում թույլտվություններ։ Արգելափակում է ազդերը, հետագծիչները, մայներները և շատ ավելին։", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} կանոն, որոնք փոխարկված են {{filterCount}} ցանցային զտիչներից", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Կառավահան", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "Կարգավորումներ", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Ընդլայնման մասին", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Գաղտնիության քաղաքականություն", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "զտման ռեժիմ", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Զեկուցել կայքի հետ խնդրի մասին", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Բացել կառավահանը", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "Ավելին", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Պակաս", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Լռելյայն", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Գովազդ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Գաղտնիություն", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Վնասակար տիրույթներ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Ջղայնացնող տարրեր", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "Տարբեր", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Տարածաշրջաններ, լեզուներ", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Փոփոխությունների մատյան", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Աղբյուրի կոդ (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Մասնակիցներ", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Աղբյուրի կոդ", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Թարգմանություն", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Զտիչների ցանկեր", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Արտաքին կախվածություններ (GPLv3-համատեղելի)՝", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Վեբկայքը՝", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Զտման լռելյայն ռեժիմ", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Զտման լռելյայն ռեժիմը վերասահմանվում է յուրաքանչյուր կայքի զտման ռեժիմներով։ Դուք կարող եք ջոկել ամենաարդյունավետ զտման ռեժիմը ցանկացած կայքում։ Յուրաքանչյուր ռեժիմ ունի իր առավելություններն ու թերությունները։", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "առանց զտման", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "հիմնական", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "գերադասելի", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "ամբողջական", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Ցանցային հիմնական զտում ըստ ընտրված զտիչների ցուցակների։\n\nԿայքերում տվյալները կարդալու և փոփոխելու թույլտվություն չի պահանջում։", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Ընդլայնված ցանցային զտում՝ ընտրված զտիչների ցուցակների համաձայն հատուկ զտման հետ միասին։\n\nՊահանջում է տվյալները բոլոր կայքերում կարդալու և փոփոխելու թույլտվություն։", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Ընդլայնված ցանցային զտում, ինչպես նաև հատուկ և առաջադեմ ընդհանուր զտում ընտրված զտիչների ցանկերի համաձայն։\n\nՊահանջում է բոլոր կայքերում տվյալները կարդալու և փոփոխելու թույլտվություն։\n\nԱռաջադեմ ընդհանուր զտումը կարող է առաջացնել վեբ էջի կողմից ռեսուրսների սպառման ավելացում:", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Հյուրերի անունների ցանկ, որոնց համար զտում չի իրականացվի", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Վարք", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Զտման ռեժիմը փոխելիս ինքնաշխատորեն վերաբեռնել էջը", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Ցուցադրել արգելափակված հայտերի քանակը գործիքների վահանակին", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Հետ գնալ", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Փակել այս պատուհանը", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Շարունակել", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/id/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/id/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/id/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/id/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — Dasbor", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Peringatan! Anda memiliki ubahan yang belum disimpan", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Tinggal", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Abaikan", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Pengaturan", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Daftar Filter", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Filter Saya", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Situs Terpercaya", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Mengembangkan", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Tentang", @@ -51,78 +35,30 @@ "message": "Kebijakan privasi", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Aktif/nonaktifkan uBO Lite untuk situs ini", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Buka dasbor", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Memasuki mode penghapus elemen", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Memasuki mode pemilihan elemen", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "mode filter", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Di situs ini", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Laporkan masalah situs web ini", + "message": "Laporkan masalah pada situs ini", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klik untuk membuat ubahan Anda permanen.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klik untuk membatalkan ubahan Anda.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Buka dasbor", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Lainnya", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klik untuk memberi uBO Lite izin tambahan pada situs ini.\nIzin tambahan memungkinkan pemblokiran konten yang lebih efektif.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klik untuk membatalkan izin tambahan pada situs ini", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Lebih sedikit", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Tampilkan jumlah permintaan yang diblokir pada ikon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Tampilan", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Warna aksen khusus", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokir laporan CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Aktifkan filter yang diperluas pada semua situs web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite dapat menerapkan filter yang diperluas pada situs web tertentu hanya setelah Anda secara eksplisit memberi izin ekstensi untuk memodifikasi data pada situs tersebut. Pengaturan ini memungkinkan Anda memberi izin filter yang diperluas ke semua situs web sekaligus.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Bawaan", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Wilayah, bahasa", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Satu filter per baris. Filter dapat berupa nama hos, atau filter yang kompatibel dengan EasyList. Baris yang diawali dengan ! akan diabaikan.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Impor dan tambahkan", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Ekspor", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Arahan situs terpercaya menentukan pada halaman web mana uBO Lite harus dinonaktifkan. Satu entri per baris.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Impor dan tambahkan", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Ekspor", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Catatan perubahan", @@ -211,25 +123,73 @@ "message": "Dependensi eksternal (kompatibel GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Kirim", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Terapkan perubahan", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Urungkan", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Selamat datang", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Terima kasih telah memasang uBO Lite. Anda bisa memilih di sini mode filter bawaan untuk digunakan pada semua situs web.\n\nSecara bawaan, mode Dasar akan dipilih karena tidak membutuhkan izin untuk membaca dan mengubah data. Jika Anda mempercayai uBO Lite, Anda bisa memberikan izin tambahan untuk membaca dan mengubah data pada semua situs web untuk mengaktifkan kemampuan filter yang lebih luas untuk semua situs web secara bawaan.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Laporkan masalah filter", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Laporkan masalah filter situs web tertentu ke pelacak masalah uBlockOrigin/uAssets. Membutuhkan akun GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informasi pemecahan masalah", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Untuk menghindari membebani sukarelawan dengan laporan duplikat, harap verifikasi bahwa masalah tersebut belum dilaporkan.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Temukan laporan serupa", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Alamat laman web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Laman web…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pilih entri --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Menampilkan iklan atau sejenisnya", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Memiliki overlay atau gangguan lainnya", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Mendeteksi uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Memiliki masalah terkait privasi", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfungsi saat uBO Lite diaktifkan", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Membuka tab atau jendela yang tidak diinginkan", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Mengarah ke perangkat lunak jahat, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label laman web sebagai “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Buat laporan baru", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Mode filter bawaan", @@ -267,6 +227,14 @@ "message": "Filter jaringan lanjutan ditambah filter spesifik dan umum yang diperluas dari daftar filter yang dipilih.\n\nMembutuhkan banyak izin untuk membaca dan mengubah data pada semua situs web.\n\nFilter umum yang diperluas dapat menyebabkan penggunan sumber daya situs web menjadi lebih tinggi.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Daftar nama host yang tidak akan difilter.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hanya nama host]\ncontoh.com\npermainan.contoh\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Perilaku", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Otomatis memuat ulang halaman web saat mengubah mode filter", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Tampilkan jumlah permintaan yang diblokir pada ikon toolbar", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Aktifkan pemblokiran ketat", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigasi ke situs yang mungkin tidak diinginkan akan diblokir, dan Anda akan ditawari opsi untuk melanjutkan.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Mode pengembang", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Mengaktifkan akses ke fitur yang sesuai untuk pengguna teknis.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Temukan daftar", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Halaman diblokir", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite telah mencegah pemuatan halaman berikut:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Halaman diblokir karena cocok dengan filter yang ada di dalam {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Halaman yang diblokir ingin beralih ke situs yang lain. Jika Anda memilih untuk melanjutkan, Anda akan langsung diarahkan ke: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "tanpa parameter", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Kembali", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Tutup jendela ini", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Jangan peringatkan saya lagi tentang situs ini", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Lanjutkan", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Masuk ke mode penghapus elemen", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Keluar dari mode penghapus elemen", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Buat filter khusus", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Hapus filter khusus", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Melihat", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detail mode penyaringan", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Aturan DNR khusus", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Aturan DNR tentang …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Aturan dinamis ", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Aturan sesi", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Simpan", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Kembalikan", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Impor dan tambahkan…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Ekspor…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Jangan tambahkan konten dari sumber tidak terpercaya", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Jumlah aturan yang terdaftar: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Pindahkan penggeser untuk memilih kecocokan terbaik", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pilih", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Pratinjau", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Buat", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Pilih filter di bawah ini untuk menyorot elemen yang cocok di halaman web. Klik ikon tempat sampah untuk menghapus filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/it/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/it/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/it/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/it/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Un blocco dei contenuti sperimentale, senza permessi, che blocca per impostazione predefinita annunci, tracker, minatori e [...]", + "message": "Un efficiente bloccatore dei contenuti. Blocca annunci, tracker, minatori e altro ancora subito dopo l'installazione.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,179 +12,91 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Cruscotto", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Attenzione! Ci sono modifiche non salvate", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Resta", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignora", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Opzioni", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Liste filtri", + "message": "Impostazioni", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "I miei filtri", + "customFiltersPageName": { + "message": "Filtri personalizzati", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Siti affidabili", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Sviluppo", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Informazioni", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Informativa sulla privacy", + "message": "Politica di riservatezza", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Abilita/Disabilita uBO Lite per questo sito", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Apri la dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Accedi alla modalità elimina elemento", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Accedi alla modalità seleziona elemento", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Modalità di filtraggio", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "In questo sito web", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Segnala un problema su questo sito", + "message": "Segnala un problema con questo sito", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Clicca per rendere le tue scelte permanenti.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Clicca per annullare i cambiamenti.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Apri il cruscotto", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "Altro", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Clicca per concedere a uBO Lite permessi estesi su questo sito.\nI permessi estesi consentono un blocco più efficace dei contenuti.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Clicca per revocare i permessi estesi su questo sito", + "message": "Più", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { "message": "Meno", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Visualizza il numero degli elementi bloccati sull'icona", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Aspetto", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Colore di risalto personalizzato", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blocca i report CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Abilita il filtraggio esteso su tutti i siti web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite può applicare il filtraggio esteso a un determinato sito web solo dopo aver concesso esplicitamente all'estensione le autorizzazioni per la modifica dei dati su quel sito web. Questa impostazione consente di concedere le autorizzazioni per il filtraggio esteso a tutti i siti web contemporaneamente.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Predefinite", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Pubblicità", + "message": "Inserz.", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Riservatezza", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domini con malware", + "message": "Domini che diffondono virus", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Elementi fastidiosi", + "message": "Scocciature", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Varie", + "message": "Vari", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regioni, lingue", + "message": "Lingue e regioni", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Un filtro per riga. Un filtro può essere un semplice hostname, o un filtro compatibile con EasyList. Ogni riga che comincia con ! verrà ignorata.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importa e aggiungi", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Esporta", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-filtri-statici-personalizzati_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Lista delle pagine web dove uBO Lite è disabilitato. Una voce per riga.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importa e aggiungi", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Esporta", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-whitelist_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importa / Esporta", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Incolla qui i filtri cosmetici specifici da aggiungere", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Registro delle modifiche", + "message": "Reg. modifiche", "description": "" }, "aboutCode": { @@ -204,39 +116,87 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Liste filtri", + "message": "Liste dei filtri", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "Dipendenze esterne (GPLv3-compatibili):", + "message": "Dipendenze esterne (in linea con la GPL v3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Invia", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Salva i cambiamenti", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Ripristina", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Benvenuto", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Hai appena installato uBO Lite. Puoi scegliere qui la modalità di filtraggio predefinita da utilizzare su tutti i siti web.\n\nPer impostazione predefinita, viene selezionata la modalità Basilare, che non richiede l'autorizzazione a leggere e modificare i dati. Se ti fidi di uBO Lite, puoi concedergli un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web, in modo da attivare funzionalità di filtraggio più avanzate per tutti i siti web per impostazione predefinita.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Segnala un problema con un filtro", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Segnala i problemi di filtraggio con siti web specifici nel tracciatore problemi uBlockOrigin/uAssets. Richiede un account GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informazioni sulla risoluzione dei problemi", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Per evitare di gravare sui volontari con segnalazioni duplicate, verifica che il problema non sia già stato segnalato. Nota: cliccando il pulsante l'origine della pagina sarà inviata a GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Trova segnalazioni simili in GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Indirizzo della pagina web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "La pagina web...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "− Scegli una voce −", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Mostra inserzioni o loro residui", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ha sovrapposizioni o altri fastidi", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Rileva uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ha problemi relativi alla riservatezza", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunzionamenti quando uBO Lite è abilitato", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Apre schede o finestre indesiderate", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Porta a badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Contrassegna la pagina web come “NSFW”. (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Crea nuova segnalazione in GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Modalità di filtraggio predefinita", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "La modalità di filtraggio predefinita sarà sovrascritta dalle modalità di filtraggio per sito web. È possibile regolare la modalità di filtraggio su un determinato sito web in base alla modalità che funziona meglio su quel sito. Ogni modalità presenta vantaggi e svantaggi.", + "message": "La modalità di filtraggio predefinita sarà sovrascritta dalle modalità di filtraggio per sito web. È possibile regolare la modalità di filtraggio in un determinato sito web in base alla modalità che funziona meglio per quel sito. Ogni modalità presenta vantaggi e svantaggi.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -256,23 +216,199 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Filtraggio di rete di base da liste di filtri selezionate.\n\nNon richiede l'autorizzazione a leggere e modificare i dati sui siti web.", + "message": "Filtraggio di rete di base da liste di filtri selezionate.\n\nNon richiede l'autorizzazione per leggere e modificare i dati nei siti web.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web.", + "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati in tutti i siti web.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico e generico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web.\n\nIl filtraggio esteso generico può causare un maggiore utilizzo delle risorse della pagina web.", + "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico e generico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati in tutti i siti web.\n\nIl filtraggio esteso generico può causare un maggiore uso delle risorse della pagina web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista dei nomi host per i quali non verrà effettuato alcun filtraggio.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[solo nomi di host]\nesempio.com\ngiochi.esempio\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Ricarica automaticamente la pagina quando si cambia la modalità di filtraggio", + "message": "Ricarica la pagina automaticamente quando cambi la modalità di filtraggio", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostra il numero delle richieste bloccate sull'icona nella barra degli strumenti", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Abilita il blocco rigido", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "La navigazione verso siti potenzialmente indesiderati verrà bloccata e ti verrà offerta la possibilità di procedere.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modalità sviluppatore", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Abilita l'accesso a funzioni adatte a utenti tecnici.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Copia le impostazioni personali in un file, o rimuovile da un file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Il ripristino sovrascriverà le impostazioni personali in uso.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Trova elenchi", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Pagina bloccata", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite ha impedito alla seguente pagina di caricarsi:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "La pagina è stata bloccata a causa di un filtro corrispondente in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "La pagina bloccata vuole reindirizzare a un altro sito. Se scegli di procedere, navigherai direttamente su: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "senza parametri", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Torna indietro", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Chiudi questa finestra", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Non avvisarmi di nuovo riguardo questo sito", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Procedi", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Accedi alla modalità blocco rapido", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Esci dalla modalità blocco rapido", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Crea un filtro personalizzato", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Rimuovi un filtro personalizzato", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vista:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Dettagli modalità filtraggio", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Regole DNR personali", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Regole DNR per …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Gruppo regole dinamiche", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Gruppo regole di sessione", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Salva", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Ritorna", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Aggiungi", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importa e accoda…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Esporta…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Copia…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Ripristina…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Non aggiungere contenuti da fonti non affidabili", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Numero di regole registrate: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Sposta il cursore per selezionare la corrispondenza migliore", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Scegli", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Anteprima", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Crea", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Seleziona un filtro per evidenziare gli elementi corrispondenti nella pagina web. Clicca il cestino per rimuovere un filtro.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ja/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ja/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ja/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ja/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "権限不要の実験的なコンテンツブロッカーです。インストールしてすぐに、広告、トラッキング、マイニングなどをブロックします。", + "message": "実験的で要求権限の少ないコンテンツブロッカー - 広告・トラッカー・マイニングスクリプトなどをブロック", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — ダッシュボード", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "警告! 保存していない変更があります", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "留まる", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "無視", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "設定", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "フィルターリスト", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "マイフィルター", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "信頼するサイト", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "開発", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "uBO Lite について", @@ -51,78 +35,30 @@ "message": "プライバシーポリシー", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "このサイトで uBO Lite を無効/有効化", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "ダッシュボードを開く", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "要素抹消モードに入る", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "要素選択モードに入る", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "フィルタリングモード", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "このサイト上で", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "このサイト上での問題を報告", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "クリックすると変更を確定します。", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "クリックすると変更を元に戻します。", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "ダッシュボードを開く", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "さらに表示", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "クリックすると、このサイトに対して uBO Lite の拡張権限を許可します。\nより効果的なコンテンツブロックを可能にします。", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "クリックしてこのサイトに対する uBO Lite の拡張権限許可を取り消し", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "折りたたむ", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "ブロックしたリクエストの数をアイコンに表示する", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "外観", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "テーマ", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "カスタムアクセントカラー", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP レポートをブロックする", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "すべてのウェブサイトで拡張フィルタリングを有効化", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Liteはウェブサイトに対して、そのウェブサイトのデータを変更する権限を拡張機能に明示的に付与した場合にのみ、拡張フィルタリングを適用できます。この設定を有効化すると、すべてのウェブサイトに対して一括で拡張フィルタリングの許可を与えられます。", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "既定", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "地域・言語", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "1 行につき 1 つのフィルターです。フィルターはただのホスト名でも EasyList と同じ形式でも構いません。! を先頭に付けた行は無視されます。", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "インポートして追加", - "description": "English: Import and append" - }, - "1pExport": { - "message": "エクスポート", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "[信頼するサイト] では uBO Lite を無効にするウェブページを指定します。1 行に つき 1 つです。", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "インポートして追加", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "エクスポート", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "更新履歴", @@ -208,28 +120,76 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "外部依存関係 (GPLv3 と両立):", + "message": "外部依存関係 (GPLv3 互換):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "送信", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "変更を適用", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "元に戻す", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "ようこそ", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "uBO Lite のインストールが完了しました。すべてのサイトに適用するデフォルトのフィルタリングモードを選んでください。\n\nデフォルトでは、データの読み書きの権限が必要ない基本モードが選択されています。 uBO Lite を信用してもらえるなら、データの読み書きや変更の権限を許可してもらえればすべてのサイトに対してより詳細なフィルタリングを有効化できます。", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "フィルターの問題を報告する", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "uBlockOrigin/uAssets issue tracker で特定のウェブサイトでのフィルターの問題を報告します。GitHub アカウントが必要です", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "トラブルシューティング情報", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "重複した報告によってボランティアに負担をかけないように、問題がすでに報告されていないか確認してください。 注意: ボタンをクリックすると、ページのオリジンが GitHub に送信されます。", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "似た報告を探す", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "ウェブページのアドレス:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "ウェブページ…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- エントリーを選択 --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "広告または消し残りが表示される", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "オーバーレイなど邪魔なものがある", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "uBO Lite が検出される", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "プライバシーに関連する問題がある", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "uBO Lite 有効時に機能しなくなる", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "勝手にタブやウィンドウが開く", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "悪質ソフトやフィッシングへの誘導", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "ウェブページを “NSFW” (“Not Safe For Work”) としてラベル付け", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "新しい報告を作成", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "デフォルトのフィルタリングモード", @@ -267,6 +227,14 @@ "message": "特定のフィルターリストを使ったネットワークフィルタリングと一般的・サイト別の拡張フィルタリングです。\n\nすべてのウェブサイトのデータの読み書き権限を必要とします。\n\n一般的な拡張フィルタリングを使うとリソース消費量が増えるかもしれません。", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "フィルタリングを行わないホスト名のリスト", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[ホスト名のみ]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "動作", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "フィルタリングモード変更時にページを自動再読み込みする", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "ブロックしたリクエストの数をツールバーのアイコンに表示", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "厳格なブロックを有効化", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "望ましくない可能性のあるサイトへのナビゲーションはブロックされ、次に進むためのオプションが表示されます。", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "開発者モード", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "技術ユーザーに適した機能へのアクセスを有効にします。", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "バックアップ", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "カスタムした設定をファイルとしてバックアップしたり、ファイルからリストアしたりできます。", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "リストアすると現在のカスタムした設定がすべて上書きされます。", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "リストを検索", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "ブロックしたページ", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite はこのページの読み込みをブロックしています:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "このページは、{{listname}} のフィルターに一致したためブロックされました。", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "ブロックしたページは別のサイトへリダイレクトしようとしています。続行すると次の URL へ移動します: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "パラメータを除いた URL", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "戻る", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "このウィンドウを閉じる", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "今後このサイトに関する警告を表示しない", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "続行する", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "要素抹消モードを開始", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "要素抹消モードを終了", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "カスタムフィルターの作成", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "カスタムフィルターの削除", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "表示:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "フィルタリングの詳細", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "独自DNRルール", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNRのルール...", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "動的ルールセット", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "セッションルールセット", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "保存", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "元に戻す", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "インポートと追加", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "エクスポート…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "バックアップ…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "リストア…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "信頼できないソースから追加しないでください。", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "登録されたルールの数: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "スライダーを動かして最適なものを選ぶ", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "取得", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "プレビュー", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "作成", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "下のフィルターを選択すると、ウェブページ内の一致する要素がハイライトされます。フィルタを削除するには、ゴミ箱をクリックしてください。", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ka/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ka/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ka/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ka/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — მაჩვენებლები", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "ყურადღება! ცვლილებები შეუნახავია", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "დარჩენა", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "აცილება", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "პარამეტრები", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "ფილტრების სიები", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "ჩემი ფილტრები", + "customFiltersPageName": { + "message": "მორგებული ფილტრები", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "სანდო საიტები", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "შემუშავება", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "შესახებ", @@ -51,78 +35,30 @@ "message": "პირადულობის დებულება", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "გამოირთოს/ჩაირთოს uBO Lite ამ საიტზე", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "სამართავის გახსნა", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "ნაწილების ამოჭრა", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "ნაწილების შერჩევა", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "გაფილტვრის რეჟიმი", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "ამ ვებსაიტზე", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "ამ საიტზე ხარვეზის მოხსენება", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "დაწკაპეთ ცვლილებების მუდმივად შენახვისთვის.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "დაწკაპეთ შეტანილი ცვლილებების გაუქმებისთვის.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "სამართავის გახსნა", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "ვრცლად", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "დაწკაპეთ და uBO Lite მიიღებს დამატებით ნებართვებს ამ საიტზე.\nდამატებითი ნებართვებით მეტად შედეგიანად შეზღუდვას შეძლებს.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "დაწკაპეთ დამატებითი ნებართვის გასაუქმებლად ამ საიტზე", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "მოკლედ", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "შეზღუდული მოთხოვნების რაოდენობის ჩვენება ხატულაზე", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "იერსახე", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "თემა", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "სასურველი შეფერილობა", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP-მოხსენებების აკრძალვა", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "გაფართოებული ფილტრაციის ჩართვა ყველა საიტზე", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite შეძლებს გაფართოებული ფილტრაციის გამოყენებას მითითებულ საიტზე მას შემდეგ, რაც დართავთ მას ამ საიტზე მონაცემების შეცვლის ნებას. ამ პარამეტრით კი შეძლებთ ერთბაშად დართოთ გაფართოებული ფილტრაციის გამოყენების ნება ყველა საიტზე.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "ნაგულისხმევი", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "მხარეები, ენები", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "თითოეული ფილტრი ცალკეულ ხაზზე. ფილტრი შეიძლება იყოს საიტის უბრალო დასახელება ან Adblock Plus-სთან თავსებადი მითითებები. ხაზები ! თავსართით უგულებელყოფილი იქნება.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "შემოტანა და დამატება", - "description": "English: Import and append" - }, - "1pExport": { - "message": "შენახვა", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ჩემი-ublock-მუდმივი-ფილტრები_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "გამონაკლისებში მითითებულ ვებგვერდებზე uBO Lite გამოირთვება. თითო ჩანაწერი ცალკეულ ხაზზე.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "შემოტანა და დამატება", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "შენახვა", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ჩემი-ublock-სანდო-საიტები_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "შემოტანა / გატანა", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "აქ ჩასვით გარეგნული ნაწილების ცალკეული ფილტრები დასამატებლად", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "ცვლილებები", @@ -211,28 +123,76 @@ "message": "ცალკეული დაქვემდებარებული პროექტები (GPLv3-თან თავსებადი):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "წარდგენა", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "ცვლილებების ასახვა", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "დაბრუნება", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "მოგესალმებით", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "თქვენ ახლახან დააყენეთ uBO Lite. აქვე შეგიძლიათ აირჩიოთ ფილტრაციის ნაგულისხმევი რეჟიმი ყველა საიტზე გამოსაყენებლად.\n\nნაგულისხმევად ძირითადი რეჟიმია შერჩეული, ვინაიდან არ საჭიროებს მონაცემთა წაკითხვისა და ცვლილების ნებართვებს. თუ თქვენთვის სანდოა uBO Lite, შეგიძლიათ დართოთ მონაცემთა წაკითხვისა და შეცვლის ნება ყველა საიტზე გაუმჯობესებული ფილტრაციის ნაგულისხმევად გამოყენებისთვის.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "ფილტრის ხარვეზის მოხსენება", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "ცალკეულ საიტზე ფილტრების ხარვეზების მოსახსენებლად გამოიყენეთ uBlockOrigin/uAssets ხარვეზების აღსარიცხავი. დაგჭირდებათ GitHub-ანგარიში.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "მონაცემები ხარვეზის მოსაგვარებლად", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "მოხალისეები რომ არ მოცდნენ ერთნაირი მოსხენებების გაცნობით, გთხოვთ გადაამოწმოთ, უკვე ხომ არაა გაგზავნილი საჩივარი ამ ხარვეზზე. გაითვალისწინეთ: ღილაკზე დაწკაპების შედეგად გვერდის მონაცემები გაიგზავნება GitHub-ზე.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "იპოვეთ მსგავსი მოხსენებები", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "ვებგვერდის მისამართი:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "ვებგვერდი...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- შეარჩიეთ --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "აჩვენებს რეკლამებს ან მის ნარჩენებს", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "ადებს შემაწუხებელ შრეებსა და მისთანებს", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "ამჩნევს, რომ uBO Lite ჩართულია", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": " პირადულობის დაცვის ხარვეზებითაა", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "შეფერხებით მუშაობს, როცა uBO Lite ჩართულია", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "ხსნის არასასურველ ჩანართებს ან ფანჯრებს", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "გადადის მავნე, თაღლითურ შიგთავსზე", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "გვერდს დაედოს მონიშვნა „NSFW“ („შეუფერებელი შიგთავსი“ (Not Safe For Work))", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "შექმენით ახალი მოსხენება", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "ფილტრაციის ნაგულისხმევი რეჟიმი", + "message": "გაფილტვრის ნაგულისხმევი რეჟიმი", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { @@ -267,6 +227,14 @@ "message": "ქსელის გაუმჯობესებულ ფილტრაციასთან ერთად საერთო გაფართოებული ფილტრები შერჩეული სიებიდან.\n\nსაჭიროებს ყველა საიტზე მონაცემთა სრულად წაკითხვისა და შეცვლის ნებართვას.\n\nგაფართოებული ფილტრაცია ზოგჯერ ზედმეტად ზრდის დატვირთვას ვებგვერდის მონახულებისას.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "სია მისამართებისა, რომლებზეც ფილტრები არ იმოქმედებს", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[მხოლოდ მისამართის საწყისი]\nexample.com\ngames.example\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "მოქმედება", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "გვერდის ავტომატური განახლება ფილტრაციის რეჟიმის შეცვლისას", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "აჩვენეთ დაბლოკილი მოთხოვნების რაოდენობა ხელსაწყოთა ზოლის ხატულაზე", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "მკაცრი შეზღუდვის ჩართვა", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "შეიზღუდა სავარაუდოდ არასასურველ გვერდებზე გადასვლა, საშუალება გეძლევათ, მაინც განაგრძოთ.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "შემმუშვებლის რეჟიმი", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "შესაძლებლობები გამოცდილი მომხმარებლებისთვის.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "მარქაფი", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "დაამარქაფეთ მითითებული პარამეტრები ფაილში ან აღადგინეთ ფაილიდან.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "აღდგენისას ყველა მიმდინარე პარამეტრი ჩანაცვლდება.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "სიების მოძიება", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "შეზღუდული გვერდი", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite ზღუდავს მოცემული გვერდის ჩატვირთვას:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "გვერდი შეიზღუდა ფილტრით {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "ეს შეზღუდული გვერდი ცდილობს თქვენს სხვა საიტზე გადაყვანას. თუ განაგრძობთ, გაიხსნება: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "პარამეტრების გარეშე", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "უკან დაბრუნება", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "ამ ფანჯრის დახურვა", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "აღარ მეცნობოს ამ საიტზე", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "გაგრძელება", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "ნაწილების ამოჭრის რეჟიმში გადასვლა", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "ნაწილების ამოჭრის რეჟიმიდან გასვლა", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "მორგებული ფილტრის შექმნა", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "მორგებული ფილტრის მოცილება", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "ხედი:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "ფილტრის რეჟიმი ვრცლად", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "მორგებული DNR-წესები", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-წესები…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "ცვალებადი წესების კრებული", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "სეანსის წესების კრებული", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "შენახვა", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "დაბრუნება", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "დამატება", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "შეტანა და დამატება…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "გატანა…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "დამარქფება…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "აღდგენა…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "ნუ დაამატებთ შიგთავსს არასანდო წყაროებიდან.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "დამოწმებული წესები სულ: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "გადაადგილეთ სრიალა უკეთ დამთხვევისთვის", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "აღება", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "შეთვალიერება", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "შექმნა", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "აირჩიეთ ქვემოთ ფილტრი შესაბამისი ნაწილების მოსანიშნად ვებგვერდზე. დაწკაპეთ სანაგვე ყუთი ფილტრის მოსაცილებლად.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/kk/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kk/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/kk/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kk/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/kn/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kn/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/kn/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kn/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "ಅನುಮತಿ-ಕಡಿಮೆ ವಿಷಯ ಬ್ಲಾಕರ್. ಅನುಸ್ಥಾಪನೆಯ ತಕ್ಷಣವೇ ಜಾಹೀರಾತುಗಳು, ಟ್ರ್ಯಾಕರ್‌ಗಳು, ಗಣಿಗಾರರು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,131 +12,67 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "\nಯುಬಿಒ ಲೈಟ್ - ಡ್ಯಾಶ್‌ಬೋರ್ಡ್\n", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "ಸಂಯೋಜನೆಗಳು", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "ಬಗ್ಗೆ", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "ಗೌಪ್ಯತಾ ನೀತಿ\n", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "ಫಿಲ್ಟರಿಂಗ್ ಮೋಡ್", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ತೆರೆಯಿರಿ", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "ಇನ್ನಷ್ಟು", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "ಕಡಿಮೆ", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "ಪೂರ್ವನಿಯೋಜಿತ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "ಜಾಹೀರಾತುಗಳು", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "ಗೌಪ್ಯತೆ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -144,47 +80,23 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "ವಿವಿಧ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "ಪ್ರದೇಶಗಳು, ಭಾಷೆಗಳು\n", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "ಬದಲಾವಣೆಗಳು", "description": "" }, "aboutCode": { @@ -196,40 +108,88 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "ಮೂಲ ಕೊಡ್", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "ಅನುವಾದ", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿಗಳು", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -244,15 +204,15 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "ಸಾಮಾನ್ಯ", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "ಸೂಕ್ತ", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "ಪೂರ್ಣ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -267,12 +227,188 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "ನಡವಳಿಕೆ", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ko/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ko/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ko/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ko/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — 대시보드", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "경고! 저장되지 않은 변경 사항이 있습니다", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "유지", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "무시", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "설정", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "필터 목록", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "내 필터", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "신뢰하는 사이트", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "개발자용", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "정보", @@ -51,78 +35,30 @@ "message": "개인정보취급방침", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "이 사이트에 대해 uBO Lite를 켜거나 끄기", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "대시보드 열기", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "구성 요소 제거 모드로 진입", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "구성 요소 선택기 모드로 진입", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "필터링 모드", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "이 사이트의 이슈를 신고하기", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "클릭하여 변경 사항을 영구적으로 만듭니다.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "클릭하여 변경 사항을 되돌립니다.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "대시보드 열기", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "자세히", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "클릭하여 이 사이트에 대해 uBO Lite에게 확장된 권한을 부여합니다.\n확장된 권한은 더 효과적인 콘텐츠 차단을 허용합니다.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "클릭하여 이 사이트에 대한 확장된 권한을 철회합니다.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "간단히", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "차단된 요청 개수를 아이콘에 표시", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "표시", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "테마", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "사용자 지정 강조 색상", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP 보고를 차단하기", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "모든 웹사이트에 대해 확장된 필터링 켜기", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite에서 특정 사이트에서 필터링을 수행하기 위해서는 해당 사이트의 데이터 수정 권한을 일일이 부여해야 합니다. 이 설정을 이용하면 모든 웹사이트에 대해 확장된 필터링 권한을 한 번에 부여할 수 있습니다.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "기본값", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "지역, 언어", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "한 줄에 한 개의 필터를 입력하세요. 필터는 순수 호스트이름, 혹은 EasyList-호환 필터가 될 수 있습니다. 시작 부분이 ! 로 시작되면 무시됩니다.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "가져오기 및 추가하기", - "description": "English: Import and append" - }, - "1pExport": { - "message": "내보내기", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "신뢰된 사이트는 어느 웹 사이트에 uBO Lite가 비활성화되여하는 지를 말합니다. 한 줄에 한 항목씩 적으세요.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "가져오기 및 추가하기", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "내보내기", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "변경 로그", @@ -204,32 +116,80 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "필터 리스트", + "message": "필터 목록", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { "message": "외부 의존성 (GPLv3 호환):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "제출", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "변경사항 적용", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "되돌리기", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "환영합니다", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "uBO Lite를 설치하셨습니다. 모든 웹사이트에 적용할 기본 필터링 모드를 선택해주세요.\n\n데이터를 읽고 변경하는 권한이 필요 없는 기본 모드가 기본 설정입니다. uBO Lite를 신뢰하신다면, 모든 웹사이트에서 데이터를 읽고 변경하는 권한을 부여해서 모든 웹사이트에 대해 고급 필터링 기능을 기본적으로 켤 수 있습니다.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "필터 이슈 신고", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "특정 웹사이트에서 발생하는 필터 이슈를 uBlockOrigin/uAssets 이슈 트래커에 신고할 수 있습니다. GitHub 계정이 필요합니다.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "문제 해결 정보", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "봉사자들이 중복 신고로 인해 부담을 겪지 않도록, 해당 이슈가 이미 신고되지는 않았는지 확인해주시기 바랍니다.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "유사한 신고 탐색", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "웹페이지 주소:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "웹페이지가…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- 주제 선택 --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "광고나 광고 흔적을 보여줍니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "오버레이나 기타 성가신 요소를 보여줍니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "uBO Lite 사용을 감지합니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "개인정보 보호 관련 이슈가 있습니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "uBO Lite를 켜면 깨집니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "원치 않는 탭이나 창을 엽니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "악성코드, 피싱으로 유도합니다", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "웹페이지를 \"NSFW\" (“Not Safe For Work”)로 분류", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "새 신고 생성", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "기본 필터링 모드", @@ -267,6 +227,14 @@ "message": "고급 네트워크 필터링과 선택한 필터 목록을 바탕으로 특정한 확장 필터링 및 보편적인 확장 필터링을 수행합니다.\n\n모든 웹사이트에서 데이터를 읽고 쓸 수 있도록 하는 광범위한 권한이 필요합니다.\n\n보편적인 확장 필터링 기능을 이용하는 경우 웹페이지의 리소스 사용량이 증가할 수 있습니다.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "필터링을 비활성화할 호스트 이름 목록", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[호스트 이름만 작성]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "동작", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "필터링 모드를 변경할 때 페이지 자동 새로고침", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "차단된 요청 개수를 도구 모음 아이콘에 표시", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "엄격한 차단 켜기", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "잠재적으로 좋지 않은 사이트로의 접속을 차단하고, 사용자가 진행할지 선택하도록 합니다.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "개발자 모드", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "기술적 사용자를 위한 기능에 접근할 수 있도록 합니다.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "목록 찾기", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "페이지 차단됨", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite가 다음 페이지를 불러오지 못하게 했습니다.", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "이 페이지가 {{listname}} 내 필터링 항목에 해당하여 차단되었습니다.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "차단된 페이지에서 다른 사이트로 이동하려 합니다. 계속하시면, {{url}} 주소로 바로 이동합니다.", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "매개변수 없음", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "뒤로", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "창 닫기", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "다시는 이 사이트에 대해 경고하지 않기", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "계속", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "구성 요소 제거 모드로 진입", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "구성 요소 제거 모드 종료", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "보기:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "필터링 모드 상세정보", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "사용자 지정 DNR 규칙", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR 규칙…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "동적 규칙 목록", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "세션 규칙 목록", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "저장", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "되돌리기", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "가져오기 및 추가하기…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "내보내기…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "신뢰할 수 없는 출처의 콘텐츠를 추가하지 마십시오", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "등록된 규칙 수: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/lt/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lt/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/lt/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lt/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,36 +12,20 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Skydelis", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Dėmesio! Turite neišsaugotų pakeitimų", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Pasilikti", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignoruoti", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Nustatymai", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filtrų sąrašai", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mano filtrai", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Apie", @@ -51,78 +35,30 @@ "message": "Privatumo politika", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Daugiau", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mažiau", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regionai, kalbos", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksportuoti", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksportuoti", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Pakeitimų žurnalas", @@ -211,25 +123,73 @@ "message": "Išorinės priklausomybės (suderinamos su „GPLv3“):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Patvirtinti", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Taikyti pakeitimus", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,12 +227,188 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Elgsena", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Automatiškai perkrauti sveitane keičiant filtro rėžimą", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/lv/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lv/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/lv/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lv/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Izmēģinājuma, bezatļauju satura aizturētājs. Aiztur reklāmas, izsekotājus, kriptoracējus un vēl uzreiz pēc uzstādīšanas.", + "message": "Bezatļauju satura aizturētājs. Aiztur reklāmas, izsekotājus, kriptoracējus un daudz ko citu uzreiz pēc uzstādīšanas.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,114 +15,50 @@ "message": "uBO Lite — infopanelis", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Uzmanību! Ir nesaglabātas izmaiņas", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Palikt", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Neņemt vērā", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Iestatījumi", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Aizturēšanas saraksti", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Mani aizturētāji", + "customFiltersPageName": { + "message": "Pielāgoti atsijātāji", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Uzticamas vietnes", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Izstrādāt", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Par", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privātuma nosacījumi", + "message": "Konfidencialitātes nosacījumi", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Atspējot/iespējot uBO Lite šajā vietnē", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Atvērt vadības paneli", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Pārslēgties uz elementu dzēšanu", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Pārslēgties uz elementu atlasīšanu", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "aizturēšanas veids", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Šajā tīmekļvietnē", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Ziņot par nepilnību šajā vietnē", + "message": "Ziņot par nepilnību šajā tīmekļa vietnē", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Noklikšķināt, lai saglabātu izmaiņas.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klikšķināt, lai atceltu izmaiņas.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Atvērt vadības paneli", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Vairāk", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klikšķināt, lai piešķirtu uBO Lite paplašinātas tiesības šajā vietnē.\nPaplašinātas tiesības nodrošina daudz iedarbīgāku satura aizturēšanu.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klikšķināt, lai atsauktu paplašinātās tiesības šajā vietnē.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mazāk", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Attēlot aizturēto pieprasījumu skaitu uz ikonas", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Izskats", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Izskats", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Pielāgota izcēluma krāsa", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Aizturēt CSP atskaites", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Iespējot paplašināto aizturēšanu visās tīmekļa vietnēs", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite var pielietot paplašināto aizturēšanu noteiktā vietnē tikai pēc atļauju nodrošināšanas paplašinājumam datu pārveidošanai tīmekļa vietnē. Šis iestatījums ļauj uzreiz nodrošināt atļaujas paplašinātajai aizturēšanai visās tīmekļa vietnēs.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Noklusējums", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -140,7 +76,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Traucējumi", + "message": "Kaitinoši elementi", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -151,37 +87,13 @@ "message": "Apgabali, valodas", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Vienā rindā viens ieraksts. Filtrs var būt vai nu vienkāršs saimniekdatora nosaukums, vai arī EasyList saderīgs aizturētājs. Rindas, kas sākas ar ! netiks ņemtas vērā.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Ievietot un pievienot", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Izdot", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Uzticamo vietņu norādes nosaka, kurās tīmekļa vietnēs uBO Lite vajadzētu būt atspējotam. Vienā rindā viens ieraksts.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Ievietot un pievienot", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Izdot", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Ievietot/izgūt", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Šeit ir ielīmējami noteikti kosmētiskie aizturētāji, kurus pievienot", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Izmaiņu žurnāls", @@ -211,25 +123,73 @@ "message": "Ārējās atkarības (GPLv3 saderīgas):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Iesniegt", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Pielietot izmaiņas", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Atgriezt", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Sveicināti!", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Tikko ir uzstādīts uBO Lite. Šeit var izvēlēties noklusējuma aizturēšanas veidu, ko izmantot visām tīmekļa vietnēm.\n\nPēc noklusējuma ir atlasīts Pamata, jo tam nav nepieciešama atļauja lasīt un mainīt datus. Ja uBO Lite šķiet uzticams, ir iespējams piešķirt plašas atļaujas lasīt un mainīt datus visās tīmekļa vietnēs, lai pēc noklusējuma iespējotu pilnīgākas aizturēšanas spējas visās tīmekļa vietnēs.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Ziņot par aizturēšanas filtra nepilnību", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Ziņot par aizturēšanas filtru nepilnībām noteiktās vietnēs uBlockOrigin/uAssets pieteikumu izsekotājā. Nepieciešams GitHub konts.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Traucējummeklēšanas informācija", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Lai izvairītos no brīvprātīgo noslogošanas ar ziņojumiem, kas atkārtojas, lūgums pārbaudīt, ka par šādu nepilnību jau nav ziņots. Piebilde: klikšķināšana uz pogas izraisīs arī lapas izcelsmes nosūtīšanu uz GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Meklēt līdzīgus ziņojumus", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Tīmekļa lapas adrese:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Tīmekļa lapa…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Atlasīt ierakstu --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Rāda reklāmas vai to paliekas", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ir pārklājumi vai citi traucējumi", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Nosaka uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ir ar privātumu saistītas nepilnības", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Darbības traucējumi, kad ir iespējots uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Atver nevēlamas cilnes vai logus", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Noved pie ļaunatūras, pikšķerēšanas", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Atzīmēt šo lapu kā “nav droša skatīšanai darbā (NSFW)” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Izveidot jaunu ziņojumu", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Noklusējuma aizturēšanas veids", @@ -252,7 +212,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "pilnīgais", + "message": "pilnais", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -260,13 +220,21 @@ "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Attīstītāka tīkla aizturēšana ar atsevišķu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.", + "message": "Labāka tīkla aizturēšana ar atsevišķu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Attīstītāka tīkla aizturēšana ar pamata un papildu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.\n\nPamata paplašinātā aizturēšana var izraisīt paaugstinātu tīmekļa vietnes resursu izmantošanu.", + "message": "Pilna tīkla aizturēšana ar pamata un papildu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.\n\nPamata paplašinātā aizturēšana var izraisīt paaugstinātu tīmekļa vietnes resursu izmantošanu.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Saraksts ar resursdatoru nosaukumiem, kuriem netiks pielietota aizturēšana", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[tikai resursdatoru nosaukumi]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Uzvedība", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Pārlādēt lapu pēc aizturēšanas veida nomaiņas.", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Rādīt aizturēto pieprasījumu skaitu rīkjoslas ikonā", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Iespējot stingro aizturēšanu", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Iespējami nevēlamu vietņu apmeklēšana tiks aizturēta, un tiks piedāvāta iespēja turpināt.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Izstrādātāja režīms", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Iespējot piekļuvi iespējām, kas piemērotas tehniskiem lietotājiem.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Rezerves kopija", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Pielāgoto iestatījumu rezerves kopēšana datnē vai to atjaunošana no datnes.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Atjaunošana pārrakstīs visus pašreizējos pielāgotos iestatījumus.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Atrast sarakstus", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Lapa aizturēta", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite novērsa šīs lapas ielādēšanu:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Lapa tika aizturēta, jo atbilst aizturētājam sarakstā {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Aizturētā lapa veic pārvirzīšanu uz citu vietni. Ja izvēlēsies turpināt, nonāksi uzreiz šeit: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametriem", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Doties atpakaļ", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Aizvērt šo logu", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Nebrīdināt vairs par šo vietni", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Turpināt", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Pārslēgties uz elementu iznīcināšanu", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Iziet no elementu iznīcināšanas", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Izveidot pielāgotu aizturētāju", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Noņemt pielāgotu aizturētāju", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Apskatīt", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Aizturēšanas režīma informācija", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Pielāgotas DNR kārtulas", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR kārtulas …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dinamiska kārtulu kopa", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sesijas kārtulu kopa", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Saglabāt", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Atjaunot", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Pievienot", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Ievietot un pievienot…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Izgūt…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Veikt rezerves kopēšanu…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Atjaunot…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Nevajag pievienot saturu no neuzticamiem avotiem.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Reģistrēto kārtulu skaits: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Jābīda slīdnis, lai atlasītu vislabāko atbilstību", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Izvēlēties", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Priekšskatīt", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Izveidot", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Zemāk jāatlasa atlasītājs, lai tīmekļa lapā izceltu atbilstošos elementus. Klikšķināt uz atkritnes, lai noņemtu aizturētāju.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/mk/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mk/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/mk/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mk/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Блокатор на содржини без дозволи. Блокира реклами, трекери, мајнери и уште многу повеќе веднаш по инсталацијата.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} правила, добиени од {{filterCount}} мрежните филтри", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Контролна плоча", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "Прилагодби", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "Информации за...", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Заштита на личните податоци", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Начини на прочистување", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Пријави проблем на оваа веб-страница", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Отварање на Контролна плоча", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "Повеќе", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Помалку", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "Почетни прилагодби", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "Рекламни огласи", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "Приватност", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Досадувања", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "Разно", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Региони, Јазици", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Промени", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Изворен код (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Сов contributors", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Изворен код", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Преводи", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Листи за филтрирање", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Надворешни зависности (компатибилни со GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Пријави проблем со филтерот", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Пријавете проблеми со филтерите за специфични веб-страници до uBlockOrigin/uAssets issue tracker. Потребен е GitHub профил.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "За да се избегне оптоварување на волонтерите со дупликат пријави, ве молиме проверете дали проблемот веќе не е пријавен.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Најди слични пријави", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адреса на веб-страницата:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Веб-страницата…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Изберете внос --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Покажува реклами или остатоци од реклами", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Има преOverlayи или други непријатности", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Детектира uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Има проблеми поврзани со приватноста", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Има многу проблеми кога е вклучен uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Отвора непожелни табови или прозорци", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Води до злонамерен софтвер, фишинг", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Означи ја веб-страницата како “NSFW” (“Не е безбедно за работа”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Создај нова пријава", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Режим на филтрирање по подразбирање", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Режимот на филтрирање по подразбирање ќе биде заменет со режимите на филтрирање за секоја веб-страница. Можете да го прилагодите режимот на филтрирање на која било дадена веб-страница во согласност со тој режим што најдобро функционира на таа веб-страница. Секој режим има свои предности и недостатоци.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "без филтрирање", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "основен", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "оптимален", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "целосен", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Основно мрежно филтрирање од селектираните листи со филтри.\n\nНе бара дозвола за читање и модификација на податоци на веб-страниците.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Напредно мрежно филтрирање плус специфично проширено филтрирање од селектираните листи со филтри.\n\nБара широка дозвола за читање и модификација на податоци на сите веб-страници.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Напредно мрежно филтрирање плус специфично и генералистичко проширено филтрирање од селектираните листи со филтри.\n\nБара широка дозвола за читање и модификација на податоци на сите веб-страници.\n\nГенералистичкото проширено филтрирање може да предизвика поголема потрошувачка на ресурси на веб-страниците.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Листата на веб-страници за кои нема да се врши филтрирање.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[само домени]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Понашање", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Автоматски освежи ја страницата кога се менува режимот на филтрирање", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Прикажи го бројот на блокирани барања на иконата во алатникот", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Најди листи", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ml/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ml/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ml/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ml/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "അനുമതി-കുറവ് ഉള്ളടക്ക ബ്ലോക്കർ. പരസ്യങ്ങൾ, ട്രാക്കറുകൾ, ക്രിപ്‌റ്റോ-മൈനർ എന്നിവയും മറ്റും ഇൻസ്റ്റാളുചെയ്യുമ്പോൾ ഉടനടി തടയുന്നു.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} നിയമങ്ങൾ, {{filterCount}} നെറ്റ്‌വർക്ക് ഫിൽട്ടറുകളിൽ നിന്ന് പരിവർത്തനം ചെയ്‌തു", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO ലൈറ്റ് - ഡാഷ്ബോർഡ്", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "ക്രമീകരണങ്ങൾ", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "കുറിച്ച്", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "സ്വകാര്യതാ നയം", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "ഫിൽട്ടറിംഗ് മോഡ്", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "ഡാഷ്ബോർഡ് തുറക്കുക", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "കൂടുതൽ", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "കുറവ്", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "സ്ഥിരസ്ഥിതി", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "പരസ്യങ്ങള്‍", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "പ്രൈവസി", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "ശല്യപ്പെടുത്തലുകൾ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "പലവക ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "പ്രാദേശികം, ഭാഷകള്‍", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "ചേഞ്ച് ലോഗ്", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "സോര്‍സ് കോഡ് (ജിപിഎല്‍ വി3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "സോഴ്സ് കോഡ്", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "ഫിൽട്ടർ ലിസ്റ്റ്", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "ബാഹ്യ ഡിപൻഡൻസികൾ (ജിപിൽവി3-അനുയോജ്യമായത്):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "ഡിഫോൾട്ട് ഫിൽട്ടറിംഗ് മോഡ്", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "ഓരോ വെബ്‌സൈറ്റിലും ഫിൽട്ടറിംഗ് മോഡുകൾ ഉപയോഗിച്ച് ഡിഫോൾട്ട് ഫിൽട്ടറിംഗ് മോഡ് അസാധുവാക്കപ്പെടും. ഏത് വെബ്‌സൈറ്റിൽ ഏറ്റവും മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്ന മോഡ് അനുസരിച്ച് നിങ്ങൾക്ക് ഏത് വെബ്‌സൈറ്റിലും ഫിൽട്ടറിംഗ് മോഡ് ക്രമീകരിക്കാൻ കഴിയും. ഓരോ മോഡിനും അതിന്റെ ഗുണങ്ങളും ദോഷങ്ങളുമുണ്ട്.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "ഫിൽട്ടറിംഗ് ഇല്ല", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "അടിസ്ഥാനം", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "ഒപ്റ്റിമൽ", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "പൂർണ്ണമായ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "തിരഞ്ഞെടുത്ത ഫിൽട്ടർ ലിസ്റ്റുകളിൽ നിന്നുള്ള അടിസ്ഥാന നെറ്റ്‌വർക്ക് ഫിൽട്ടറിംഗ്.\n\nവെബ്‌സൈറ്റുകളിലെ ഡാറ്റ വായിക്കാനും പരിഷ്‌ക്കരിക്കാനും അനുമതി ആവശ്യമില്ല.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "തിരഞ്ഞെടുത്ത ഫിൽട്ടർ ലിസ്റ്റുകളിൽ നിന്നുള്ള വിപുലമായ നെറ്റ്‌വർക്ക് ഫിൽട്ടറിംഗും പ്രത്യേക വിപുലീകൃത ഫിൽട്ടറിംഗും.\n\nഎല്ലാ വെബ്‌സൈറ്റുകളിലെയും ഡാറ്റ വായിക്കാനും പരിഷ്‌ക്കരിക്കാനും വിശാലമായ അനുമതി ആവശ്യമാണ്.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "തിരഞ്ഞെടുത്ത ഫിൽട്ടർ ലിസ്റ്റുകളിൽ നിന്നുള്ള വിപുലമായ നെറ്റ്‌വർക്ക് ഫിൽട്ടറിംഗും നിർദ്ദിഷ്ടവും പൊതുവായതുമായ വിപുലീകൃത ഫിൽട്ടറിംഗും.\n\nഎല്ലാ വെബ്‌സൈറ്റുകളിലെയും ഡാറ്റ വായിക്കാനും പരിഷ്‌ക്കരിക്കാനും വിശാലമായ അനുമതി ആവശ്യമാണ്.\n\nപൊതുവായ വിപുലീകൃത ഫിൽട്ടറിംഗ് ഉയർന്ന വെബ്‌പേജ് ഉറവിട ഉപയോഗത്തിന് കാരണമായേക്കാം.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "ഫിൽട്ടറിംഗ് നടക്കാത്ത ഹോസ്റ്റ് നെയിമുകളുടെ ലിസ്റ്റ്", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "പെരുമാറ്റം", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "ഫിൽട്ടറിംഗ് മോഡ് മാറ്റുമ്പോൾ പേജ് സ്വയമേവ റീലോഡ് ചെയ്യുക", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/mr/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mr/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/mr/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mr/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ms/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ms/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ms/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ms/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,44 +4,28 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Penyekat kandungan tanpa kebenaran. Menyekat iklan, penjejak, pelombong dan banyak lagi sebaik sahaja pemasangan.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "Peraturan {{ruleCount}}, ditukar daripada penapis rangkaian {{filterCount}}.", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — Papan pemuka", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Kekal", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Abai", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Tetapan", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Senarai penapis", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Penapis saya", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Halaman dipercayai", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Mengenai", @@ -51,78 +35,30 @@ "message": "Dasar privasi", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "mod penapisan", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Buka papan pemuka", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Lagi", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Kurangkan", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Penampilan", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Sekat laporan CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Lalai", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,11 +72,11 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Kegusaran", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -148,43 +84,19 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "Wilayah, bahasa", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksport", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksport", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "Log perubahan", "description": "" }, "aboutCode": { @@ -208,35 +120,83 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Pergantungan luaran (serasi dengan GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Hantar", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Selamat datang", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Mod penapisan lalai", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Mod penapisan lalai akan ditindih oleh mod penapisan setiap tapak web. Anda boleh melaraskan mod penapisan pada mana-mana tapak web tertentu mengikut mana-mana mod yang paling berkesan pada tapak web tersebut. Setiap mod mempunyai kelebihan dan kekurangannya.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -244,35 +204,211 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "asas", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "optimum", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "selesai", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Penapisan rangkaian asas daripada senarai penapis yang dipilih.\n\nTidak memerlukan kebenaran untuk membaca dan mengubah suai data pada tapak web.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Penapisan rangkaian lanjutan ditambah penapisan lanjutan khusus daripada senarai penapis yang dipilih.\n\nMemerlukan kebenaran untuk membaca dan mengubah suai data pada semua tapak web.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Penapisan rangkaian lanjutan serta penapisan lanjutan khusus dan generik daripada senarai penapis yang dipilih.\n\nMemerlukan kebenaran untuk membaca dan mengubah suai data pada semua tapak web.\n\nPenapisan lanjutan generik boleh menyebabkan penggunaan sumber halaman web yang lebih tinggi.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Senarai nama hos yang tiada penapisan akan berlaku", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Tingkah laku", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Muat semula halaman secara automatik apabila menukar mod penapisan", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Tunjukkan bilangan permintaan yang disekat pada ikon bar alat", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/nb/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nb/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/nb/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nb/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "En eksperimentell innholdsblokkerer uten tillatelseskrav. Blokkerer reklame, sporere, minere og mer øyeblikkelig etter installering.", + "message": "En tillatelsesbegrenset innholdsblokkerer. Blokkerer reklame, sporere, minere og mer umiddelbart etter installering.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashbord", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Advarsel! Du har ulagrede endringer", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Bli", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorer", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Innstillinger", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlister", + "customFiltersPageName": { + "message": "Egendefinerte filtre", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mine filtre", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Betrodde sider", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Utvikle", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Om", @@ -51,78 +35,30 @@ "message": "Personvernpraksis", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Deaktiver/aktiver uBO Lite for dette nettstedet", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Åpne dashbordet", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Gå til element­fjernings­modus", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Gå til element­velger­modus", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtreringsmodus", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "På denne nettsiden", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Rapporter om problem på dette nettstedet", + "message": "Rapporter et problem", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klikk for å gjøre endringer permanente.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klikk for å tilbakestille endringer.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Åpne dashbordet", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mer", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klikk for å gi uBO Lite utvidede tillatelser på dette nettstedet.\nUtvidede tillatelser gir mer effektiv innholdsblokkering.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klikk for å tilbakekalle utvidede tillatelser på dette nettstedet.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mindre", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Vis antall blokkerte forespørsler på ikonet", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Utseende", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Tilpasset aksentfarge", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokker CSP-rapporter", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Aktiver utvidet filtrering på alle nettsteder", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kan bruke utvidet filtrering på et gitt nettsted bare etter at du uttrykkelig gir utvidelsen tillatelser til å endre data på det nettstedet. Denne innstillingen gir deg muligheten til å gi tillatelser for utvidet filtrering til alle nettsteder på en gang.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standard", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domener med skadelig programvare", + "message": "Beskyttelse mot skadelig programvare, sikkerhet", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regioner, språk", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ett filter per linje. Et filter kan være et vanlig vertsnavn eller et EasyList-kompatibelt filter. Linjer med prefikset ! blir ignorert.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importer og legg til", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksporter", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "mine-ublock-statiske-filtre_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Direktivene for betrodde sider bestemmer hvilke nettsider uBO Lite ikke skal være aktiv på. Én oppføring per linje.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importer og legg til", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksporter", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "mine-ublock-betrodde-sider_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importér/Eksportér", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Lim inn her spesifikke kosmetiske filtre som skal legges til", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Endringslogg", @@ -211,25 +123,73 @@ "message": "Eksterne avhengigheter (GPLv3-kompatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Send", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Bruk endringer", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Tilbakestill", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Velkommen", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Du har nettopp installert uBO Lite. Her kan du velge standard-filtreringsmodusen som skal brukes på alle nettsteder.\n\nSom standard er modusen Grunnleggende valgt fordi den ikke krever tillatelse til å lese og endre data. Hvis du stoler på uBO Lite, kan du gi uBO Lite bred tillatelse til å lese og endre data på alle nettsteder for å aktivere mer avanserte filtreringsfunksjoner for alle nettsteder som standard.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Rapporter om filterproblem", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Rapporter filterproblemer med bestemte nettsteder til uBlockOrigin/uAssets problemsporing. Krever en GitHub-konto.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Feilsøkingsinformasjon", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "For å unngå å belaste de frivillige med dobbeltrapporter, må du kontrollere at problemet ikke allerede har blitt rapportert. Noter: ved å klikke på knappen vil sidens opprinnelse bli sendt til GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Finn lignende rapporter på GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Nettsidens adresse:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Nettsiden...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Velg en oppføring --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Viser reklame eller reklamerester", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Har overlegg eller andre plager", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Oppdager uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Har personvernrelaterte problemer", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Fungerer ikke når uBO Lite er aktivert", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Åpner uønskede faner eller vinduer", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Fører til skadelig programvare og/eller phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Merk nettsiden som «NSFW» (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Opprett ny rapport på GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standard filtreringsmodus", @@ -267,6 +227,14 @@ "message": "Avansert nettverksfiltrering pluss spesifikk og generell utvidet filtrering fra valgte filterlister.\n\nKrever bred tillatelse til å lese og endre data på alle nettsteder.\n\nGenerell utvidet filtrering kan forårsake høyere ressursbruk på nettsider.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Liste over nettsider der ingen filtrering vil finne sted.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[kun vertsnavn]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Virkemåte", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatisk last side på nytt ved endring av filtreringsmodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Vis antall blokkerte forespørsler på verktøylinjeikonet", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Aktiver streng blokkering", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigering til potensielt uønskede nettsteder blir blokkert, og du får tilbud om å fortsette.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Utviklermodus", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Aktiver tilgang til funksjoner som er egnet for tekniske brukere.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sikkerhetskopi", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Sikkerhetskopier dine egendefinerte regler, eller gjenopprett dine egendefinerte regler fra en fil.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Gjenoppretting vil overskrive dine nåværende egendefinerte regler.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Finn lister", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Side blokkert", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite har forhindret innlasting av følgende side:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Siden ble blokkert på grunn av et matchende filter i {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Den blokkerte siden ønsker å omdirigere til et annet nettsted. Hvis du velger å fortsette, vil du navigere direkte til: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "uten parametere", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Gå tilbake", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Lukk dette vinduet", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Ikke varsle igjen om dette nettstedet", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Fortsett", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Gå til element­fjernings­modus", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Forlat elementfjerningsmodus", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Lag et egendefinert filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Fjern et egendefinert filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Vis:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtreringsmodusdetaljer", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Egendefinerte DNR-regler", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-regler for …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamisk regelsett", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Regelsett for økter", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Lagre", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Tilbakestill", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Legg til", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importer og legg til...", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Eksporter...", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sikkerhetskopier…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Gjenopprett…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Ikke legg til innhold fra upålitelige kilder", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Antall registrerte regler: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Flytt glidebryteren for å velge den beste matchen", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Velg", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Forhåndsvis", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Opprett", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Velg et filter nedenfor for å fremheve samsvarende elementer på nettsiden. Klikk på papirkurven for å fjerne et filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/nl/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nl/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/nl/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nl/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Een experimentele, toestemmingsloze inhoudsblokkeerder. Blokkeert direct na installatie advertenties, trackers, miners en meer.", + "message": "Een efficiënte inhoudsblokkeerder. Blokkeert direct na installatie advertenties, trackers, miners en meer.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite – Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Waarschuwing! Niet-opgeslagen wijzigingen", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Blijven", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Negeren", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Instellingen", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlijsten", + "customFiltersPageName": { + "message": "Aangepaste filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mijn filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Vertrouwde websites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Ontwikkelen", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Over", @@ -51,78 +35,30 @@ "message": "Privacybeleid", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "uBO Lite in-/uitschakelen voor deze website", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Dashboard openen", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Element­wisser­modus openen", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Element­kiezer­modus openen", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtermodus", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Op deze website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Een probleem op deze website melden", + "message": "Een probleem melden", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klik om uw wijzigingen permanent te maken.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klik om uw wijzigingen ongedaan te maken.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Dashboard openen", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Meer", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klik om uBO Lite uitgebreide toestemmingen te verlenen op deze website.\nUitgebreide toestemmingen zorgen voor effectievere inhoudsblokkering.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klik om uitgebreide toestemmingen op deze website in te trekken.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Minder", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Het aantal geblokkeerde aanvragen op het pictogram tonen", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Vormgeving", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Thema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Aangepaste accentkleur", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP-rapporten blokkeren", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Uitgebreide filtering op alle websites inschakelen", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kan alleen uitgebreide filtering op een bepaalde website toepassen nadat u de extensie expliciet toestemmingen hebt verleend om gegevens op die website aan te passen. Via deze instelling kunt u toestemmingen voor uitgebreide filtering aan alle websites tegelijk verlenen.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standaard", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malwaredomeinen", + "message": "Bescherming tegen malware, beveiliging", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Gebieden, talen", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Eén filter per regel. Een filter kan een gewone hostnaam of een EasyList-compatibel filter zijn. Regels beginnend met ! worden genegeerd.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importeren en toevoegen…", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exporteren…", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "mijn-ublock-statische-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "De vertrouwde-website-instructies schrijven voor op welke webpagina’s uBO Lite dient te worden uitgeschakeld. Eén vermelding per regel.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importeren en toevoegen…", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exporteren…", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "mijn-ublock-vertrouwde-websites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importeren / Exporteren", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Plak hier specifieke cosmetische filters om toe te voegen", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Wijzigingenlogboek", @@ -211,25 +123,73 @@ "message": "Externe afhankelijkheden (GPLv3-compatibel):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Verzenden", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Wijzigingen toepassen", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Ongedaan maken", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welkom", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "U hebt zojuist uBO Lite geïnstalleerd. Hier kunt u de standaard filtermodus voor het gebruik op alle websites kiezen.\n\nStandaard wordt de modus Basis geselecteerd, omdat hiervoor geen toestemming voor het lezen en aanpassen van gegevens is vereist. Als u uBO Lite vertrouwt, kunt u het brede toestemming voor het lezen en aanpassen van gegevens op alle websites verlenen, zodat standaard meer geavanceerde filtermogelijkheden voor alle websites beschikbaar zijn.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Een filterprobleem melden", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Meld filterproblemen met specifieke websites in de uBlockOrigin/uAssets-probleemtracker. Vereist een GitHub-account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Probleemoplossingsinformatie", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Controleer of het probleem niet eerder is gemeld om te voorkomen dat vrijwilligers met dubbele meldingen worden belast. Noot: op de knop klikken zorgt ervoor dat de oorsprong van de pagina naar GitHub wordt verzonden.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Soortgelijke meldingen op GitHub zoeken", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adres van de webpagina:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "De webpagina…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Maak een keuze --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Toont advertenties of restanten", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Heeft overlappingen of andere ongemakken", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detecteert uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Heeft privacy-gerelateerde problemen", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Werkt niet als uBO Lite is ingeschakeld", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opent ongewenste tabbladen of vensters", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leidt tot badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "De webpagina labelen als ‘NSFW’ (‘Not Safe For Work’)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Nieuwe melding op GitHub maken", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standaard filtermodus", @@ -267,6 +227,14 @@ "message": "Geavanceerde netwerkfiltering plus specifieke en algemene uitgebreide filtering vanuit geselecteerde filterlijsten.\n\nVereist brede toestemming voor het lezen en aanpassen van gegevens op alle websites.\n\nAlgemene uitgebreide filtering kan een hoger gebruik van webpaginabronnen veroorzaken.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lijst van hostnamen waarvoor geen filtering plaatsvindt.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[alleen hostnamen]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Gedrag", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Pagina automatisch vernieuwen bij wijzigen van filtermodus", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Het aantal geblokkeerde aanvragen op het werkbalkpictogram tonen", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Strenge blokkering inschakelen", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigatie naar mogelijk ongewenste websites wordt geblokkeerd, en u krijgt de mogelijkheid om door te gaan.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Ontwikkelaarsmodus", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Schakelt toegang tot voor technische gebruikers geschikte functies in.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Back-up", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Maak een back-up van uw aangepaste instellingen naar een bestand, of zet uw aangepaste instellingen terug vanuit een bestand.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Terugzetten overschrijft al uw huidige aangepaste instellingen.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Lijsten zoeken", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Pagina geblokkeerd", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite heeft het laden van de volgende pagina voorkomen:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "De pagina is geblokkeerd vanwege een overeenkomend filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "De geblokkeerde pagina wil u omleiden naar een andere website. Als u doorgaat, navigeert u rechtstreeks naar: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "zonder parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Teruggaan", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Dit venster sluiten", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Mij niet meer waarschuwen over deze website", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Doorgaan", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Een element­ verwijderen", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Element­wisser­modus sluiten", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Een aangepast filter maken", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Een aangepast filter verwijderen", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Weergeven:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Details van filtermodus", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Aangepaste DNR-regels", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-regels van …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamische regelset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sessieregelset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Opslaan", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Ongedaan maken", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Toevoegen", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importeren en toevoegen…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exporteren…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back-up maken…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Terugzetten…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Voeg geen inhoud van niet-vertrouwde bronnen toe.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Aantal geregistreerde regels: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Verplaats de schuifregelaar voor de beste overeenkomst", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Kiezen", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Voorbeeld", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Aanmaken", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Selecteer hieronder een filter om overeenkomende elementen in de webpagina te markeren. Klik op de prullenbak om een filter te verwijderen.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/oc/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/oc/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/oc/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/oc/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pa/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pa/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pa/messages.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pa/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,414 @@ +{ + "extName": { + "message": "uBlock Origin Lite", + "description": "extension name." + }, + "extShortDesc": { + "message": "ਮਨਜ਼ੂਰੀਆਂ ਤੋਂ ਬਿਨਾਂ ਵਾਲਾ ਸਮੱਗਰੀ ਬਲਾਕਰ ਹੈ। ਇਸ਼ਤਿਹਾਰ, ਟਰੈਕਰਾਂ, ਮਾਈਨਰਾਂ ਅਤੇ ਹੋਰਾਂ ਉੱਤੇ ਇੰਸਟਾਲ ਕਰਨ ਤੋਂ ਫ਼ੌਰਨ ਬਾਅਦ ਪਾਬੰਦੀ ਲਾਉਂਦਾ ਹੈ।", + "description": "this will be in the Chrome web store: must be 132 characters or less" + }, + "perRulesetStats": { + "message": "{{ruleCount}} ਨਿਯਮ, {{filterCount}} ਨੈੱਟਵਰਕ ਫਿਲਟਰ ਤੋਂ ਬਦਲੇ ਗਏ", + "description": "Appears aside each filter list in the _3rd-party filters_ pane" + }, + "dashboardName": { + "message": "uBO Lite — ਡੈਸ਼ਬੋਰਡ", + "description": "English: uBO Lite — Dashboard" + }, + "settingsPageName": { + "message": "ਸੈਟਿੰਗਾਂ", + "description": "appears as tab name in dashboard" + }, + "customFiltersPageName": { + "message": "Custom filters", + "description": "appears as tab name in dashboard" + }, + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" + }, + "aboutPageName": { + "message": "ਇਸ ਬਾਰੇ", + "description": "appears as tab name in dashboard" + }, + "aboutPrivacyPolicy": { + "message": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", + "description": "Link to privacy policy on GitHub (English)" + }, + "popupFilteringModeLabel": { + "message": "ਫਿਲਟਰ ਕਰਨ ਦਾ ਮੋਡ", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" + }, + "popupTipReport": { + "message": "ਇਸ ਵੈੱਬਸਾਈਟ ਉੱਤੇ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", + "description": "Tooltip used for the 'chat' icon in the panel" + }, + "popupTipDashboard": { + "message": "ਡੈਸ਼ਬੋਰਡ ਨੂੰ ਖੋਲ੍ਹੋ", + "description": "English: Click to open the dashboard" + }, + "popupMoreButton": { + "message": "ਹੋਰ", + "description": "Label to be used to show popup panel sections" + }, + "popupLessButton": { + "message": "ਘੱਟ", + "description": "Label to be used to hide popup panel sections" + }, + "3pGroupDefault": { + "message": "ਮੂਲ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAds": { + "message": "ਇਸ਼ਤਿਹਾਰ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupPrivacy": { + "message": "ਪਰਦੇਦਾਰੀ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMalware": { + "message": "Malware protection, security", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupAnnoyances": { + "message": "ਅਣਚਾਹੇ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupMisc": { + "message": "ਫੁਟਕਲ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "3pGroupRegions": { + "message": "ਖੇਤਰ, ਭਾਸ਼ਾਵਾਂ", + "description": "Header for a ruleset section in 'Filter lists pane'" + }, + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" + }, + "aboutChangelog": { + "message": "ਤਬਦੀਲੀ-ਸੂਚੀ", + "description": "" + }, + "aboutCode": { + "message": "ਸਰੋਤ ਕੋਡ (GPLv3)", + "description": "English: Source code (GPLv3)" + }, + "aboutContributors": { + "message": "ਯੋਗਦਾਨੀ", + "description": "English: Contributors" + }, + "aboutSourceCode": { + "message": "ਸਰੋਤ ਕੋਡ", + "description": "Link text to source code repo" + }, + "aboutTranslations": { + "message": "ਅਨੁਵਾਦ", + "description": "Link text to translations repo" + }, + "aboutFilterLists": { + "message": "ਫਿਲਟਰ ਸੂਚੀਆਂ", + "description": "Link text to uBO's own filter lists repo" + }, + "aboutDependencies": { + "message": "ਬਾਹਰੀ ਨਿਰਭਰਤਾਵਾਂ (GPLv3-ਅਨੁਕੂਲ):", + "description": "Shown in the About pane" + }, + "supportS6H": { + "message": "ਫਿਲਟਰ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "ਰਲਦੀਆਂ ਰਿਪੋਰਟਾਂ ਲੱਭੋ", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "ਵੈੱਬ-ਸਫ਼ੇ ਦਾ ਸਿਰਨਾਵਾਂ:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "ਵੈੱਬ ਸਫ਼ਾ…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "ਇਸ਼ਤਿਹਾਰ ਜਾਂ ਇਸ਼ਤਿਹਾਰ ਦੀ ਰਹਿੰਦ-ਖੂੰਦ ਦਿਖਾਉਂਦਾ ਹੈ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਮਸਲੇ ਹਨ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "ਬੇਲੋੜੀਆਂ ਟੈਬਾਂ ਜਾਂ ਵਿੰਡੋ ਖੋਲ੍ਹਦਾ ਹੈ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "ਨਵੀਂ ਰਿਪੋਰਟ ਬਣਾਓ", + "description": "Text for button which open an external webpage in Support pane" + }, + "defaultFilteringModeSectionLabel": { + "message": "ਮੂਲ ਫਿਲਟਰ ਕਰਨ ਦਾ ਢੰਗ", + "description": "The header text for the default filtering mode section" + }, + "defaultFilteringModeDescription": { + "message": "ਮੂਲ ਫਿਲਟਰਿੰਗ ਢੰਗ ਨੂੰ ਹਰ-ਵੈੱਬਸਾਈਟ ਫਿਲਟਰਿੰਗ ਢੰਗਾਂ ਰਾਹੀਂ ਅਣਡਿੱਠਾ ਕੀਤਾ ਜਾਵੇਗਾ। ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਵੈੱਬਸਾਈਟ ਲਈ ਫਿਲਟਰ ਕਰਨ ਦੇ ਢੰਗ ਨੂੰ ਉਸ ਵੈੱਬਸਾਈਟ ਲਈ ਸਭ ਤੋਂ ਵਧੀਆ ਕੰਮ ਕਰਦੇ ਢੰਗ ਮੁਤਾਬਕ ਅਡਜੱਸਟ ਕਰ ਸਕਦੇ ਹੋ। ਹਰ ਢੰਗ ਦੇ ਆਪਣੇ ਫਾਇਦੇ ਅਤੇ ਆਪਣੇ ਨੁਕਸਾਨ ਹਨ।", + "description": "This describes the default filtering mode setting" + }, + "filteringMode0Name": { + "message": "ਕੋਈ ਫਿਲਟਰ ਨਹੀਂ ਕਰਨਾ", + "description": "Name of blocking mode 0" + }, + "filteringMode1Name": { + "message": "ਮੁੱਢਲਾ", + "description": "Name of blocking mode 1" + }, + "filteringMode2Name": { + "message": "ਅਨੁਕੂਲ", + "description": "Name of blocking mode 2" + }, + "filteringMode3Name": { + "message": "ਪੂਰਾ", + "description": "Name of blocking mode 3" + }, + "basicFilteringModeDescription": { + "message": "ਚੁਣੀਆਂ ਫਿਲਟਰ ਸੂਚੀਆਂ ਤੋਂ ਮੁੱਢਲਾ ਨੈੱਟਵਰਕ ਫਿਲਟਰ ਕਰਨਾ।\n\nਵੈੱਬਸਾਈਟਾਂ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਅਤੇ ਸੋਧਣ ਲਈ ਮਨਜ਼ੂਰੀ ਨਹੀਂ ਚਾਹੀਦੀ ਹੈ।", + "description": "This describes the 'basic' filtering mode" + }, + "optimalFilteringModeDescription": { + "message": "ਤਕਨੀਕੀ ਨੈੱਟਵਰਕ ਫਿਲਟਰ ਕਰਨ ਤੋਂ ਨਾਲ ਨਾਲ ਚੁਣੀਆਂ ਫਿਲਟਰ ਸੂਚੀਆਂ ਤੋਂ ਖਾਸ ਵਾਧਾ ਕੀਤੇ ਫਿਲਟਰ।\n\nਸਾਰੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਲਈ ਡਾਟਾ ਪੜ੍ਹਨ ਅਤੇ ਸੋਧਣ ਲਈ ਜਿਆਦਾ ਮਨਜ਼ੂਰੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ।", + "description": "This describes the 'optimal' filtering mode" + }, + "completeFilteringModeDescription": { + "message": "ਤਕਨੀਕੀ ਨੈੱਟਵਰਕ ਫਿਲਟਰ ਕਰਨ ਤੋਂ ਨਾਲ ਨਾਲ ਚੁਣੀਆਂ ਫਿਲਟਰ ਸੂਚੀਆਂ ਤੋਂ ਖਾਸ ਵਾਧਾ ਕੀਤੇ ਫਿਲਟਰ।\n\nਸਾਰੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਲਈ ਡਾਟਾ ਪੜ੍ਹਨ ਅਤੇ ਸੋਧਣ ਲਈ ਜਿਆਦਾ ਮਨਜ਼ੂਰੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ।\n\nਆਮ ਵਾਧਾ ਕੀਤੀ ਫਿਲਟਰਿੰਗ ਵੱਧ ਵੈੱਬ-ਸਫ਼ਾ ਸਰੋਤ ਵਰਤੇ ਜਾਣ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੀ ਹੈ।", + "description": "This describes the 'complete' filtering mode" + }, + "noFilteringModeDescription": { + "message": "ਹੋਸਟ-ਨਾਵਾਂ ਦੀ ਸੂਚੀ, ਜਿਨ੍ਹਾਂ ਲਈ ਕੋਈ ਫਿਲਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, + "behaviorSectionLabel": { + "message": "ਰਵੱਈਆ", + "description": "The header text for the 'Behavior' section" + }, + "autoReloadLabel": { + "message": "ਫਿਲਫਰ ਕਰਨ ਦਾ ਢੰਗ ਬਦਲਣ ਦੇ ਬਾਅਦ ਸਫ਼ੇ ਨੂੰ ਆਪਣੇ-ਆਪ ਲੋਡ ਕਰੋ", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pl/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pl/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pl/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pl/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Eksperymentalny, niewymagający uprawnień bloker treści. Natychmiast po instalacji blokuje reklamy, moduły śledzące, koparki i [...]", + "message": "Niewymagający uprawnień bloker treści. Natychmiast po instalacji blokuje reklamy, moduły śledzące, koparki i nie tylko.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Panel sterowania", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Uwaga! Masz niezapisane zmiany", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Zostań", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignoruj", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Ustawienia", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listy filtrów", + "customFiltersPageName": { + "message": "Własne filtry", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Moje filtry", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Zaufane witryny", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Programowanie", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "O rozszerzeniu", @@ -51,78 +35,30 @@ "message": "Polityka prywatności", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Wyłącz/włącz uBO Lite na tej witrynie", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Otwórz panel sterowania", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Przejdź do trybu usuwania elementów", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Przejdź do trybu zaznaczania elementów", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Tryb filtrowania", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Na tej stronie internetowej", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Zgłoś problem z tą stroną", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Kliknij, aby zastosować zmiany na stałe.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kliknij, aby odrzucić zmiany.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Otwórz panel sterowania", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Więcej", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Kliknij, aby przyznać uBO Lite rozszerzone uprawnienia na tej witrynie.\nRozszerzone uprawnienia umożliwiają skuteczniejsze blokowanie treści.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kliknij, aby cofnąć rozszerzone uprawnienia na tej witrynie", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mniej", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Wyświetlaj liczbę zablokowanych żądań na ikonie rozszerzenia", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Wygląd", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Motyw", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Własny kolor akcentujący", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blokuj raporty CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Włącz rozszerzone filtrowanie na wszystkich witrynach internetowych", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite może zastosować rozszerzone filtrowanie na danej witrynie internetowej tylko po wyraźnym przyznaniu rozszerzeniu uprawnień do modyfikowania danych na tej witrynie. To ustawienie pozwala na przyznanie uprawnień do rozszerzonego filtrowania wszystkich witryn jednocześnie.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Domyślne", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regiony, języki", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "W wierszu może być tylko jeden filtr. Filtrem może być nazwa hosta lub filtr kompatybilny z EasyList. Wiersze poprzedzone znakiem ! będą pomijane.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importuj i dołącz", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksportuj", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-statyczne-filtry_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Wytyczne zaufanych witryn nakazują, na których stronach uBlock Origin powinien zostać wyłączony. Jeden wpis na linię.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importuj i dołącz", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksportuj", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-zaufane-witryny_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import i eksport", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Wklej tutaj określone filtry kosmetyczne do dodania", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Informacje o wydaniu", @@ -211,25 +123,73 @@ "message": "Zewnętrzne zależności (kompatybilne z GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Wyślij", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Zastosuj zmiany", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Przywróć", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Witaj", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Właśnie został zainstalowany uBO Lite. Tutaj możesz wybrać domyślny tryb filtrowania, który będzie używany na wszystkich witrynach internetowych.\n\nDomyślnie wybrany jest tryb Podstawowy, ponieważ nie wymaga uprawnień do odczytu i zmiany danych. Jeśli ufasz uBO Lite, możesz nadać mu szerokie uprawnienia do odczytu i zmiany danych na wszystkich witrynach internetowych w celu domyślnego włączenia bardziej zaawansowanych funkcji filtrowania wszystkich witryn internetowych.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Zgłoś problem z filtrem", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Zgłoś problemy z filtrami dotyczące konkretnych witryn internetowych do systemu śledzenia problemów uBlockOrigin/uAssets. Wymagane jest konto GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informacje pomocne w rozwiązywaniu problemów", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Sprawdź, czy problem nie został już zgłoszony, aby uniknąć obciążania wolontariuszy duplikatami raportów. Uwaga: kliknięcie przycisku spowoduje wysłanie źródła strony do serwisu GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Znajdź podobne raporty", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adres strony internetowej:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Strona internetowa…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "— Wybierz pozycję —", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Wyświetla reklamy lub ich pozostałości", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ma nakładki lub inne niedogodności", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Wykrywa uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ma problemy związane z prywatnością", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Nieprawidłowe działanie po włączeniu uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Otwiera niepożądane karty lub okna", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Prowadzi do szkodliwego oprogramowania, phishingu", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Oznacz stronę internetową jako „NSFW” („Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Utwórz nowy raport", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Domyślny tryb filtrowania", @@ -267,6 +227,14 @@ "message": "Zaawansowane filtrowanie sieciowe oraz konkretne i ogólne filtrowanie rozszerzone z wybranych list filtrów.\n\nWymaga szerokich uprawnień do odczytu i zmiany danych na wszystkich witrynach internetowych.\n\nOgólne filtrowanie rozszerzone może powodować większe zużycie zasobów przez witryny internetowe.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista nazw hostów, dla których nie będzie stosowane żadne filtrowanie", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[tylko nazwy hostów]\nexample.com\ngry.przykład\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Zachowanie", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatycznie wczytaj ponownie stronę po zmianie trybu filtrowania", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Wyświetlaj liczbę zablokowanych żądań na ikonie paska narzędzi", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Włącz ścisłe blokowanie", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Nawigacja do potencjalnie niepożądanych witryn zostanie zablokowana i pojawi się opcja kontynuowania.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Tryb programisty", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Włącz dostęp do odpowiednich funkcji dla użytkowników technicznych.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Tworzenie i przywracanie kopii zapasowej", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Utwórz kopię zapasową własnych ustawień w pliku lub przywróć je z pliku.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Przywrócenie kopii zapasowej spowoduje nadpisanie wszystkich bieżących ustawień własnych.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Znajdź listy", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Strona zablokowana", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite nie pozwolił załadować się następującej stronie:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Strona została zablokowana z powodu pasującego filtra na liście {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Zablokowana strona chce przekierować na inną witrynę. Jeśli zdecydujesz się kontynuować, przejdziesz bezpośrednio do: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametrów", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Wstecz", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Zamknij to okno", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Nie ostrzegaj mnie ponownie o tej witrynie", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Kontynuuj", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Przejdź do trybu usuwania elementów", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Wyjdź z trybu usuwania elementów", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Utwórz własny filtr", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Usuń własny filtr", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Widok:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Szczegóły trybu filtrowania", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Własne reguły DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Reguły DNR …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamiczny zestaw reguł", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sesyjny zestaw reguł", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Zapisz", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Przywróć", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Dodaj", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importuj i dołącz…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Eksportuj…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Utwórz kopię zapasową…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Przywróć kopię zapasową…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Nie dodawaj zawartości z niezaufanych źródeł", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Liczba zarejestrowanych reguł: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Przesuń suwak, aby wybrać najlepsze dopasowanie", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Wybierz", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Podgląd", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Utwórz", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Wybierz filtr poniżej, aby wyróżnić pasujące elementy na stronie internetowej. Kliknij kosz, aby usunąć filtr.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Um bloqueador de conteúdo leve, experimental e sem uso permissões - bloqueie anúncios, rastreadores, mineradores e muito mais [...]", + "message": "Um bloqueador de conteúdo eficiente. Bloqueia anúncios, rastreadores e muito mais, imediatamente após a instalação.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Painel", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Aviso! Você não salvou as mudanças", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Manter", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorar", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Configurações", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listas de filtros", + "customFiltersPageName": { + "message": "Filtros personalizados", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Meus filtros", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Sites confiáveis", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Desenvolver", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Sobre", @@ -51,78 +35,30 @@ "message": "Política de privacidade", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Desabilitar/habilitar uBO Lite para este site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Abrir painel", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Entrar no modo de exclusão de elemento", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Entrar no modo de seleção de elemento", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "modo de filtragem", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Neste site", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Reportar um problema com este website", + "message": "Reportar um problema", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Clique para tornar suas alterações permanentes.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Clique para reverter suas alterações.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Abrir painel", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mais", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Clique para garantir uBO Lite permissões estendidas para este site.\nPermissões estendidas permitem maior efetividade ao bloqueio de conteúdo.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Clique para revogar permissões estendidas neste site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Menos", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Mostrar o número de solicitações bloqueadas no ícone", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Aparência", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Cor de destaque personalizada", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bloquear relatórios CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Habilitar filtragem estendida em todos os websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "O uBO Lite pode aplicar filtragem estendida em um determinado site somente após você conceder explicitamente as permissões de extensão para modificar dados nesse site. Essa configuração permite que você conceda permissões para filtragem estendida a todos os sites de uma só vez.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Padrão", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domínios de malware", + "message": "Proteção contra malware, segurança", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -144,51 +80,27 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Diversos", + "message": "Outras", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { "message": "Regiões, idiomas", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Um filtro por linha. O filtro pode ser um simples nome de servidor ou um filtro compatível com Adblock Plus. Linhas com prefixo ! serão ignoradas.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importar e adicionar", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportar", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "meus-filtros-estáticos-do-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "As diretivas dos sites confiáveis ditam em quais páginas da web o uBO Lite deve ser desativado. Uma entrada por linha.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importar e adicionar", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportar", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "meus-sites-confiáveis-do-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importação e exportação", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Cole filtros cosméticos específicos aqui para adicioná-los", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Registro de alterações", + "message": "Notas de lançamento", "description": "" }, "aboutCode": { - "message": "Código-fonte (GPLv3)", + "message": "Código fonte (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -196,7 +108,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Código fonte", + "message": "Código-fonte", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -211,32 +123,80 @@ "message": "Dependências externas (compatíveis com GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Enviar", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplicar mudanças", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Reverter", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Bem-vindo", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Você acabou de instalar o uBO Lite. Você pode escolher aqui o modo de filtragem padrão para usar em todos os sites.\n\nPor padrão, o modo Básico está selecionado porque não requer permissão para ler e alterar dados. Se você confia no uBO Lite, pode conceder ampla permissão para ler e alterar dados em todos os sites para habilitar recursos de filtragem mais avançados para todos os sites por padrão.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Reportar um problema com o filtro", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Reporte problemas com os filtros em sites específicos no rastreador de problemas douBlockOrigin/uAssets. Uma conta do GitHub é necessária.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informações para solução de problemas", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Para evitar sobrecarregar os voluntários com relatórios duplicados por favor verifique se o problema já não foi relatado. Observação: clicar no botão fará com que a origem da página seja enviada ao GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Procurar relatórios similares no GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Endereço da página:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "A página…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "— Selecione um tipo —", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Mostra anúncios ou restos de anúncios", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Tem sobreposições ou outras perturbações", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detecta o uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Tem problemas relacionados à privacidade", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Não funciona direito quando o uBO Lite está ativado", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Abre abas ou janelas indesejadas", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leva a badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Rotular a página como “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Criar um novo relatório no GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Modo de filtragem padrão", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "O modo de filtragem padrão será substituído pelos modos de filtragem por site. Você pode ajustar o modo de filtragem em qualquer site de acordo com o modo que funcionar melhor nesse site. Cada modo tem suas vantagens e desvantagens.", + "message": "O modo de filtragem padrão será substituído pelos modos de filtragem por site. Você pode ajustar o modo de filtragem em qualquer site de acordo com qual modo funcionar melhor nesse site. Cada modo tem suas vantagens e desvantagens.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -248,7 +208,7 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "ótimo", + "message": "otimizado", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -256,23 +216,199 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Filtragem de rede básica de listas de filtros selecionadas.\n\nNão requer permissão para ler e alterar dados em sites.", + "message": "Filtragem básica de rede por listas de filtros selecionadas.\n\nNão requer permissão para ler e modificar os dados nos sites.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Filtragem de rede avançada mais filtragem estendida específica de listas de filtros selecionadas.\n\nRequer ampla permissão para ler e alterar dados em todos os sites.", + "message": "Filtragem avançada de rede, com a filtragem estendida específica de listas de filtros selecionadas.\n\nRequer a permissão mais extensa de ler e modificar os dados em todos os sites.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Filtragem de rede avançada mais filtragem estendida específica e genérica de listas de filtros selecionadas.\n\nRequer ampla permissão para ler e alterar dados em todos os sites.\n\nA filtragem estendida genérica pode causar maior uso de recursos da página da Web.", + "message": "Filtragem avançada da rede, com filtragem estendida específica e genérica de listas de filtros selecionadas.\n\nRequer a permissão mais extensa para ler e modificar os dados em todos os sites.\n\nA filtragem estendida genérica pode causar maior uso de recursos da página.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista de sites que não serão filtrados.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[somente nomes de servidor]\nexemplo.com\njogos.exemplo\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Recarregue a página automaticamente ao alterar o modo de filtragem", + "message": "Recarregar a página automaticamente ao alterar o modo de filtragem", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar o número de solicitações bloqueadas no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Ativar bloqueio rigoroso", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "A navegação para sites potencialmente indesejáveis ​​será bloqueada e você terá a opção de prosseguir.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modo de desenvolvedor", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Ativa o acesso à funcionalidade destinada a usuários técnicos.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Faça backup das suas configurações personalizadas em um arquivo ou restaure suas configurações personalizadas de um arquivo.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "A restauração sobrescreverá todas as suas configurações personalizadas atuais.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Procurar listas", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Página bloqueada", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "O uBO Lite impediu o carregamento da seguinte página:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "A página foi bloqueada devido a um filtro correspondente em {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "A página bloqueada quer redirecionar para outro site. Se você escolher prosseguir, você navegará diretamente para: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sem parâmetros", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Voltar", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Fechar esta janela", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Não me avise de novo sobre este site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Prosseguir", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remover um elemento", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Sair do modo de remoção de elementos", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Criar um filtro personalizado", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remover um filtro personalizado", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Visualizar:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalhes do modo de filtragem", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Regras DNR personalizadas", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Regras DNR de…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Conjunto de regras dinâmicas", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Conjunto de regras da sessão", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Salvar", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Reverter", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Adicionar", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importar e anexar…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportar…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Fazer backup…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restaurar…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Não adicione conteúdo de fontes não confiáveis.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Número de regras registradas: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Mova o controle para selecionar a melhor correspondência", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Selecionar", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Pré-visualizar", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Criar", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Selecione um filtro abaixo para destacar os elementos correspondentes na página. Clique na lixeira para remover um filtro.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Um bloqueador de conteúdo experimental, sem permissões. Bloqueia anúncios, rastreadores, mineiros de criptomoedas e muito mais.", + "message": "Um bloqueador de conteúdo eficiente. Bloqueia anúncios, rastreadores, mineradores e muito mais imediatamente após a instalação.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Painel de controlo", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Aviso! Tem alterações não guardadas", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Ficar", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorar", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Definições", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listas de filtros", + "customFiltersPageName": { + "message": "Filtros personalizados", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Os meus filtros", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Sites fidedignos", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Programação", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Acerca", @@ -51,78 +35,30 @@ "message": "Política de privacidade", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Desativar/ativar o uBO Lite para este site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Abrir o painel de controlo", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Entrar no modo \"zapper\" de elemento", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Entrar no modo de seleção de elemento", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "modo de filtragem", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Neste website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Relatar um problema neste website", + "message": "Relatar um problema", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Clique para tornar as suas alterações permanentes.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Clique para reverter as suas alterações.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Abrir o painel de controlo", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mais", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Clique para conceder ao uBO Lite permissões alargadas neste site.\nAs permissões alargadas permitem um bloqueio de conteúdo mais eficaz.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Clique para revogar as permissões alargadas neste site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Menos", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Mostrar o número de pedidos bloqueados no ícone", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Aparência", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Cor de destaque personalizada", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bloquear relatórios CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Ativar filtragem alargada em todos os websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "O uBO Lite apenas pode aplicar a filtragem alargada num determinado website após conceder explicitamente as permissões de extensão para modificar dados nesse website. Esta definição permite-lhe conceder permissões de filtragem alargada a todos os websites de uma só vez.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Predefinição", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domínios maliciosos", + "message": "Proteção contra malware, segurança", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regiões, idiomas", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Um filtro por linha. Um filtro pode ser um simples nome de anfitrião, ou um filtro compatível com a EasyList. Linhas começadas por ! serão ignoradas.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importar e anexar", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportar", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-custom-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "As diretivas de sites fidedignos determinam em que páginas web o uBO Lite deve ser desativado. Uma entrada por linha.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importar e anexar", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportar", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importar / Exportar", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Cole aqui filtros cosméticos específicos a adicionar", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Registo de alterações", @@ -211,25 +123,73 @@ "message": "Dependências externas (compatíveis com GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submeter", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplicar alterações", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Reverter", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Bem-vindo(a)", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Acabou de instalar o uBO Lite. Pode escolher aqui o modo de filtragem predefinido para usar em todos os websites.\n\nPor predefinição, o modo Básico é selecionado porque não requer a permissão para ler e modificar dados. Se confiar no uBO Lite, pode dar-lhe ampla permissão para ler e modificar dados em todos os websites, a fim de ativar capacidades de filtragem mais avançadas para todos os websites por predefinição.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Relatar um problema de filtro", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Relate problemas de filtros em websites específicos no controlador de problemas uBlockOrigin/uAssets. Requer uma conta GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informação sobre resolução de problemas", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Para evitar sobrecarregar os voluntários com relatórios duplicados, verifique se o problema ainda não foi relatado. Nota: clicar no botão fará com que a origem da página seja enviada para o GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Encontrar relatórios semelhantes no GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Endereço da página web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "A página web…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Escolha uma entrada --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Mostra anúncios ou restos de anúncios", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Tem sobreposições ou outros incómodos", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Deteta o uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Tem problemas relacionados com a privacidade", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Falha quando o uBO Lite está ativado", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Abre separadores ou janelas indesejáveis", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leva a badware e phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Classificar a página web como “NSFW” (“Não segura para o trabalho”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Criar novo relatório no GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Modo de filtragem predefinido", @@ -264,15 +224,191 @@ "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Filtragem de rede avançada mais filtragem alargada específica e genérica a partir de listas de filtros selecionadas.\n\nRequer ampla permissão para ler e modificar dados em todos os websites.\n\nA filtragem alargada genérica pode causar uma maior utilização de recursos das páginas web.", + "message": "Filtragem de rede avançada acrescida de filtragem alargada específica e genérica a partir de listas de filtros selecionadas.\n\nRequer permissão ampla para ler e modificar dados em todos os websites.\n\nA filtragem alargada genérica pode causar uma maior utilização de recursos das páginas web.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista de websites para os quais não será efetuada qualquer filtragem.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[apenas nomes de anfitriões]\nexemplo.com\njogos.exemplo\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Recarrega automaticamente a página ao mudar o modo de filtragem", + "message": "Recarregar automaticamente a página ao mudar o modo de filtragem", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Mostrar o número de pedidos bloqueados no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Ativar bloqueio estrito", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "A navegação para sites potencialmente indesejáveis será bloqueada e ser-lhe-á dada a opção de proceder.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Modo de programador", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Permite acesso a funcionalidades adequadas a utilizadores técnicos", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Cópia de segurança", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Faça uma cópia de segurança das suas definições personalizadas num ficheiro ou restaure as suas definições personalizadas a partir de um ficheiro.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "A restauração substituirá todas as suas definições personalizadas atuais.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Encontrar listas", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Página bloqueada", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "O uBO Lite impediu a seguinte página de ser carregada:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "A página foi bloqueada devido a um filtro correspondente em {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "A página bloqueada pretende redirecionar para outro site. Se optar por proceder, navegará diretamente para: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "sem parâmetros", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Voltar", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Fechar esta janela", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Não me avisar novamente acerca deste site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceder", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remover um elemento", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Sair do modo de remoção rápida de elemento", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Criar um filtro personalizado", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remover um filtro personalizado", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Ver:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detalhes do modo de filtragem", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Regras DNR personalizadas", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Regras DNR de…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Conjunto de regras dinâmico", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Conjunto de regras da sessão", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Guardar", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Reverter", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Adicionar", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importar e anexar…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportar…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Criar cópia…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restaurar…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Não adicione conteúdo de fontes não fidedignas", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Número de regras registadas: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Mova o controlo de deslize para selecionar a melhor correspondência", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Escolher", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Pré-visualizar", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Criar", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Selecione um filtro abaixo para destacar os elementos correspondentes na página web. Clique no caixote do lixo para remover um filtro.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ro/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ro/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ro/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ro/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ { "extName": { - "message": "ubock Origin Lite", + "message": "uBlock Origin Lite", "description": "extension name." }, "extShortDesc": { @@ -8,40 +8,24 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} de reguli convertite din {{filterCount}} filtre de rețea", + "message": "{{ruleCount}} de reguli, convertite din {{filterCount}} filtre de rețea", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "uBO Lite — Panou de control", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Atenție! Ai modificări nesalvate", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Așteaptă", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignoră", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Opțiuni", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Liste de filtre", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Filtrele mele", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Situri de încredere", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Despre", @@ -51,78 +35,30 @@ "message": "Politică de confidențialitate", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Dezactivează/Activează uBO Lite pentru acest sit", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Deschide panoul de control", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Elimină un element", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Alege un element", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Mod de filtrare", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Raportează o eroare cu acest sit web", + "message": "Raportează o eroare pe acest site web", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Apasă pentru a face modificările permanente.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Apasă pentru a renunța la modificări.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Deschide panoul de control", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mai mult", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Apasă pentru a acorda uBO Lite permisiuni extinse pentru acest sit.\nAcestea sunt mai eficiente pentru blocarea conținutului.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Apasă pentru a revoca permisiunile extinse pentru acest sit.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mai puțin", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Arată numărul cererilor blocate pe simbolul extensiei", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Aspect", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Aspect", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Culoare de accentuare personalizată", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blochează rapoartele CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Activează filtrarea extinsă pe toate site-urile web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite poate aplica filtrarea extinsă pentru un anumit sit web numai după ce s-au acordat în mod explicit extensiei permisiunile de modificare a datelor de pe acel sit web. Această reglare permite acordarea de permisiuni pentru filtrarea extinsă a tuturor siturilor web simultan.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Implicit", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Regiuni, limbi", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Un filtru pe linie. Un filtru poate fi un simplu nume de gazdă sau un filtru compatibil EasyList. Liniile precedate de ! vor fi ignorate.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importă și adaugă", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportă", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "filtrele-mele-statice-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Directivele privind siturile de încredere stabilesc pe ce pagini web trebuie dezactivat uBO Lite. O intrare pe linie.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importă și adaugă", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportă", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "situri-de-încredere-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Jurnal de modificări", @@ -211,25 +123,73 @@ "message": "Dependențe externe (compatibile GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Trimite", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Aplică modificările", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Înlătură", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Bun venit", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Tocmai ați instalat uBO Lite. Aici puteți alege modul de filtrare implicit pe toate site-urile.\n\nImplicit, modul de bază,/em> este selectat întrucât nu necesită permisiuni pentru a citi și modifica date. Dacă aveți încredere în uBO Lite, puteți să-i acordați permisiuni sporite pentru a citi și modifica datele tututor sitte-rilor pentru a activa capabilități mai avansate de filtrare.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Raportează o problemă cu filtrele", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Raportează aici o eroare cu filtrele pentru un site specific uBlockOrigin/uAssets issue tracker. Este necesar un cont GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Pentru a evita încărcarea voluntarilor cu rapoarte duplicate, vă rugăm să verificați dacă problema nu a fost deja raportată.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Găsiți rapoarte similare", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa paginii web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Pagina web…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Alege o intrare --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Arată reclame sau resturi de reclame", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Are suprapuneri sau alte inconveniente", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detectează uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Are probleme privind confidențialitatea", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Defecțiuni atunci când uBO Lite este activat", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Deschide file sau ferestre nedorite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Duce la programe dăunătoare, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Etichetați pagina web ca “NSFW” (“Nu este sigur la locul de muncă”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Creează o nouă sesizare", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Mod de filtrare implicit", @@ -267,6 +227,14 @@ "message": "Filtrare de rețea avansată plus filtrare extinsă specifică și generică de la liste de filtre selectate.\n\nNecesită permisiune vagă pentru a citi și modifica date pe toate site-urile web.\n\nFiltrarea generică extinsă poate cauza mai multă utilizare de resurse la nivel de pagină web.\n", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista numelor site-urilor pentru care nu se va face filtrare", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[doar hostnames]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportament", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Reîncărcare automată a paginii la schimbarea modului de filtrare", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Arată numărul cererilor blocate pe simbolul extensiei", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Activați blocarea strictă", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigarea către site-uri potențial nedorite va fi blocată și vi se va oferi opțiunea de a continua.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Căutați liste", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Pagină blocată", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite a împiedicat încărcarea următoarei pagini:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Pagina a fost blocată din cauza unui filtru din {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Pagina blocată dorește să redirecționeze către un alt site. Dacă alegeți să continuați, veți naviga direct către: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "fără parametri", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Înapoi", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Închide fereastra", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Nu mă avertiza din nou despre acest site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Continuă", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Alege un filtru de mai jos pentru a evidenția elementele cu potriviri în pagina web. Clic pe [Coș de gunoi] pentru a îndepărta un filtru.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ru/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ru/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ru/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ru/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Экспериментальный облегчённый блокировщик контента, не требующий разрешений. Блокирует рекламу, трекеры, майнеры и многое другое.", + "message": "Эффективный блокировщик веб-элементов. Сразу после установки блокирует рекламу, трекеры, майнеры и многое другое.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Панель управления", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Внимание! У вас есть несохранённые изменения", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Остаться", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Игнорировать", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Настройки", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Списки фильтров", + "customFiltersPageName": { + "message": "Пользовательские фильтры", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Мои фильтры", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Доверенные сайты", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Разработка", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "О расширении", @@ -51,78 +35,30 @@ "message": "Политика конфиденциальности", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Отключить/включить uBO Lite для этого сайта", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Открыть панель управления", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Режим мгновенного временного скрытия элемента", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Войти в режим выбора элементов", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "режим фильтрации", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "На этом сайте", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Сообщить о проблеме на данном сайте", + "message": "Сообщить о проблеме", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Нажмите, чтобы сохранить изменения.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Нажмите, чтобы отменить изменения.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Открыть панель управления", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Больше", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Нажмите, чтобы предоставить uBO Lite дополнительные разрешения на этом сайте.\nДополнительные разрешения позволяют эффективнее блокировать контент.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Нажмите, чтобы отозвать дополнительные разрешения на этом сайте", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Меньше", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Показывать количество заблокированных запросов на иконке", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Внешний вид", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Тема", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Пользовательский цветовой акцент", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Блокировать CSP отчеты", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Включить расширенную фильтрацию на всех веб-сайтах", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite может применять расширенную фильтрацию на данном веб-сайте только после того, как вы явно предоставите расширению разрешения на изменение данных на этом веб-сайте. Этот параметр позволяет вам предоставлять разрешения на расширенную фильтрацию сразу всем веб-сайтам.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "По умолчанию", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Вредоносные домены", + "message": "Защита от вредоносных сайтов, безопасность", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Регионы, языки", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Одно правило на строку. Правилом может быть имя сайта, или EasyList-совместимый фильтр. Строки, начинающиеся с !, будут проигнорированы.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Импортировать и добавить", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Экспортировать", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Записи доверенных сайтов указывают на каких веб-страницах uBO Lite должен быть отключён. Одна запись на строку.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Импортировать и добавить", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Экспортировать", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Импорт / Экспорт", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Вставьте сюда отдельные косметические фильтры для добавления", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Список изменений", @@ -208,28 +120,76 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "Внешние зависимости (GPLv3-совместимые):", + "message": "Внешние зависимости (совместимые с GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Подтвердить", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Применить изменения", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Вернуть", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Добро пожаловать", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Вы только что установили uBO Lite. Здесь вы можете выбрать стандартный режим фильтрации для всех веб-сайтов.\n\nПо умолчанию выбран режим Базовый, так как он не требует разрешения на чтение и изменение данных. Если вы доверяете uBO Lite, вы можете дать ему широкие права на чтение и изменение данных на всех веб-сайтах, чтобы включить более продвинутые возможности фильтрации для всех веб-сайтов по умолчанию.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Сообщить о проблеме в фильтре", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Сообщайте о проблемах с фильтрами на определённых сайтах в трекер ошибок uBlockOrigin/uAssets. Требуется учётная запись в GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Диагностическая информация", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Чтобы не обременять добровольцев повторяющимися отчётами, пожалуйста, убедитесь, что об этой проблеме ещё не сообщали. Примечание: щелчок по кнопке приведёт к отправке адреса посещенной страницы GitHub'у.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Найти похожие отчёты в GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адрес веб-страницы:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Веб-страница…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Выберите категорию --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Показывается реклама или ее заполнители", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Всплывающие окна или другие помехи", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Обнаруживается uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Проблемы, связанные с приватностью", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Неполадки при работе uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Открываются нежелательные вкладки или окна", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Вредоносное ПО, фишинг", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Пометить эту страницу «небезопасной для просмотра на работе» («NSFW»)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Создать новый отчёт в GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Режим фильтрации по умолчанию", @@ -267,6 +227,14 @@ "message": "Расширенная сетевая фильтрация вместе со специальной, и усиленной общей фильтрацией по выбранным спискам фильтров.\n\nТребуется разрешение на чтение и изменение данных на всех веб-сайтах.\n\nУсиленная общая фильтрация может стать причиной повышенного потребления ресурсов веб-страницей.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Список имён хостов, для которых не будет производиться фильтрация.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[только имена хостов]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведение", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Автоматически перезагружать страницу при изменении режима фильтрации", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показывать количество заблокированных запросов на иконке в панели инструментов", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Включить строгую блокировку", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Переход к потенциально нежелательным сайтам будет заблокирован, и будет дана возможность продолжить переход на сайт", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Режим разработчика", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Включает доступ к функциям, предназначенным для технических пользователей.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Резервная копия", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Создайте резервную копию пользовательских настроек в файле, или восстановите настройки из файла.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Восстановление перезапишет все ваши текущие пользовательские настройки.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Найти списки", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Страница заблокирована", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite предотвратил загрузку следующей страницы:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Веб-страница была заблокирована из-за попадания в фильтр из {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Заблокированная страница собирается перенаправить вас на другой сайт. Если вы решите продолжить, вы перейдете непосредственно на: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "без параметров", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Назад", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Закрыть это окно", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Больше не предупреждать меня об этом сайте", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Продолжить", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Убрать элемент", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Покинуть режим временного скрытия элемента", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Создать свой фильтр", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Удалить свой фильтр", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Просмотр:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Подробности режима фильтрации", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Пользовательские правила DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Правила DNR для…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Динамический набор правил", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Набор правил для сессии", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Сохранить", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Вернуть", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Добавить", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Импортировать и добавить…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Экспортировать…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Создать рез. копию…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Восстановить…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Не добавлять содержимое из ненадёжных источников", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Число зарегистрированных правил: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Перемещайте ползунок для выбора лучшего варианта", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Выбрать элемент", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Предпросмотр", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Создать", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Выберите фильтр ниже, чтобы подсветить соответствующие элементы на странице. Нажмите на корзину для удаления фильтра.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/si/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/si/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/si/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/si/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "අවසර අනවශ්‍ය අන්තර්ගත අවහිරකය. ස්ථාපනය කළ වහාම දැන්වීම්, ලුහුබැඳීම්, කැණීම් සහ තවත් දෑ අවහිර කරයි.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "නීති {{ruleCount}} ක් ජාල පෙරහන් {{filterCount}} කින් හරවා ඇත", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite - උපකරණ පුවරුව", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "සැකසුම්", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "පිළිබඳ", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "රහස්‍යතා ප්‍රතිපත්තිය", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "පෙරීමේ ප්‍රකාරය", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "මෙම අඩවියේ ගැටලුවක් වාර්තා කරන්න", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "උපකරණ පුවරුව අරින්න", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "තව", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "අඩුවෙන්", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "පෙරනිමි", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "දැන්වීම්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "පෞද්ගලිකත්‍වය", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "ද්වේශාංග වසම්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "පීඩාකාරී", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "වෙනත්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "කලාපීය, භාෂා", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "වෙනස්කම් සටහන", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "මූලාශ්‍ර කේත (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "දායකයින්", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "මූලාශ්‍ර කේත", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "පරිවර්තන", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "පෙරහන් ලැයිස්තු", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "බාහිර පරායත්ත (GPLv3-අනුකූල):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "පෙරහන් ගැටලු වාර්තා කරන්න", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "නිශ්චිත වෙබ් අඩවි සමඟ පෙරහන් ගැටළු uBlockOrigin/uAssets ගැටළු ට්රැකර්වෙත වාර්තා කරන්න. GitHub ගිණුමක් අවශ්‍යයි.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "දෝශ නිරාකරණ තොරතුරු", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "අනුපිටපත් වාර්තා සමඟ ස්වේච්ඡා සේවකයින්ට බරක් වීම වළක්වා ගැනීම සඳහා, කරුණාකර ගැටළුව දැනටමත් වාර්තා කර නොමැති බව තහවුරු කරගන්න. සටහන: බොත්තම ක්ලික් කිරීමෙන් පිටුවේ මූලාරම්භය GitHub වෙත යවනු ලැබේ.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "සමාන වාර්තා සොයන්න", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "අඩවියේ ලිපිනය:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "වියමන පිටුව…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- නිවේශිතයක් තෝරන්න --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "දැන්වීම් හෝ දැන්වීම් ඉතිරි කොටස් පෙන්වයි", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "උඩැතිරි හෝ වෙනත් කරදර ඇති", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "uBO Lite අනාවරණය කරයි", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "පෞද්ගලිකත්‍වය ආශ්‍රිත ගැටළු තිබේ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "uBO Lite සක්‍රීය කර ඇති විට සිදුවන අක්‍රමිකතා", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "අනවශ්‍ය පටිති හෝ කවුළු අරියි", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "නරක මෘදුකාංග, තතුබෑම් වලට මග පාදයි", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "වෙබ් පිටුව “NSFW” ලෙස ලේබල් කරන්න (“වැඩ සඳහා ආරක්ෂිත නොවේ”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "නව වාර්තාවක් සාදන්න", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "පෙරනිමි පෙරීමේ ප්‍රකාරය", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "පෙරනිමි පෙරහන් මාදිලිය එක් එක් වෙබ් අඩවියට පෙරහන් මාදිලි මගින් අභිබවා යනු ඇත. ඔබට ඕනෑම වෙබ් අඩවියක පෙරහන් මාදිලිය එම වෙබ් අඩවියේ වඩාත් හොඳින් ක්‍රියාත්මක වන මාදිලිය අනුව සකස් කළ හැකිය. සෑම මාදිලියකටම එහි වාසි සහ අවාසි ඇත.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "පෙරීමක් නැත", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "මූලික", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "ප්‍රශස්ත", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "සම්පූර්ණ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "තෝරාගත් පෙරහන් ලැයිස්තු වලින් මූලික ජාල පෙරහන.\n\nවෙබ් අඩවි වල දත්ත කියවීමට සහ වෙනස් කිරීමට අවසර අවශ්‍ය නොවේ.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "තෝරාගත් පෙරහන් ලැයිස්තු වලින් උසස් ජාල පෙරහන් සහ නිශ්චිත දිගු පෙරහන්.\n\nසියලුම වෙබ් අඩවි වල දත්ත කියවීමට සහ වෙනස් කිරීමට පුළුල් අවසරයක් අවශ්‍ය වේ.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "තෝරාගත් පෙරහන් ලැයිස්තු වලින් උසස් ජාල පෙරහන් සහ විශේෂිත සහ සාමාන්‍ය දිගු පෙරහන්.\n\nසියලුම වෙබ් අඩවි වල දත්ත කියවීමට සහ වෙනස් කිරීමට පුළුල් අවසරයක් අවශ්‍ය වේ.\n\nසාමාන්‍ය දිගු පෙරහන් මඟින් වෙබ් පිටු සම්පත් භාවිතය ඉහළ යාමට හේතු විය හැක.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "පෙරීමක් නොවන අඩවි ලැයිස්තුව.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[සත්කාරක පමණි]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "හැසිරීම", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "පෙරීමේ ප්‍රකාරය වෙනස් වූ විට පිටුව ස්වයංක්‍රීයව යළි පූරණය කරන්න", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "මෙවලම් තීරු නිරූපකයේ අවහිර කළ ඉල්ලීම් ගණන පෙන්වන්න", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "දැඩි අවහිර කිරීම සක්‍රීය කරන්න", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "අනවශ්‍ය විය හැකි අඩවි වෙත සංචාලනය අවහිර කරනු ලබන අතර, ඉදිරියට යාමට ඔබට විකල්පය ලබා දෙනු ඇත.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "ලැයිස්තු සොයන්න", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "පිටුව අවහිරයි", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite විසින් පහත පිටුව පූරණය වීම වළක්වා ඇත:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "{{listname}}හි ගැළපෙන පෙරහනක් නිසා පිටුව අවහිර කරන ලදී.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "අවහිර කළ පිටුව වෙනත් අඩවියකට හරවා යැවීමට අවශ්‍යයි. ඔබ ඉදිරියට යාමට තෝරා ගන්නේ නම්, ඔබ කෙලින්ම මෙහි සංචාලනය කරනු ඇත: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "පරාමිතීන් නොමැතිව", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "ආපසු යන්න", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "මෙම කවුළුව වසන්න", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "මෙම අඩවිය ගැන මට නැවත අනතුරු අඟවන්න එපා.", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "ඉදිරියට", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "මූලද්‍රව්‍ය zapper ප්‍රකාරයට ඇතුළු වන්න", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "මූලද්‍රව්‍ය zapper ප්‍රකාරයෙන් ඉවත් වන්න", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sk/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sk/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sk/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sk/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Experimentálny blokátor obsahu bez povolení – predvolene blokuje reklamy, sledovacie programy, minery a ďalšie.", + "message": "Experimentálny blokátor obsahu bez povolení. Okamžite po inštalácii zablokuje reklamy, sledovacie programy, minery a ďalšie.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -12,36 +12,20 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBlock Lite — Ovládací panel", + "message": "uBO Lite — Ovládací panel", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Upozornenie! Máte neuložené zmeny", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Zostať", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorovať", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Nastavenia", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Zoznam filtrov", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Moje filtre", + "customFiltersPageName": { + "message": "Vlastné filtre", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Dôveryhodné stránky", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Vývoj", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "O doplnku", @@ -51,78 +35,30 @@ "message": "Zásady ochrany osobných údajov", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Zakázať/povoliť uBO Lite pre túto stránku", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Otvoriť ovládací panel", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Prejsť do režimu výberu prvku", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Prejsť do režimu výberu prvku", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Režim filtrovania", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Na tejto webovej stránke", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Nahlásiť problém na tejto webovej stránke", + "message": "Nahlásiť problém", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Kliknutím použijete vaše zmeny.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kliknutím vrátite vaše zmeny.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Otvoriť ovládací panel", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Viac", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Kliknutím udelíte uBO Lite rozšírené oprávnenia na tejto stránke.\nRozšírené oprávnenia umožňujú účinnejšie blokovanie obsahu.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Kliknutím zrušíte rozšírené oprávnenia na tejto stránke", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Menej", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Zobraziť počet zablokovaných požiadaviek na ikone", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Vzhľad", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Téma", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Vlastná farba témy", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Zablokovať CSP hlásenia", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Povoliť rozšírené filtrovanie na všetkých webových stránkach", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite môže na danú webovú lokalitu použiť rozšírené filtrovanie len po tom, ako rozšíreniu výslovne udelíte oprávnenia na úpravu údajov na danej webovej lokalite. Toto nastavenie umožňuje udeliť oprávnenia na rozšírené filtrovanie všetkým webovým stránkam naraz.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Predvolené", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domény malvéru", + "message": "Ochrana pred škodlivým softvérom, bezpečnosť", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regióny, jazyky", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Jeden filter na riadok. Filter môže byť jednoduchý názov hostiteľa alebo filter kompatibilný s Adblock Plus. Riadky začínajúce s ! budú ignorované.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importovať a pripojiť", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportovať", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-moje-statické-filtre_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Zoznam dôveryhodných stránok pre ktoré bude uBO Lite zakázaný. Jedna položka na riadok.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importovať a pripojiť", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportovať", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-doveryhodne-stranky_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import/export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Sem vložte špecifické kozmetické filtre, ktoré chcete pridať", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Zoznam zmien", @@ -211,25 +123,73 @@ "message": "Externé závislosti (kompatibilné s GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Poslať", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Použiť zmeny", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Vrátiť", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Vitajte", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Práve ste nainštalovali uBO Lite. Tu si môžete vybrať predvolený režim filtrovania, ktorý sa má používať na všetkých webových stránkach.\n\nV predvolenom nastavení je zvolený režim Základný, pretože nevyžaduje povolenie na čítanie a zmenu údajov. Ak dôverujete rozšíreniu uBO Lite , môžete mu udeliť všeobecné oprávnenie na čítanie a zmenu údajov na všetkých webových stránkach, aby ste v predvolenom nastavení umožnili pokročilejšie možnosti filtrovania všetkých webových stránok.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Nahlásiť problém s filtrom", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Nahlásenie problémov s filtrom s konkrétnymi webovými stránkami na uBlockOrigin/uAssets issue tracker. Vyžaduje sa GitHub účet.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Informácie o riešení problémov", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Aby ste dobrovoľníkov nezaťažovali duplicitnými hláseniami, overte si, či už problém nebol nahlásený. Poznámka: kliknutím na tlačidlo sa odošle pôvodná stránka na GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Vyhľadať podobné hlásenia na Githube", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa webovej stránky:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Webová stránka…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Vyberte položku --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Zobrazuje reklamy alebo zvyšky reklám", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Je prekrytá alebo má iné nedostatky", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detegovaný uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Má problémy súvisiace so súkromím", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Poruchy pri povolenom uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Otvára nechcené karty alebo okná", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Smeruje k badvéru a phishingu", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Označiť webovú stránku ako \"NSFW\" (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Vytvoriť nové hlásenie na Githube", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Predvolený režim filtrovania", @@ -256,17 +216,25 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Základné filtrovanie siete z vybraných zoznamov filtrov.\n\nNevyžaduje povolenie na čítanie a zmenu údajov na webových stránkach.", + "message": "Základné sieťové filtrovanie z vybraných zoznamov filtrov.\n\nNevyžaduje povolenie na čítanie a zmenu údajov na webových stránkach.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Pokročilé filtrovanie siete a špecifické rozšírené filtrovanie z vybraných zoznamov filtrov.\n\nVyžaduje všeobecné oprávnenie na čítanie a zmenu údajov na všetkých webových stránkach.", + "message": "Pokročilé sieťové filtrovanie a špecifické rozšírené filtrovanie z vybraných zoznamov filtrov.\n\nVyžaduje všeobecné oprávnenie na čítanie a zmenu údajov na všetkých webových stránkach.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Pokročilé filtrovanie siete plus špecifické a všeobecné rozšírené filtrovanie z vybraných zoznamov filtrov.\n\nVyžaduje všeobecné oprávnenie na čítanie a zmenu údajov na všetkých webových stránkach.\n\nVšeobecné rozšírené filtrovanie môže spôsobiť vyššie využitie zdrojov webovej stránky.", + "message": "Pokročilé sieťové filtrovanie plus špecifické a generické rozšírené filtrovanie z vybraných zoznamov filtrov.\n\nVyžaduje všeobecné oprávnenie na čítanie a zmenu údajov na všetkých webových stránkach.\n\nGenerické rozšírené filtrovanie môže spôsobiť vyššie využitie zdrojov webovej stránky.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Zoznam názvov hostiteľov s vylúčeným filtrovaním", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[len názvy hostiteľov]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Správanie", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automaticky znova načítať stránku pri zmene režimu filtrovania", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Zobraziť počet zablokovaných požiadaviek na ikone rozšírenia", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Povoliť prísne blokovanie", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigácia na potenciálne nežiaduce stránky sa zablokuje a ponúkne sa vám možnosť pokračovať.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Vývojársky režim", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Umožňuje prístup k funkciám vhodným pre technických používateľov.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Zálohovať/Obnoviť", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Zálohujte si vlastné nastavenia do súboru alebo obnovte vlastné nastavenia zo súboru.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Obnovením sa prepíšu všetky vaše aktuálne vlastné nastavenia.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Nájsť zoznamy", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Zablokovaná stránka", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite zabránil načítaniu nasledujúcej stránky:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Stránka bola zablokovaná z dôvodu zhodného filtra v{{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Zablokovaná stránka chce presmerovať na inú stránku. Ak sa rozhodnete pokračovať, prejdete priamo na: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "bez parametrov", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Naspäť", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Zatvoriť toto okno", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Už ma na túto stránku neupozorňovať", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Pokračovať", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Odstrániť prvok", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Ukončiť režim dočasného skrytia prvkov", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Vytvoriť vlastný filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Odstrániť vlastný filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Zobraziť:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Podrobnosti režimu filtrovania", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Vlastné pravidlá DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Pravidlá DNR…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamický súbor pravidiel", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Súbor pravidiel relácie", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Uložiť", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Vrátiť späť", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Pridať", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importovať a pripojiť…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportovať…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Zálohovať…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Obnoviť…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Nepridávajte obsah z nedôveryhodných zdrojov", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Počet zaregistrovaných pravidiel: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Posunutím jazdca vyberte najlepšiu zhodu", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Vybrať", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Náhľad", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Vytvoriť", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Vyberte filter na zvýraznenie zodpovedajúcich prvkov na webovej stránke. Ak chcete filter odstrániť, kliknite na kôš.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sl/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sl/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sl/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sl/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/so/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/so/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/so/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/so/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sq/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sq/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sq/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sq/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,44 +4,28 @@ "description": "extension name." }, "extShortDesc": { - "message": "Një bllokues eksperimental që bllokon në mënyrë të pavarur reklamat, gjurmuesit, kriptominatorët etj. menjëherë pas instalimit.", + "message": "Një bllokues efikas për reklamat, gjurmuesit, kriptominatorët e të tjera, që vepron menjëherë pas instalimit.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rregulla të konvertuara nga {{filterCount}} filtra rrjeti", + "message": "{{ruleCount}} rregulla sipas {{filterCount}} filtrave", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "uBO Lite — Paneli i kontrollit", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Kujdes! Nuk keni ruajtur ndryshimet", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Qëndroj", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Shpërfill", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Parametrat", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Listat e filtrave", + "customFiltersPageName": { + "message": "Filtrat e personalizuar", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Filtrat e mi", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Faqet e besuara", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Zhvillimi", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Info", @@ -51,78 +35,30 @@ "message": "Politika e privatësisë", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Ç/Aktivizoj uBO Lite te ky uebsajti", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Hap panelin e kontrollit", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Asgjësuesi i elementeve", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Përzgjedhësi i elementeve", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "mënyra e filtrimit", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Në këtë uebsajt", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Raportoj problemin me uebsajtin", + "message": "Raportoj problemin", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Ruaj përgjithnjë ndryshimet.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Kthej ndryshimet.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Hapni panelin e kontrollit", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Më shumë", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klikoni për t'i dhënë uBO Lite leje të posaçme për uebsajtin.\nLejet e posaçme mundësojnë një bllokim më efektiv të materialeve.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klikoni për të revokuar lejet e posaçme për uebsajtin.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Më pak", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Shfaq te ikona numrin e kërkesave të bllokuara", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Paraqitja", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Motivi", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Personalizoj ngjyrën e theksuar", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Bllokoj raportet e CSP-së", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Lejoj filtrimin më të plotë të uebsajteve", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite mund të filtrojë më mirë kur i jepni leje të posaçme për modifikimin e të dhënave të uebsajteve. Ky parametër mundëson dhënien e lejeve të posaçme për një filtrim më të plotë dhe të menjëhershëm të të gjitha uebsajteve.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standarde", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domenet e dëmshme", + "message": "Domenet e dëmshme, siguria", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Sipas rajonit, gjuhës", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Një filtër për rresht. Filtri mund të jetë thjesht emri i një hosti ose si ata që përdor EasyList. Nuk do të merren parasysh rreshtat që fillojnë me !.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importoj dhe shtoj", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Eksportoj", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Kjo listë paraqet faqet e besuara të internetit në të cilat uBO Lite duhet çaktivizuar. Një element për rresht.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importoj dhe shtoj", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Eksportoj", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importoj / Eksportoj", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Filtrat specifikë të personalizuar kalohen këtu", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Ditari i ndryshimeve", @@ -211,32 +123,80 @@ "message": "Programet kushtëzuese (sipas GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Parashtroj", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Ruaj ndryshimet", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Rikthej", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Përshëndetje", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Sapo instaluat uBO Lite. Këtu mund të zgjidhni mënyrën e filtrimit që duhet përdorur për të gjitha uebsajtet.\n\nE thjeshta është mënyra standarde, sepse nuk ju merret leje për leximin dhe modifikimin e të dhënave. Nëse keni besim te uBO Lite, mund t'i jepni leje shtesë për leximin dhe modifikimin e të dhënave në të gjitha uebsajtet, në mënyrë që të kryeni një filtrim më të avancuar.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Raportoni problemet me filtrat", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Problemet e disa faqeve me filtrat duhen raportuar në ditarin e problemeve uBlockOrigin/uAssets. Duhet një konto GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Diagnostikimi i problemeve", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Verifikoni a është raportuar edhe më parë që të mos i lodhni vullnetarët e tjerë me të njëjtat probleme. Shënim: kur klikoni butonin, origjina e faqes do të dërgohet në GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Gjej raporte të ngjashme në GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Adresa e uebsajtit:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Uebsajti…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Zgjidhni --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shfaq reklama ose pjesë reklamash", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Ka mbivendosje ose parregullsi të tjera", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Zbulon uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Ka probleme me ruajtjen e privatësisë", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Punon keq kur uBO Lite është i aktivizuar", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Hap skeda ose dritare të panevojshme", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Çon te programet keqdashëse, mashtruese", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Etiketoni faqen e internetit si “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Krijoj raport të ri në GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Mënyra standarde e filtrimit", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "Mënyra standarde e filtrimit mund të ndryshohet në çdo kohë, në varësi të kërkesave që kanë uebsajte të caktuara. Secila mënyrë ka avantazhet dhe disavantazhet e veta.", + "message": "Mënyra standarde e filtrimit mund të ndryshohet në çdo kohë sipas kërkesave që kanë uebsajte të caktuara. Secila mënyrë ka avantazhet dhe disavantazhet e veta.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -267,6 +227,14 @@ "message": "Filtrat e avancuar të rrjetit plus filtrat e posaçëm jospecifikë nga listat e përzgjedhura.\n\nDuhen leje shtesë për leximin dhe modifikimin e të dhënave në të gjitha uebsajtet.\n\nFiltrat e posaçëm jospecifikë mund ta rëndojnë hapjen e faqeve në internet.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista e uebsajteve që nuk do të kalojnë në filtër.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[vetëm emrat e hosteve]\nshembull.com\nlojera.shembull\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Sjellja", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Freskoj automatikisht faqen kur ndryshoj mënyrën e filtrimit", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Shfaq numrin e kërkesave të bllokuara në ikonën e instrumenteve", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Aktivizoj bllokimin strikt", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Uebsajtet potencialisht të padëshirueshme do të bllokohen dhe do t'ju jepet mundësia për të vazhduar.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Këndi i zhvilluesit", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Mundëson qasjen në funksione të përshtatshme për përdoruesit teknikë.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Kopja rezervë", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Mbani një kopje rezervë të parametrave që keni personalizuar ose riktheni parametrat e mëparshëm.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Rikthimi do të fshijë gjithë parametrat që keni personalizuar.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Gjej listat", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Faqe e bllokuar", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite pengoi hapjen e faqes vijuese:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Faqja u bllokua për shkak se përputhet me filtrin në {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Faqja e bllokuar do t'ju drejtojë në një uebsajt tjetër. Në rast se pranoni do të shkoni direkt te: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "pa parametra", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Kthehem", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Mbyll dritaren", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Mos më lajmëro për këtë faqen", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Vazhdoj", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Heq elementin", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Mbyll asgjësuesin e elementeve", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Krijoj filtër të personalizuar", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Heq filtrin e personalizuar", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Pamja:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Detajet e mënyrës së filtrimit", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Rregullat DNR të personalizuara", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Rregullat DNR të…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Rregullat dinamike", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Rregullat e seancës", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Regjistroj", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Rikthej", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Shtoj", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importoj dhe shtoj…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Eksportoj…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Rezervoj…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Rikthej…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Mos shtoni materiale nga burime të pabesueshme", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Numri i rregullave të regjistruara: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Lëvizeni për të zgjedhur pikën më të përshtatshme", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Zgjedh", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Parashikoj", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Krijoj", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Zgjidhni ndër filtrat më poshtë për të parë elementin që i korrespondon në faqe. Filtrat hiqen duke klikuar koshin.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sr/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sr/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sr/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sr/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Експериментални блокатор садржаја који не захтева дозволе. Блокира рекламе, праћења, рударе криптовалута и друго.", + "message": "Блокатор садржаја који не захтева дозволе. Блокира рекламе, праћења, рударе криптовалута и друго.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Контролна табла", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Упозорење! Имате несачуване промене", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Остани", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Занемари", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Подешавања", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Листе филтера", + "customFiltersPageName": { + "message": "Прилагођени филтери", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Моји филтери", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Поуздани сајтови", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Развити", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "О апликацији", @@ -51,78 +35,30 @@ "message": "Политика приватности", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Онемогући/омогући uBO Lite за овај сајт", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Отвори контролну таблу", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Уђи у режим уклањања елемената", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Уђи у режим избора елемената", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "режим филтрирања", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "На овој веб страници", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Пријавите проблем на овом веб сајту", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Кликните да бисте своје промене учинили трајним.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Кликните да бисте вратили промене.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Отвори контролну таблу", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Више", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Кликните да бисте uBO Lite доделили проширене дозволе на овом сајту.\nПроширене дозволе омогућују ефикасније блокирање садржаја.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Кликните да бисте опозвали проширене дозволе на овом сајту.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Мање", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Прикажи број блокираних захтева на иконици", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Изглед", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Тема", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Прилагођена наглашена боја", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Блокирај CSP извештаје", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Омогући проширено филтрирање на свим веб сајтовима", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite може да примени проширено филтрирање на датом веб сајту само након што изричито доделите дозволе проширењу за измену података на том веб сајту. Ово подешавање вам омогућује да доделите дозволе за проширено филтрирање на свим веб сајтовима одједном.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Подразумевано", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Регионални, језички", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Један филтер по реду. Филтер може бити обично име хоста или филтер компатибилан са EasyList-ом. Редови са префиксом ! ће бити занемарени.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Увези и додај", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Извези", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "моји-ublock-статични-филтери_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Смернице поузданих сајтова диктирају на којим веб страницама uBO Lite треба да буде онемогућен. Један унос по реду.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Увези и додај", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Извези", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "моји-ublock-поуздани-сајтови{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Увоз / извоз", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Овде налепите одређене козметичке филтере које желите додати", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Списак измена", @@ -211,25 +123,73 @@ "message": "Спољне зависности (компатибилно са GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Проследи", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Примени промене", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Врати", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Добродошли", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Управо сте инсталирали uBO Lite. Овде можете изабрати подразумевани режим филтрирања који ће се користити на свим сајтовима.\n\nПодразумевано је изабран основни режим јер он не захтева дозволу за читање и мењање података. Ако верујете uBO Lite-у, можете му дати широку дозволу за читање и мењање података како би се подразумевано омогућиле напредније могућности филтрирања за све сајтове.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Пријављивање проблема са филтером", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Пријавите проблеме са филтерима на одређеним веб сајтовима на uBlockOrigin/uAssets issue tracker. Захтева GitHub налог.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Информације о решавању проблема", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Да не бисте оптерећивали волонтере дуплим извештајима, проверите да ли је проблем већ пријављен.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Пронађи сличне извештаје", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адреса веб странице:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Веб страница...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Приказује рекламе или остатке реклама", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Има преклапања или друге сметње", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Детектује uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Кварови када је uBO Lite омогућен", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Отвара нежељене картице или прозоре", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Води до лошег софтвера, „пецања\"", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Означи веб страницу као „NSFW” („Није безбедно за рад”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Креирај нови извештај", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Подразумевани режим филтрирања", @@ -267,6 +227,14 @@ "message": "Напредно мрежно и специфично и генеричко проширено филтрирање са изабраних листа филтера.\n\nЗахтева широку дозволу за читање и мењање података на свим сајтовима.\n\nГенеричко филтрирање може довести до већег коришћења ресурса веб странице.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Листа веб сајтова за које се неће вршити филтрирање", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[само имена хостова]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Понашање", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Аутоматски поново учитај страницу при промени режима филтрирања", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Прикажи број блокираних захтева на иконици на траци алата", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Омогући строго блокирање", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Навигација до потенцијално непожељних сајтова ће бити блокирана и биће вам понуђена опција да наставите.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Режим за програмере", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Омогућава приступ функцијама погодним за техничке кориснике.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Пронађи листе", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Страница је блокирана", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite је спречио учитавање следеће странице:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Страница је блокирана због одговарајућег филтера у {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Блокирана страница жели да преусмери на други сајт. Ако одлучите да наставите, бићете директно на: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "без параметара", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Иди назад", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Затвори овај прозор", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Не упозоравај ме поново на ову страницу", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Настави", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Уклоните елемент", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Изађи из режима за затварање елемената", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Направите прилагођени филтер", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Уклоните прилагођени филтер", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Приказ:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Детаљи режима филтрирања", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Прилагођена правила за DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "ДНР правила …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Динамички скуп правила", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Скуп правила сесије", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Сачувај", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Врати", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Додај", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Увези и додај…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Извоз…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Не додајте садржај из непоузданих извора", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Број регистрованих правила: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Померите клизач да бисте изабрали најбоље подударање", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Изаберите", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Прегледај", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Креирај", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Изаберите филтер испод да бисте истакли одговарајуће елементе на веб страници. Кликните на канту за смеће да бисте уклонили филтер.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sv/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sv/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sv/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sv/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "En experimentell blockerare. Blockerar annonser, spårare, miners och mer omedelbart efter installationen.", + "message": "En effektiv innehållsblockerare. Blockerar annonser, spårare, miners och mer direkt efter den har installerats.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Kontrollpanel", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Varning! Du har inte sparat dina ändringar", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stanna kvar", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignorera", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Inställningar", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filterlistor", + "customFiltersPageName": { + "message": "Anpassade filter", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Mina filter", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Pålitliga webbplatser", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Utveckla", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Om", @@ -51,78 +35,30 @@ "message": "Integritetspolicy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Inaktivera/aktivera uBO Lite för den här sidan", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Öppna kontrollpanelen", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Gå till elementzapperläge", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Gå till elementväljarläge", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtreringsläge", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "På denna webbplats", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Rapportera ett problem på denna webbplats", + "message": "Rapportera ett problem", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Klicka för att göra ändringarna permanenta.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Klicka för att ångra dina ändringar.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Öppna kontrollpanelen", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mer", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Klicka för att ge uBO Lite utökade behörigheter på den här webbplatsen.\nMed utökade behörigheter blir innehållsblockering mer effektiv.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Klicka för att återkalla utökade behörigheter på den här webbplatsen", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Mindre", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Visa antalet blockerade förfrågningar på ikonen", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Utseende", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Anpassad accentfärg", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Blockera CSP-rapporter", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Aktivera utökad filtrering på alla webbplatser", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite kan endast använda utökad filtrering på en given webbplats efter att du uttryckligen har gett tilläggsbehörighet att ändra data på den webbplatsen. Med den här inställningen kan du ge behörigheter för utökad filtrering till alla webbplatser samtidigt.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Standard", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domäner med skadlig kod (malware)", + "message": "Skydd mot skadlig programvara, säkerhet", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regioner, språk", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Ett filter per rad. Ett filter kan vara ett vanligt värdnamn eller ett EasyList-kompatibelt filter. Rader med prefixet ! ignoreras.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Importera och lägg till", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Exportera", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "mina-ublock-statiska-filter_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Direktiven för betrodda webbplatser anger vilka webbsidor som uBlock Origin ska inaktiveras på. En post per rad.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Importera och lägg till", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Exportera", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "mina-ublock-pålitliga-webbplatser_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Importera / Exportera", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Här klistrar du in specifika kosmetiska filter att lägga till", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Ändringslogg", @@ -211,25 +123,73 @@ "message": "Externa beroenden (GPLv3-kompatibla):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Skicka", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Verkställ ändringar", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Ångra", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Välkommen", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Du har precis installerat uBO Lite. Här kan du välja standardfiltreringsläget som ska användas på alla webbplatser.\n\nSom standard är läget Grundläggande valt eftersom det inte kräver behörighet att läsa och ändra data. Om du litar på uBO Lite kan du ge den högre behörighet att läsa och ändra data på alla webbplatser för att som standard aktivera mer avancerade filtreringsmöjligheter för alla webbplatser.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Rapportera ett filterproblem", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Rapportera filterproblem med specifika webbplatser till uBlockOrigin/uAssets problemhanteringssystemet. Kräver ett GitHub-konto.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Felsökningsinformation", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "För att undvika att belasta volontärer med dubbletter av rapporter, kontrollera att problemet inte redan har rapporterats. Observera: om du klickar på knappen kommer sidans ursprung att skickas till GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Hitta liknande rapporter på GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Hemsidans adress:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Hemsidan...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Välj en post --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Visar annonser eller rester av annonser", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Har överlägg eller andra olägenheter", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Upptäcker uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Har integritetsrelaterade problem", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Fungerar inte när uBO Lite är aktiverad", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Öppnar oönskade flikar eller fönster", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leder till skadlig programvara, nätfiske", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Märk webbsidan som “NSFW” (“Inte lämplig på jobbet”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Skapa ny rapport på GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Standardfiltreringsläge", @@ -267,6 +227,14 @@ "message": "Avancerad nätverksfiltrering plus specifik och allmän utökad filtrering från utvalda filterlistor.\n\nKräver bred behörighet för att läsa och ändra data på alla webbplatser.\n\nAllmän utökad filtrering kan orsaka högre användning av webbsidors resurser.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Lista över värdnamn som inte kommer att filtreras", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[endast värdnamn]\nexempel.se\nspel.exempel\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Beteende", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Ladda automatiskt om sidan när du byter filtreringsläge", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Visa antalet blockerade förfrågningar på verktygsfältsikonen", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Aktivera strikt blockering", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigering till potentiellt oönskade webbplatser kommer att blockeras och du kommer att erbjudas alternativet att fortsätta.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Utvecklarläge", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Aktivera åtkomst till funktioner som är lämpliga för tekniska användare.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Säkerhetskopiering", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Säkerhetskopiera dina anpassade inställningar till en fil, eller återställ dina anpassade inställningar från en fil.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Återställningen kommer att skriva över alla dina nuvarande anpassade inställningar.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Hitta listor", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Sidan blockerad", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite har förhindrat följande sida från att läsas in:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Sidan har blockerats på grund av ett matchande filter i {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Den blockerade sidan vill omdirigera till en annan webbplats. Om du väljer att fortsätta skickas du direkt till: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "utan parametrar", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Gå tillbaka", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Stäng det här fönstret", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Varna mig inte igen om den här sidan", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Fortsätt", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Ta bort ett element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Lämna elementzapperläge", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Skapa ett anpassat filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Ta bort ett anpassat filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Visa:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtrera lägesdetaljer", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Anpassade DNR-regler", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR-regler av …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamisk regeluppsättning", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Sessionsregeluppsättning", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Spara", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Ångra", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Lägg till", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Importera och lägg till…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Exportera…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Säkerhetskopiera…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Återställ…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Lägg inte till filter från obetrodda källor.", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Antal registrerade regler: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Flytta reglaget för att välja den bästa matchningen", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Välj", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Förhandsgranska", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Skapa", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Välj ett filter nedan för att markera matchande element på webbsidan. Klicka på papperskorgen för att ta bort ett filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sw/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sw/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/sw/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sw/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ta/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ta/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ta/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ta/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Settings", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "About", @@ -51,78 +35,30 @@ "message": "Privacy policy", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "filtering mode", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Open the dashboard", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "More", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Less", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Default", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -136,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -267,6 +227,14 @@ "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "List of websites for which no filtering will take place.", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Automatically reload page when changing filtering mode", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/te/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/te/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/te/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/te/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "An efficient content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,128 +15,64 @@ "message": "uBO Lite — Dashboard", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", + "message": "ఐచ్చికాలు", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filter lists", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "మా గురించి", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "గోప్యతా", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "వడపోత మోడ్", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "డాష్‌బోర్డ్‌ను తెరవండి", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "మరిన్ని", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "తక్కువ", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "డిఫాల్ట్", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "ప్రకటనలు", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "గోప్యత", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -151,37 +87,13 @@ "message": "Regions, languages", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Changelog", @@ -211,25 +123,73 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Default filtering mode", @@ -256,23 +216,199 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "ఎంచుకున్న ఫిల్టర్ జాబితాల నుండి ప్రాథమిక నెట్‌వర్క్ ఫిల్టరింగ్.\n\nవెబ్‌సైట్‌లలో డేటాను చదవడానికి మరియు సవరించడానికి అనుమతి అవసరం లేదు.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "ఎంచుకున్న ఫిల్టర్ జాబితాల నుండి అధునాతన నెట్‌వర్క్ ఫిల్టరింగ్ మరియు నిర్దిష్ట పొడిగించిన ఫిల్టరింగ్.\n\nఅన్ని వెబ్‌సైట్‌లలోని డేటాను చదవడానికి మరియు సవరించడానికి విస్తృత అనుమతి అవసరం.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "ఎంచుకున్న ఫిల్టర్ జాబితాల నుండి అధునాతన నెట్‌వర్క్ ఫిల్టరింగ్ మరియు నిర్దిష్ట మరియు సాధారణ పొడిగించిన ఫిల్టరింగ్.\n\nఅన్ని వెబ్‌సైట్‌లలోని డేటాను చదవడానికి మరియు సవరించడానికి విస్తృత అనుమతి అవసరం.\n\nసాధారణ పొడిగించిన వడపోత అధిక వెబ్‌పేజీ వనరుల వినియోగానికి కారణం కావచ్చు.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "వడపోత జరగని హోస్ట్ పేర్ల జాబితా", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "ప్రవర్తన", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "ఫిల్టరింగ్ మోడ్‌ను మార్చేటప్పుడు పేజీని స్వయంచాలకంగా రీలోడ్ చేయండి", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/th/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/th/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/th/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/th/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,275 +4,411 @@ "description": "extension name." }, "extShortDesc": { - "message": "An experimental, permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "ตัวบล็อกเนื้อหาที่มีประสิทธิภาพ บล็อกโฆษณา ตัวติดตาม ตัวขุดเหมือง และอื่นๆ ทันทีที่ติดตั้ง", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "{{ruleCount}} กฎ แปลงจาก {{filterCount}} ตัวกรองเครือข่าย", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite — แดชบอร์ด", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Stay", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ignore", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { - "message": "Settings", - "description": "appears as tab name in dashboard" - }, - "3pPageName": { - "message": "Filter lists", + "message": "การตั้งค่า", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "My filters", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Trusted sites", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "พัฒนา", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { - "message": "About", + "message": "เกี่ยวกับ", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "นโยบายความเป็นส่วนตัว", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "โหมดตัวกรอง", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "บนเว็บไซต์นี้", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "รายงานปัญหาที่เกิดบนเว็บไซต์นี้", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "เปิดแดชบอร์ด", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "ขยาย", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "ย่อลง ", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "ค่าเริ่มต้น", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "โฆษณา", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "ความเป็นส่วนตัว", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "การป้องกันมัลแวร์ ความปลอดภัย", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "ความรำคาญ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "เบ็ดเตล็ด", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "ภูมิภาค, ภาษา", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "บันทึการเปลี่ยนแปลง", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "ซอร์สโค้ด (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "ผู้สนับสนุน", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "ซอร์สโค้ด", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "แปล", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "รายการตัวกรอง", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "การพึ่งพิงภายนอก (เข้ากันได้กับ GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "รายงานปัญหาตัวกรอง", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "รายงานปัญหาตัวกรองผ่านเว็บไซต์เฉพาะที่ uBlockOrigin/uAssets ปัญหาตัวติดตาม. ต้องใช้บัญชี GitHub", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "ข้อมูลการแก้ไขปัญหา", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "เพื่อเป็นการลดภาระอาสาสมัครจากการรายงานซ้ำซ้อน โปรดตรวจสอบก่อนว่าปัญหาดังกล่าวได้รับการรายงานไปแล้วหรือยัง หมายเหตุ: คลิกที่ปุ่มจะเป็นการส่งต้นทางของหน้าเว็บไปยัง GitHub", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "ค้นหารายงานที่คล้ายกันบน GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "ที่อยู่ของเว็บเพจ:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "เว็บเพจ…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- เลือกรายการ --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "แสดงโฆษณาหรือสิ่งที่ตกค้างอยู่", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "มีโอเวอร์เลย์หรือสิ่งอื่น ๆ ที่รบกวน", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "ตรวจหา uBlock Origin", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "มีปัญหาเกี่ยวกับความเป็นส่วนตัว", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "ความผิดปกติเมื่อเปิดใช้งาน uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "เปิดแท็บหรือหน้าต่างที่ไม่ต้องการ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "นำไปสู่แบดแวร์ ฟิชชิ่ง", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "ติดป้ายเว็บเพจว่าเป็น “NSFW” (“ไม่ปลอดภัยกับงาน (Not Safe For Work)”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "สร้างรายงานใหม่", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "โหมดการกรองเริ่มต้น", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "โหมดการคัดกรองเริ่มต้นจะถูกแทนที่ด้วยโหมดการคัดกรองเฉพาะเว็บไซต์ คุณสามารถปรับแต่งโหมดคัดกรองสำหรับเว็บไซต์ที่มีตามโหมดใดก็ได้ที่ทำงานได้ดีที่สุดบนเว็บไซต์นั้น ซึ่งแต่ละโหมดก็มีข้อดีข้อเสีย", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "ไม่มีการคัดกรอง", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "พื้นฐาน", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "เหมาะสมที่สุด", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "สมบูรณ์", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "การคัดกรองเครือข่ายเบื้องต้นจากรายการที่เลือก\n\nไม่ต้องขออนุญาตในการอ่านและปรับแต่งข้อมูลบนเว็บไซต์", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "การคัดกรองเครือข่ายขั้นสูงและการคัดกรองเพิ่มเติมโดยเฉพาะจากรายการที่เลือก\n\nต้องขออนุญาตแบบรวมในการอ่านและปรับแต่งข้อมูลบนทุกเว็บไซต์", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "การคัดกรองเครือข่ายขั้นสูงและการคัดกรองทั่วไปเพิ่มเติม และโดยเฉพาะจากรายการที่เลือก\n\nต้องขออนุญาตแบบรวมในการอ่านและปรับแต่งข้อมูลบนทุกเว็บไซต์\n\nการคัดกรองทั่วไปเพิ่มเติมอาจะทำให้มีการใช้งานทรัพยากรเว็บเพจสูงขึ้น", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "รายการเว็บไซต์ซึ่งไม่มีการคัดกรอง", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "ลักษณะการทำงาน", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "โหลดหน้าเว็บใหม่อัตโนมัติเมื่อเปลี่ยนโหมดการกรอง", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "แสดงจำนวนคำขอที่ถูกปิดกั้นบนไอคอนแถบเครื่องมือ", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "เปิดใช้งานการบล๊อกเข็มงวด", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "การนำทางไปยังเว็บไซต์ที่ไม่พึงประสงค์จะถูกบล็อก และคุณจะได้รับตัวเลือกเพื่อดำเนินการต่อ", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "โหมดนักพัฒนา", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "เปิดใช้งานฟีเจอร์สำหรับผู้ใช้ทางเทคนิค", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "หารายการ", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "บล๊อกเพจ", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite ได้ป้องกันเพจเหล่านี้จากการโหลด:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "เว็บเพจถูกบล๊อก เพราะตรงกับรายการคัดกรองใน {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "เว็บเพจที่บล๊อกต้องการเด้งไปเว็บไซต์อื่น หากคุณต้องการดำเนินการต่อ คุณจะถูกนำทางโดยตรงไปที่: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "ไม่ระบุพารามิเตอร์", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "ย้อนกลับ", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "ปิดหน้าต่างนี้", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "อย่าเตือนเกี่ยวกับเว็บไซต์นี้ให้กับฉันอีก", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "ดำเนินต่อ", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "ลบองค์ประกอบ", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "ออกจากโหมดลบองค์ประกอบ", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "สร้างตัวกรองที่กำหนดเอง", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "ลบตัวกรองที่กำหนดเอง", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "ดู:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "รายละเอียดโหมดการกรอง", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "กฎ DNR ที่กำหนดเอง", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "กฎ DNR ของ…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "ชุดกฎไดนามิก", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "ชุดกฎเซสชัน", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "บันทึก", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "ย้อนกลับ", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "นำเข้าและต่อท้าย…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "ส่งออก…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "อย่าเพิ่มเนื้อหาจากแหล่งที่ไม่น่าเชื่อถือ", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "จำนวนกฎที่ลงทะเบียน: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "เลื่อนแถบเลื่อนเพื่อเลือกรายการที่ตรงกันที่สุด", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "เลือก", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "แสดงตัวอย่าง", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "สร้าง", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "เลือกตัวกรองด้านล่างเพื่อไฮไลต์องค์ประกอบที่ตรงกันในหน้าเว็บ คลิกที่ไอคอนถังขยะเพื่อลบตัวกรอง", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/tr/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/tr/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/tr/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/tr/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,44 +4,28 @@ "description": "extension name." }, "extShortDesc": { - "message": "Deneysel, izin gerektirmeyen içerik engelleyicisi. Kurulumdan hemen sonra Reklamları, izleyicileri, kripto madencilerini, ve [...]", + "message": "Etkili bir içerik engelleyici. Reklamları, izleyicileri, madencileri ve daha fazlasını kurulumdan hemen sonra engeller.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} kural, {{filterCount}} ağ filtresinden dönüştürüldü", + "message": "{{filterCount}} ağ filtresinden {{ruleCount}} adet kural dönüştürüldü", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "uBO Lite — Kontrol Paneli", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Uyarı! Kaydedilmemiş değişiklikleriniz var", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Burada kal", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Yok say", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Ayarlar", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Filtre listeleri", + "customFiltersPageName": { + "message": "Özel filtreler", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Filtrelerim", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Güvenilen siteler", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Geliştir", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Hakkında", @@ -51,78 +35,30 @@ "message": "Gizlilik ilkesi", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Bu site için uBO Lite'ı etkinleştir/devre dışı bırak", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Kontrol panelini aç", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Öge silme moduna gir", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Öge seçme moduna gir", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "Filtreleme modu", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Bu web sitesinde", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Bu web sitesinde bir sorunu bildir", + "message": "Bu sitedeki bir sorunu bildir", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Değişikliklerinizi kalıcı hale getirmek için tıklayın.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Değişikliklerinizi geri almak için tıklayın.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Kontrol panelini aç", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Daha Fazla", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Bu sitede uBO Lite'a daha kapsamlı izinler vermek için tıklayın.\nİzinlerin kapsamını artırmak, daha etkili içerik engelleme sağlar.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Bu sitedeki kapsamı artırılan izinleri iptal etmek için tıklayın.", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Daha Az", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Simge üzerinde engellenen isteklerin sayısını göster", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Görünüm", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Tema", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Özel vurgu rengi", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "CSP raporlarını engelle", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Tüm web sitelerinde genişletilmiş filtrelemeyi etkinleştir.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite, belirli bir web sitesinde, yalnızca o web sitesindeki verileri değiştirmek için uzantı izinlerini açıkça verdikten sonra genişletilmiş filtreleme uygulayabilir. Bu ayar, tüm web sitelerine bir kerede genişletilmiş filtreleme için izinler vermenizi sağlar.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Varsayılan", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -144,44 +80,20 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Diğer Ayarlar", + "message": "Diğer", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { "message": "Bölgeler, diller", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Satır başına bir filtre. Filtre yalın bir alan adı veya EasyList uyumlu bir filtre olabilir. ! ile başlayan satırlar yok sayılacaktır.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "İçe aktar ve ekle", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Dışa aktar", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "ublock-statik-filtrelerim_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Güvenilen site yönergeleri, uBO Lite'ın devre dışı bırakılması gerektiği web sayfalarını belirler. Her satırda bir girdi.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "İçe aktar ve sonuna ekle", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Dışa aktar", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "ublock-guvenilen-siteler_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "İçeri/Dışarı aktar", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Eklenmesi için kozmetik filtreleri buraya yapıştırın", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Değişiklik günlüğü", @@ -208,28 +120,76 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "Dış bağımlılıklar (GPLv3-uyumlu):", + "message": "Dış bağlılıklar (GPLv3-uyumlu):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Gönder", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Değişiklikleri uygula", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Geri al", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Hoş geldiniz", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Az önce uBO Lite'ı indirdiniz. Buradan tüm siteler için varsayılan filtreleme modlarını seçebilirsiniz.\n\nVarsayılan olarak, Basit mod seçilidir çünkü verileri okuma ve yazma izni gerektirmez. Eğer uBO Lite'a güveniyorsanız, tüm sitelerde verileri okuma ve yazma izni verebilirsiniz ve daha gelişmiş filtreleme yeteneklerine tüm sitelerde sahip olabilirsiniz.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Bir filtre sorununu bildir", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Bir sitedeki filtre sorunlarını bildirmek için uBlockOrigin/uAssets sorun takibi sayfasını kullanın. Bir GitHub hesabı gerekir.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Sorun giderme bilgisi", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Gönüllüleri benzer raporlar ile bezdirmemek için sorunun zaten bildirilip bildirilmediğine bakın. Not: Butona tıklamak sayfanın temel adresini GitHub'a gönderir.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "GitHub'da benzer raporları bul", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Web sayfasının adresi:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Web sayfası…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Bir girdi seçin --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Reklamlar veya reklam artıkları gösteriyor", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Arayüzde kaplamalar veya diğer can sıkıcı ögeler var", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "uBO Lite tespit ediliyor", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Gizlilikle ilgili sorunları var", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "uBO Lite kullanımdayken sayfa bozuluyor ", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "İstenmeyen sekme veya pencereler açıyor", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Kötü niyetli yazılıma, oltalamaya yönlendiriyor", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Sayfayı “NSFW” (“iş için güvenli değil”) olarak işaretle", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "GitHub'da yeni rapor oluştur", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Varsayılan filtreleme modu", @@ -252,7 +212,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "tamamen", + "message": "kapsamlı", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -267,12 +227,188 @@ "message": "Gelişmiş ağ filtrelemenin yanı sıra seçilen filtre listelerinden özel ve genel genişletilmiş filtreleme.\n\nTüm web sitelerindeki verileri okumak ve değiştirmek için geniş izin gerektirir.\n\nGenel genişletilmiş filtreleme daha yüksek kaynak kullanımına neden olabilir.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Filtreleme yapılmayacak alan alarının listesi", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[sadece alan adları]\norneksite.com\noyunlar.site\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Davranış", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Filtreleme modu değiştirildiğinde sayfayı yenile", + "message": "Filtreleme modunu değiştirirken sayfayı otomatik olarak yenile", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Engellenen isteklerin sayısını araç çubuğu simgesinde göster", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Sıkı engellemeyi etkinleştir", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "İstenmeyebilecek sitelere erişim engellenecek ve devam etme seçeneği sunulacaktır.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Geliştirici modu", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Teknik kullanıcılara uygun özelliklere erişime izin ver.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Yedekle", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Ayarlarınızı bir dosyaya yedekleyin veya yedeklenmiş bir dosyadan alın.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Yedekten geri yükleyince şu anki ayarlarınızın yerine geçecek.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Liste bul", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Sayfa engellendi", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBo Lite aşağıdaki sayfaların yüklenmesini engelledi:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Bu sayfa {{listname}} içindeki bir filtreye takıldığı için engellenmiştir.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Engellenen sayfa sizi başka bir siteye yönlendirmek istiyor. Devam etmek isterseniz doğrudan şuraya yönlendirileceksiniz: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "değişkensiz", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Geri git", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Bu pencereyi kapat", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Bu site için beni bir daha uyarma", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Devam et", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Öge silme moduna gir", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Öge silme modundan çık", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Özel filtre oluştur", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Özel filtreyi kaldır", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Görünüm:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtreleme modu ayrıntıları", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Özel DNR kuralları", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR kuralları …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dinamik kural seti", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Oturum kural seti", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Kaydet", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Geri al", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Ekle", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "İçe aktar ve ekle…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Dışa aktar…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Yedekle…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Geri yükle…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Güvenilmeyen kaynaklardan içerik eklemeyin", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Kayıtlı kural sayısı: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "En iyi eşleşmeyi seçmek için kaydırıcıyı hareket ettir", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Seç", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Ön İzle", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Oluştur", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Web sayfasındaki eşleşen öğeleri vurgulamak için aşağıdan bir filtre seçin. Bir filtreyi kaldırmak için çöp kutusuna tıklayın.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/uk/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/uk/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/uk/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/uk/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "uBO Lite — Панель керування", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Увага! Є незбережені зміни", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Залишитись", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Ігнорувати", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Налаштування", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Списки фільтрів", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "Мої фільтри", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "Довірені сайти", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Розробка", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Про застосунок", @@ -51,78 +35,30 @@ "message": "Політика конфіденційності", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Вимкнути/увімкнути uBO Lite для цього сайту", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Відкрити панель керування", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Перейти в режим блокування елементів", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Перейти в режим вибору елементів", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "режим фільтрації", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "На цьому вебсайті", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Повідомити про помилку на цьому вебсайті", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Клацніть, щоб зробити зміни постійними.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Клацніть, щоб скасувати зміни.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Відкрити панель керування", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Більше", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Клацніть, щоб надати uBO Lite розширені дозволи на цьому сайті.\nРозширені дозволи дозволяють ефективніше блокувати вміст.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Клацніть, щоб відкликати розширені дозволи на цьому сайті", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "Менше", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Показувати кількість заблокованих запитів на піктограмі", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Вигляд", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Тема", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Акцент кольору користувача", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Блокувати CSP-звіти", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Увімкнути розширену фільтрацію на всіх сайтах", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite може застосувати розширену фільтрацію на певному вебсайті лише після того, як ви явно надасте розширеній фільтрації дозволи на зміну даних на цьому вебсайті. Цей параметр дозволяє надати дозволи на розширену фільтрацію для всіх вебсайтів одночасно.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Типово", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -151,37 +87,13 @@ "message": "Регіони, мови", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Один фільтр на рядок. Фільтром може бути адреса сайту або фільтр в сумісному з EasyList записі. Рядки, що починаються з ! ігноруватимуться.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Імпортувати та додати", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Експортувати", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "мої-статичні-фільтри-ublock_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Директиви довіреного сайту диктують, на яких вебсторінках uBO Lite повинен бути вимкнений. Один запис на рядок.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Імпортувати та додати", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Експортувати", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "мої-довірені-сайти-ublock_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Журнал змін", @@ -211,25 +123,73 @@ "message": "Зовнішні залежності (Сумісні з GPLv3)", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Відправити", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Застосувати зміни", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Повернути", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Ласкаво просимо", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Ви щойно встановили uBO Lite. Тут ви можете вибрати режим фільтрації за замовчуванням, який буде використовуватися на всіх вебсайтах.\n\nЗа замовчуванням вибрано Базовий режим, оскільки він не вимагає дозволу на читання та зміну даних. Якщо ви довіряєте uBO Lite, ви можете надати йому широкий дозвіл на читання та зміну даних на всіх вебсайтах, щоб увімкнути більш розширені можливості фільтрації для всіх вебсайтів за замовчуванням.\n", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Повідомити про ваду фільтра", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Повідомляйте про вади з фільтрами на конкретних вебсайтах у відстежувач помилок uBlockOrigin/uAssets. Потрібен обліковий запис GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Усунення проблем", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Щоб не обтяжувати волонтерів повторюваними звітами, переконайтеся, що про проблему ще не повідомлялося.Зауваження: натискання на кнопку призведе до надсилання походження сторінки на GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Знайти подібні звіти", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Адреса вебсторінки:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Вебсторінка...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Указати проблему --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "З'являється реклама або залишки оголошень", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Накладання або інші прикрощі", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Виявляє uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Пов'язані з приватністю проблеми", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Вади коли uBO Lite ввімкнено", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Відкриває небажані вкладки або вікна", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Веде до шкідливого ПЗ, фішингу", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Позначити цю сторінку «Небезпечною для роботи» («NSFW»)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Створити новий звіт", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Типовий режим фільтрування", @@ -264,9 +224,17 @@ "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Розширена мережева фільтрація плюс специфічна та загальна розширена фільтрація з вибраних списків фільтрів.\n\nПотребує широкого дозволу на читання та зміну даних на всіх сайтах.\n\nЗагальна розширена фільтрація може призвести до збільшення використання ресурсів веб-сторінки.", + "message": "Розширена мережева фільтрація плюс специфічна та загальна розширена фільтрація з вибраних списків фільтрів.\n\nПотребує розширених дозволів на читання та зміну даних на всіх сайтах.\n\nЗагальна розширена фільтрація може призвести до збільшення використання ресурсів вебсторінкою.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Список імен хостів, для яких не буде застосовуватись фільтрування", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[тільки імена хостів]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведінка", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Автоматично оновити сторінку при зміні режиму фільтрування", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Показувати кількість заблокованих запитів на піктограмі панелі інструментів", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Увімкнути суворе блокування", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Перехід до потенційно небажаних сайтів буде заблоковано, та вам буде запропоновано можливість продовжити", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Режим розробника", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Відкрити доступ до можливостей, які актуальні для технічних користувачів", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Знайти списки", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Сторінку заблоковано", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite заблокував завантаження таких сторінок:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Сторінку заблоковано, бо вона відповідає фільтру в {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Заблокована сторінка хоче переадресувати на інший сайт. Якщо ви вирішите продовжити, ви перейдете безпосередньо на: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "без параметрів", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Повернутися", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Закрити це вікно", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Більше не попереджати мене про цей сайт", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Продовжити", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Перейти в режим тимчасового приховування елементів", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Вийти з режиму тимчасового приховування елементів", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Створити власний фільтр", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Вилучити власний фільтр", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Перегляд:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Подробиці режиму фільтрації", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Користувацькі правила DNR", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Правила DNR для…", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Динамічний набір правил", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Набір правил для сесії", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Зберегти", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Повернути", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Імпортувати та додати…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Експортувати…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Не додавати вміст з невідомих джерел", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Кількість зареєстрованих правил: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Переміщайте повзунок для вибору кращого варіанту", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Вибрати", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Попередній перегляд", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Створити", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Виберіть фільтр нижче, щоб підсвітити відповідні елементи на сторінці. Натисніть на кошик для видалення фільтра.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ur/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ur/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/ur/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ur/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -15,33 +15,17 @@ "message": "یو بلاکر لائٹ-ڈیش بورڈ", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "انتباہ: آپ کے پاس محفوظ نہ کی گئی ترتیبات ہیں", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "ادھر رہو", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "درگزر", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "ترتیبات", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "فلٹر فہرستیں", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "میرے انتخابات", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "قابل اعتماد ویب سائٹس", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Develop", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "تعارف", @@ -51,152 +35,80 @@ "message": "پرائیویسی پالیسی", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Disable/enable uBO Lite for this site", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Open the dashboard", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Enter element zapper mode", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Enter element picker mode", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "فلٹرنگ موڈ", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "On this website", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Report an issue", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Click to make your changes permanent.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Click to revert your changes.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "ڈیش بورڈ کھولیں۔", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", - "description": "Label to be used to show popup panel sections" - }, - "popupGrantGreatPowers": { - "message": "Click to grant uBO Lite extended permissions on this site.\nExtended permissions allow more effective content blocking.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Click to revoke extended permissions on this site", + "message": "مزید", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "کم", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Appearance", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Theme", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Custom accent color", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Enable extended filtering on all websites", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite can apply extended filtering on a given website only after you explicitly grant the extension permissions to modify data on that website. This setting allows you to grant permissions for extended filtering to all websites at once.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "Default", + "message": "طے شدہ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "اشتہارات", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "رازداری", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "پریشانیاں", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "متفرق", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "علاقے، زبانیں۔", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "One filter per line. A filter can be a plain hostname, or an EasyList-compatible filter. Lines prefixed with ! will be ignored.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Export", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBO Lite should be disabled. One entry per line.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Import and append", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Export", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "Changelog", + "message": "چینج لاگ", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "ماخذ کوڈ (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "تعاون کرنے والے", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "سورس کوڈ", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -204,51 +116,99 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "فہرستوں کو فلٹر کریں۔", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "بیرونی انحصار (GPLv3-مطابق):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Submit", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Apply changes", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Revert", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Welcome", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Troubleshooting information", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported. Note: clicking the button will cause the page's origin to be sent to GitHub.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports on GitHub", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report on GitHub", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "ڈیفالٹ فلٹرنگ موڈ", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "ڈیفالٹ فلٹرنگ موڈ کو فی ویب سائٹ فلٹرنگ موڈز کے ذریعے اوور رائیڈ کر دیا جائے گا۔ آپ کسی بھی ویب سائٹ پر فلٹرنگ موڈ کو ایڈجسٹ کرسکتے ہیں اس کے مطابق جو بھی موڈ اس ویب سائٹ پر بہترین کام کرتا ہے۔ ہر موڈ کے اپنے فوائد اور نقصانات ہیں۔", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "کوئی فلٹرنگ نہیں", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "بنیادی", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "بہترین", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -256,23 +216,199 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "منتخب فلٹر فہرستوں سے بنیادی نیٹ ورک فلٹرنگ۔\n\nویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے اجازت کی ضرورت نہیں ہے۔", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "اعلی درجے کی نیٹ ورک فلٹرنگ کے علاوہ منتخب فلٹر فہرستوں سے مخصوص توسیعی فلٹرنگ۔\n\nتمام ویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے وسیع اجازت درکار ہے۔", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "اعلی درجے کی نیٹ ورک فلٹرنگ کے علاوہ منتخب فلٹر فہرستوں سے مخصوص اور عام توسیعی فلٹرنگ۔\n\nتمام ویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے وسیع اجازت درکار ہے۔\n\nعام توسیع شدہ فلٹرنگ ویب پیج کے وسائل کے زیادہ استعمال کا سبب بن سکتی ہے۔", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "میزبان ناموں کی فہرست جن کے لیے کوئی فلٹرنگ نہیں ہوگی۔", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "رویہ", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "فلٹرنگ موڈ تبدیل کرتے وقت صفحہ خودکار طور پر دوبارہ لوڈ کریں۔", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "ٹول بار کے آئیکن پر بلاک شدہ درخواستوں کی تعداد دکھائیں۔", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Developer mode", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Enables access to features suitable for technical users.", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Backup", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Back up your custom settings to a file, or restore your custom settings from a file.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Remove an element", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Exit element zapper mode", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Create a custom filter", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Remove a custom filter", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "View:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Filtering mode details", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Custom DNR rules", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR rules of …", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Dynamic ruleset", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Session ruleset", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Save", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Revert", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Import and append…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Export…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Back up…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Restore…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Do not add content from untrusted sources", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Number of registered rules: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Move the slider to select the best match", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Pick", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Preview", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Create", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Select a filter below to highlight matching elements in the webpage. Click the trash can to remove a filter.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/vi/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/vi/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/vi/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/vi/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Trình chặn nội dung thử nghiệm, không cần quyền. Chặn quảng cáo, trình theo dõi, công cụ khai thác tiền số và hơn thế nữa ngay [...]", + "message": "Trình chặn nội dung không cần quyền. Chặn quảng cáo, trình theo dõi, công cụ khai thác tiền số và hơn thế nữa ngay sau khi cài đặt.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — Bảng điều khiển", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "Cảnh báo! Bạn có các thay đổi chưa được lưu", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "Ở lại", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "Bỏ qua", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "Cài đặt", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "Danh sách bộ lọc", - "description": "appears as tab name in dashboard" - }, - "1pPageName": { - "message": "Bộ lọc của tôi", + "customFiltersPageName": { + "message": "Custom filters", "description": "appears as tab name in dashboard" }, - "whitelistPageName": { - "message": "Trang tin cậy", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "Phát triển", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "Giới thiệu", @@ -51,78 +35,30 @@ "message": "Chính sách bảo mật", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "Vô hiệu/kích hoạt uBO Lite cho trang này", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "Mở bảng điều khiển", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "Chuyển sang chế độ chặn phần tử tạm thời", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "Chuyển sang chế độ chọn phần tử", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "chế độ lọc", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "Trên trang web này", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "Báo cáo lỗi trên trang này", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "Nhấn để làm các thay đổi của bạn thường trực.", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "Nhấn để hoàn tác các thay đổi của bạn.", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "Mở bảng điều khiển", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "Mở rộng", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "Nhấp để cấp cho uBO Lite những quyền mở rộng trên trang này.\nCác quyền mở rộng cho phép việc chặn nội dung hiệu quả hơn.", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "Nhấp để thu hồi các quyền mở rộng trên trang này", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { - "message": "Ít hơn", + "message": "Thu gọn", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "Hiển thị số lượng yêu cầu bị chặn trên biểu tượng", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "Diện mạo", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "Giao diện", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "Tùy chọn màu nền", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "Chặn các báo cáo CSP", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "Bật tính năng lọc mở rộng trên tất cả các trang web", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite có thể áp dụng tính năng lọc mở rộng trên một trang web nhất định chỉ sau khi bạn cấp quyền một cách tường minh cho tiện ích mở rộng để sửa đổi dữ liệu trên trang web đó. Cài đặt này cho phép bạn cấp quyền cho lọc mở rộng tới tất cả các trang web cùng một lúc.", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "Mặc định", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -132,7 +68,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Riêng tư", + "message": "Bảo mật", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { @@ -144,44 +80,20 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Linh tinh", + "message": "Khác", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { "message": "Khu vực, ngôn ngữ", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "Một bộ lọc trên mỗi dòng. Một bộ lọc có thể là một tên máy chủ đơn giản, hoặc một bộ lọc tương thích EasyList. Những dòng bắt đầu với ! sẽ bị bỏ qua.", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "Nhập và thêm vào", - "description": "English: Import and append" - }, - "1pExport": { - "message": "Xuất", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "bộ-lọc-tĩnh-ublock-của-tôi_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "Các chỉ thị trang tin cậy chỉ định các trang web nào uBO Lite nên bị tắt. Một mục trên mỗi dòng.", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "Nhập và thêm vào", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "Xuất", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "các-trang-tin-cậy-ublock-của-tôi_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "Import / Export", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "Paste here specific cosmetic filters to add", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "Nhật ký thay đổi", @@ -192,7 +104,7 @@ "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Những người đóng góp", + "message": "Người đóng góp", "description": "English: Contributors" }, "aboutSourceCode": { @@ -211,25 +123,73 @@ "message": "Các phụ thuộc bên ngoài (tương thích GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "Xác nhận", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "Áp dụng các thay đổi", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "Phục hồi", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "Chào mừng", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "Bạn vừa cài đặt uBO Lite. Bạn có thể chọn chế độ của bộ lọc mặc định để sử dụng trên tất cả các trang web. Theo mặc định, chế độ Cơ bản được chọn vì chế độ này không yêu cầu quyền đọc và thay đổi dữ liệu. Nếu bạn tin tưởng uBO Lite, bạn có thể cấp cho bộ lọc với quyền rộng rãi để đọc và thay đổi dữ liệu trên tất cả các trang web để kích hoạt khả năng lọc nâng cao hơn cho tất cả các trang web theo mặc định.", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "Báo cáo lỗi bộ lọc cụ thể", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Báo cáo các vấn đề về bộ lọc với các trang web cụ thể cho trình theo dõi vấn đề uBlockOrigin/uAssets xử lý. Cần có tài khoản GitHub.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "Thông tin chẩn đoán lỗi", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "Để tránh tạo thêm gánh nặng cho các tình nguyện viên, hãy chắc chắn rằng chưa từng có vấn đề tương tự được báo cáo.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Tìm các báo cáo tương tự", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Địa chỉ của trang web:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "Trang web…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Chọn một mục --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Hiện quảng cáo hoặc vùng chứa quảng cáo", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Có lớp phủ hoặc những phiền toái khác", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Phát hiện uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Có các cấn đề về quyền riêng tư", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Trục trặc khi bật uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Xuất hiện các tab và cửa sổ ngoài mong muốn", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Dẫn đến phần mềm độc hại, lừa đảo", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Đánh dấu trang web là “NSFW” (“Không an toàn cho công việc”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Tạo báo cáo mới", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "Chế độ bộ lọc mặc định", @@ -252,7 +212,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "Hoàn thành", + "message": "Hoàn toàn", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -267,6 +227,14 @@ "message": "Lọc mạng với chế độ nâng cao cộng với lọc mở rộng cụ thể và chung chung từ danh sách bộ lọc đã chọn.\n\nYêu cầu cấp quyền để đọc và thay đổi dữ liệu trên tất cả các trang web.\n\nVới chế độ lọc chung có thể gây ra tốn tài nguyên trang web cao hơn.", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "Danh sách tên máy chủ sẽ không được lọc", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Hành vi", "description": "The header text for the 'Behavior' section" @@ -274,5 +242,173 @@ "autoReloadLabel": { "message": "Tự động tải lại trang khi thay đổi chế độ bộ lọc", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "Hiện số lượng yêu cầu bị chặn trên biểu tượng thanh công cụ", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "Bật chặn nghiêm ngặt", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Việc điều hướng đến các trang web có khả năng không mong muốn sẽ bị chặn và bạn sẽ được cung cấp tùy chọn để tiếp tục.", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "Chế độ nhà phát triển", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "Cho phép truy cập các tính năng dành cho người dùng nâng cao", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "Sao lưu", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "Sao lưu cài đặt tùy chỉnh của bạn vào một tệp hoặc khôi phục cài đặt tùy chỉnh từ một tệp.", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "Restoring will overwrite all your current custom settings.", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "Tìm danh sách", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Trang bị chặn", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite đã ngăn tải trang sau:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "Trang này đã bị chặn vì bộ lọc phù hợp trong {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "Trang đã chặn muốn chuyển hướng sang trang khác. Nếu đồng ý, bạn sẽ được chuyển hướng sang {{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "không có thông số", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Quay lại", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Đóng cửa sổ này", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Đừng cảnh báo lại cho tôi về trang web này", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Tiến hành", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "Chuyển sang chế độ chặn phần tử tạm thời", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "Thoát khỏi chế độ chặn phần tử tạm thời", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "Tạo một bộ lọc tùy chỉnh", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "Xóa một bộ lọc tuỳ chỉnh", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "Xem:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "Chi tiết chế độ chặn", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "Quy tắc DRN tùy chỉnh", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "Quy tắc DRN cho ...", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "Danh sách quy tắc động", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "Danh sách quy tắc phiên", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "Lưu", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "Đặt lại", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "Add", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "Nhập và thêm vào", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "Xuất…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "Sao lưu…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "Khôi phục…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "Không thêm các bộ lọc từ các nguồn không đáng tin cậy", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "Số quy tắc đã đăng ký: {count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "Di chuyển thanh trượt để chọn kết quả phù hợp nhất", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "Chọn", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "Xem trước", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "Tạo", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "Chọn một bộ lọc bên dưới để đánh dấu các phần tử phù hợp trong trang web. Nhấp vào thùng rác để xóa bộ lọc.", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "一个实验性的,不需要权限的内容屏蔽工具。安装即可屏蔽广告、跟踪器、挖矿脚本等网页内容。", + "message": "一个不需要权限的内容屏蔽工具。安装即可屏蔽广告、跟踪器、挖矿脚本等网页内容。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -15,33 +15,17 @@ "message": "uBO Lite — 控制面板", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "警告!您有未保存的更改", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "留在当前页面", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "忽略", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "设置", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "过滤规则列表", + "customFiltersPageName": { + "message": "自定义过滤规则", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "静态过滤规则", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "白名单", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "开发", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "关于", @@ -51,80 +35,32 @@ "message": "隐私政策", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "在此网站停用/启用 uBO Lite", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "打开控制面板", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "进入临时元素移除模式", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "进入元素选择器模式", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "过滤模式", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "在本网站上", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "报告此网站上的问题", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "点击以使更改永久生效。", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "点击以撒销当前修改。", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "打开控制面板", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "更多", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "点击以授予 uBO Lite 在此网站额外权限。\n额外权限可让内容过滤更加高效。", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "点击以撤回 uBO Lite 在此网站的额外权限", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "更少", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "在图标上显示拦截请求数", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "外观", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "主题", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "自定义强调色", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "屏蔽 CSP 报告", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "在所有网站启用额外过滤功能", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite 只有在被明确授予修改网页数据的权限后才可以应用额外过滤功能。通过此项设置可一次性授予其在所有网站启用额外过滤所需的权限。", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { - "message": "预设", + "message": "默认", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { @@ -151,37 +87,13 @@ "message": "区域、语言", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "一行一条过滤规则。每条规则可以是一个简单域名或者是一条 EasyList 兼容的过滤规则。以 ! 开头的行将被忽略。", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "导入并添加", - "description": "English: Import and append" - }, - "1pExport": { - "message": "导出", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "适用于白名单任一规则的页面不会启用 uBO Lite。一行一条规则。", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "导入并添加", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "导出", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "导入/导出", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "在此粘贴要添加的特定元素过滤规则", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { "message": "更新日志", @@ -211,25 +123,73 @@ "message": "外部依赖(与 GPLv3 协议兼容):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "提交", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "应用更改", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "还原", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "欢迎使用", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "uBO Lite 现已安装完毕。接下来您可以为网页内容选择默认过滤模式。\n\n预设过滤模式为“基础”,该模式不需要读取或修改网页内容的权限。如果您信任 uBO Lite,您可以授予其用以读取或修改所有网页数据的额外权限,进而默认为所有网站开启高级过滤模式。", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "报告过滤问题", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "将特定网站的过滤问题报告给uBlockOrigin/uAssets issue tracker需要有 GitHub 账户。", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "故障排查相关信息", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "请确认该问题未曾上报,以避免加重志愿者负担。", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "找到相似报告", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "网页地址:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "网页...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- 选择一个条目 --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "显示广告或残留广告", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "存在遮盖或类似问题", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "检测 uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "存在隐私相关问题", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "启用 uBO Lite 时发生故障", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "打开了不想要的标签页或窗口", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "导致恶意软件、网络钓鱼", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "将网页标记为 “NSFW”(“工作场所不宜”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "创建新报告", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "默认过滤模式", @@ -267,12 +227,188 @@ "message": "用选定的过滤规则列表进行进阶网页过滤,会同时使用有针对性的以及通用的过滤规则。\n\n需要读取或修改网页数据的权限。\n\n通用过滤功能可能会占用更多系统资源。", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "不进行过滤的网站列表。", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[仅限主机名]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "操作设置", + "message": "行为", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { "message": "更改过滤模式后自动刷新网页", "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "在工具栏图标上显示拦截请求数", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "开启严格拦截", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "导航至潜在不良网站的操作将被拦截,并且您将可以选择继续前往。", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "开发者模式", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "启用访问适合技术用户的功能。", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "备份", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "将自定义设置备份到文件,或从文件还原自定义设置。", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "还原将覆盖当前所有自定义设置。", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "查找列表", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "被拦截的页面", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite 已阻止加载以下页面:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "该页面由于 {{listName}} 中的匹配过滤器而被阻止。", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "被拦截的页面将重定向至其他网站。如果您选择继续,将直接导航至:{{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "不含参数", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "返回", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "关闭此窗口", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "不要再警告我有关此网站", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "继续", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "进入临时移除元素模式", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "退出临时元素移除模式", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "创建自定义过滤器", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "移除自定义过滤器", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "视图:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "过滤模式详情", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "自定义DNR规则", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR规则来源:", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "动态规则集", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "会话规则集", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "保存", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "还原", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "添加", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "导入并添加…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "导出…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "备份…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "还原…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "请勿添加来自不可信来源的内容", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "已注册规则的数量:", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "移动滑块以选择最佳搭配", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "选择", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "预览", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "创建", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "选择下面的过滤器以突出显示网页中匹配的元素。点击垃圾桶可移除过滤器。", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json 2025-10-25 19:32:51.000000000 +0000 @@ -4,44 +4,28 @@ "description": "extension name." }, "extShortDesc": { - "message": "一個實驗性,不需要權限的內容封鎖程式。安裝後立刻封鎖廣告、追蹤程式、挖礦程式等網頁內容。", + "message": "一個無須授權的內容封鎖器。安裝後即可立即封鎖廣告、追蹤器、挖礦程式等等。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} 條規則,轉換自 {{filterCount}} 條網路共享規則", + "message": "{{ruleCount}} 條規則,由 {{filterCount}} 條網路過濾規則轉換而來", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { "message": "uBO Lite — 控制台", "description": "English: uBO Lite — Dashboard" }, - "dashboardUnsavedWarning": { - "message": "警告!變更尚未儲存。", - "description": "A warning in the dashboard when navigating away from unsaved changes" - }, - "dashboardUnsavedWarningStay": { - "message": "留在此頁面", - "description": "Label for button to prevent navigating away from unsaved changes" - }, - "dashboardUnsavedWarningIgnore": { - "message": "忽略變更", - "description": "Label for button to ignore unsaved changes" - }, "settingsPageName": { "message": "設定", "description": "appears as tab name in dashboard" }, - "3pPageName": { - "message": "過濾規則清單", + "customFiltersPageName": { + "message": "自訂篩選規則", "description": "appears as tab name in dashboard" }, - "1pPageName": { - "message": "自訂靜態過濾規則", - "description": "appears as tab name in dashboard" - }, - "whitelistPageName": { - "message": "信任名單", - "description": "appears as tab name in dashboard" + "developPageName": { + "message": "開發", + "description": "appears as tab name in dashboard. Inspired from 'Develop' menu in Safari, see https://developer.apple.com/documentation/safari-developer-tools/develop-menu" }, "aboutPageName": { "message": "關於", @@ -51,78 +35,30 @@ "message": "隱私權政策", "description": "Link to privacy policy on GitHub (English)" }, - "popupPowerSwitchInfo": { - "message": "為此網站停用/啟用 uBO Lite", - "description": "Tooltip for the main power button in the popup panel" - }, - "popupTipDashboard": { - "message": "開啟控制台", - "description": "English: Click to open the dashboard" - }, - "popupTipZapper": { - "message": "進入元素臨時移除模式", - "description": "Tooltip for the element-zapper icon in the popup panel" - }, - "popupTipPicker": { - "message": "進入元素選擇器模式", - "description": "English: Enter element picker mode" + "popupFilteringModeLabel": { + "message": "過濾模式", + "description": "Label in the popup panel for the current filtering mode" + }, + "popupLocalToolsLabel": { + "message": "在此網站上", + "description": "Label in the popup panel for the local tools section" }, "popupTipReport": { "message": "回報此網站的問題", "description": "Tooltip used for the 'chat' icon in the panel" }, - "popupTipSaveRules": { - "message": "點擊以讓您的變更永久生效。", - "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." - }, - "popupTipRevertRules": { - "message": "點擊以撤銷您的變更。", - "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." + "popupTipDashboard": { + "message": "開啟控制台", + "description": "English: Click to open the dashboard" }, "popupMoreButton": { "message": "更多", "description": "Label to be used to show popup panel sections" }, - "popupGrantGreatPowers": { - "message": "點擊以授予 uBO Lite 在此網站上的延伸權限。\n延伸權限可讓內容阻擋更有效率。", - "description": "Label to be used to show popup panel sections" - }, - "popupRevokeGreatPowers": { - "message": "點擊以撤銷此網站的延伸權限", - "description": "Label to be used to show popup panel sections" - }, "popupLessButton": { "message": "更少", "description": "Label to be used to hide popup panel sections" }, - "settingsIconBadgePrompt": { - "message": "在圖示上顯示被阻擋的連線請求的數量", - "description": "English: Show the number of blocked requests on the icon" - }, - "settingsAppearance": { - "message": "外觀", - "description": "Section for controlling user interface appearance" - }, - "settingsThemeLabel": { - "message": "佈景主題", - "description": "Label for checkbox to enable a custom dark theme" - }, - "settingsThemeAccent0Label": { - "message": "自訂強調顏色", - "description": "Label for checkbox to pick an accent color" - }, - "settingsNoCSPReportsPrompt": { - "message": "封鎖 CSP 回報", - "description": "background information: https://github.com/gorhill/uBlock/issues/3150" - }, - "omnipotenceLabel": { - "message": "在所有網站上啟用延伸過濾功能", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, - "omnipotenceLegend": { - "message": "uBO Lite 只能在您明確授予擴充套件「修改網站資料」的權限後,才能在啟用權限的網站,套用延伸過濾功能。這個設定能讓您一次為所有網站,授予延伸過濾功能所需的權限。", - "description": "Header for a ruleset section in 'Filter lists pane'" - }, "3pGroupDefault": { "message": "預設", "description": "Header for a ruleset section in 'Filter lists pane'" @@ -140,7 +76,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "惱人的", + "message": "嫌惡元素", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -148,47 +84,23 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "地區、語言", + "message": "地區及語言", "description": "Header for a ruleset section in 'Filter lists pane'" }, - "1pFormatHint": { - "message": "每行一個過濾規則。規則可以單純是主機名稱,或是與 EasyList 相容的過濾規則。以 ! 開頭的行將被忽略。", - "description": "Short information about how to create custom filters" - }, - "1pImport": { - "message": "匯入並加入", - "description": "English: Import and append" - }, - "1pExport": { - "message": "匯出", - "description": "English: Export" - }, - "1pExportFilename": { - "message": "my-ublock-static-filters_{{datetime}}.txt", - "description": "English: my-ublock-static-filters_{{datetime}}.txt" - }, - "whitelistPrompt": { - "message": "信任名單中的規則適用的頁面不會被 uBO Lite 過濾或阻擋。每行一個規則。", - "description": "A concise description of the 'Trusted sites' pane." - }, - "whitelistImport": { - "message": "匯入並加入", - "description": "English: Import and append" - }, - "whitelistExport": { - "message": "匯出", - "description": "English: Export" - }, - "whitelistExportFilename": { - "message": "my-ublock-trusted-sites_{{datetime}}.txt", - "description": "The default filename to use for import/export purpose" + "customFiltersImportExportLabel": { + "message": "匯入 / 匯出", + "description": "Text label heading the import/export area of custom filters" + }, + "customFiltersImportTextareaPlaceholder": { + "message": "在這裡貼上要新增的元素隱藏篩選規則", + "description": "Placeholder text which describes the purpose of the textarea widget" }, "aboutChangelog": { - "message": "更新日誌", + "message": "變更日誌", "description": "" }, "aboutCode": { - "message": "程式原始碼(GPLv3)", + "message": "原始碼(GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -208,35 +120,83 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "外部相依套件(與 GPLv3 相容):", + "message": "外部依存套件(相容 GPLv3):", "description": "Shown in the About pane" }, - "genericSubmit": { - "message": "提交", - "description": "for generic 'Submit' buttons" - }, - "genericApplyChanges": { - "message": "套用變更", - "description": "for generic 'Apply changes' buttons" - }, - "genericRevert": { - "message": "還原", - "description": "for generic 'Revert' buttons" - }, - "firstRunSectionLabel": { - "message": "歡迎", - "description": "The header text for the welcome message section" - }, - "firstRunDescription": { - "message": "您剛安裝了 uBO Lite。您可以在此處選擇要在所有網站上使用的預設過濾模式。\n\n預設情況下將會選取基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其迪取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用更進階的過濾功能。", - "description": "Descriptive text shown at first install time only " + "supportS6H": { + "message": "回報過濾規則問題", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "將特定網站的過濾器問題回報至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS5H": { + "message": "疑難排解資訊", + "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" + }, + "supportS6P1S1": { + "message": "為避免增加志願者的負擔,請先確認此問題是否已被回報過。請注意:點選按鈕會將本頁的來源傳送到 GitHub。", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "尋找類似報告", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "網址:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "網頁……", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- 選擇一項 --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "會顯示廣告或廣告殘留物", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "有覆蓋層或其他干擾", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "偵測到 uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "有隱私相關問題", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "在 uBO Lite 啟用時運作異常", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "開啟不需要的分頁或視窗", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "導向惡意軟體、釣魚網站", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "將網頁標記為「NSFW」(「工作場所不宜」)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "建立新報告", + "description": "Text for button which open an external webpage in Support pane" }, "defaultFilteringModeSectionLabel": { "message": "預設過濾模式", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "預設過濾模式將被每個網站的過濾模式覆寫。您可以根據在該網站上最有效的模式為任何指定的網站調整過濾模式。每種模式都有其優缺點。", + "message": "預設過濾模式將被每個網站的過濾模式覆寫。你可以根據每個網站的情況,調整該網站的過濾模式,以選擇最適合的模式。每種模式都有其優缺點。", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -248,7 +208,7 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "最佳化", + "message": "最佳", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -260,19 +220,195 @@ "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "進階網路過濾以及來自選定過濾條件清單的特定擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。", + "message": "進階的網路過濾功能,並結合選定過濾清單中的特定延伸過濾。 \n\n需要授予讀取和修改所有網站資料的廣泛權限。", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "進階網路過濾以及來自選定過濾條件清單的特定與通用擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。\n\n通用擴展過濾可能會導致更高的網頁資源使用率。", + "message": "進階網路過濾,加上從選定過濾清單中進行特定與通用延伸過濾。\n\n需要授予讀取和修改所有網站資料的廣泛權限。\n\n通用延伸過濾可能會導致較高的網頁資源使用量。", "description": "This describes the 'complete' filtering mode" }, + "noFilteringModeDescription": { + "message": "白名單", + "description": "A short description for the editable field which lists trusted sites" + }, + "noFilteringModePlaceholder": { + "message": "[僅主機名稱]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "行為", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "變更過濾模式時自動重新載入頁面", + "message": "變更過濾模式時自動重新載入", + "description": "Label for a checkbox in the options page" + }, + "showBlockedCountLabel": { + "message": "在工具列圖示上顯示已封鎖請求的數量。", "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLabel": { + "message": "啟用嚴格阻擋", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "前往潛在不良網站的導航將被阻止,您可以選擇是否繼續前往。", + "description": "Short description for a checkbox in the options page" + }, + "developerModeLabel": { + "message": "開發人員模式", + "description": "Label for a checkbox in the options page" + }, + "developerModeLegend": { + "message": "啟用適合技術使用者使用的功能。", + "description": "Short description for a checkbox in the options page" + }, + "settingsBackupRestoreLabel": { + "message": "備份", + "description": "The header text for the back up/restore section" + }, + "settingsBackupRestoreSummary": { + "message": "將你的自訂設定備份到檔案,或是從檔案還原你的自訂設定。", + "description": "A summary description of the back up/restore section." + }, + "settingsBackupRestoreLegend": { + "message": "還原將覆寫你目前所有的自訂設定。", + "description": "Important information about the back up/restore section." + }, + "findListsPlaceholder": { + "message": "尋找清單", + "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "已封鎖頁面", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite 已防止下列頁面載入:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "由於符合 {{listname}} 中的過濾規則,此頁面已被封鎖。", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "被阻擋的頁面想要重定向到另一個網站。如果您選擇繼續,將直接導航至:{{url}}", + "description": "Text warning about an incoming redirect" + }, + "strictblockNoParamsPrompt": { + "message": "不帶參數", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "返回", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "關閉此視窗", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "不再就此網站警告我", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "繼續", + "description": "A button to navigate to the blocked page" + }, + "zapperTipEnter": { + "message": "進入元素臨時移除模式", + "description": "Tooltip for the button used to enter zapper mode" + }, + "zapperTipQuit": { + "message": "離開元素臨時移除模式", + "description": "Tooltip for the button used to exit zapper mode" + }, + "pickerTipEnter": { + "message": "建立自訂過濾器", + "description": "Label for the menu entry to create cosmetic filters" + }, + "unpickerTipEnter": { + "message": "移除自訂過濾器", + "description": "Label for the menu entry to delete cosmetic filters" + }, + "developDropdownLabel": { + "message": "檢視:", + "description": "A label of a dropdown list" + }, + "developOptionFilteringModeDetails": { + "message": "過濾模式詳細資訊", + "description": "An option in a dropdown list" + }, + "developOptionCustomDnrRules": { + "message": "自訂 DNR 規則", + "description": "An option in a dropdown list" + }, + "developOptionDnrRulesOf": { + "message": "DNR 規則……", + "description": "A section header in a dropdown list" + }, + "developOptionDynamicRuleset": { + "message": "動態規則集", + "description": "An option in a dropdown list" + }, + "developOptionSessionRuleset": { + "message": "工作階段規則集", + "description": "An option in a dropdown list" + }, + "saveButton": { + "message": "儲存", + "description": "Text for buttons used to save changes" + }, + "revertButton": { + "message": "還原", + "description": "Text for buttons used to revert changes" + }, + "addButton": { + "message": "新增", + "description": "Text for buttons used to add content" + }, + "importAndAppendButton": { + "message": "匯入並加入…", + "description": "Text for buttons used to import and append content" + }, + "exportButton": { + "message": "匯出…", + "description": "Text for buttons used to export content" + }, + "backupButton": { + "message": "備份…", + "description": "Text for buttons used to back up content" + }, + "restoreButton": { + "message": "還原…", + "description": "Text for buttons used to restore content" + }, + "dnrRulesWarning": { + "message": "切勿新增來自不受信任來源的內容", + "description": "Short description of the DNR rules editor pane" + }, + "dnrRulesCountInfo": { + "message": "已登錄規則數:{count}", + "description": "Short sentence to report the number of currently registered DNR rules" + }, + "pickerSliderLabel": { + "message": "移動滑桿以選取最佳符合", + "description": "Label to describe the purpose of the slider" + }, + "pickerPick": { + "message": "挑選", + "description": "Text for the button to re-enter element-picking mode" + }, + "pickerPreview": { + "message": "預覽", + "description": "Text for the button to activate preview mode" + }, + "pickerCreate": { + "message": "建立", + "description": "Text for the button to create the filter" + }, + "unpickerUsage": { + "message": "選取下方的過濾器,突顯網頁中符合條件的元素。按一下回收桶可移除過濾器", + "description": "Summary description on how to use the tool to remove custom filters" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/about.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/about.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/about.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/about.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ - - - - - -uBlock Origin Lite — About - - - - - - - - -
-
-
-
Copyright (c) Raymond Hill 2014-present
-
-
-
-
-
-
-
-
-
-
-
- -
- - - - - - - - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/dashboard-common.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard-common.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/dashboard-common.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard-common.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,13 @@ body { + align-items: center; + box-sizing: border-box; + display: flex; + flex-direction: column; } +body > * { + width: min(640px, 100%); + } + h2, h3 { margin: 1em 0; } @@ -9,9 +17,11 @@ h3 { font-size: 16px; } + a { text-decoration: none; } + .fa-icon.info { color: var(--info0-ink); fill: var(--info0-ink); @@ -28,9 +38,15 @@ color: var(--info3-ink); fill: var(--info3-ink); } + input[type="number"] { width: 5em; } + +input[type="file"] { + display: none; + } + @media (max-height: 640px), (max-height: 800px) and (max-width: 480px) { .body > p, .body > ul { diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/dashboard.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/dashboard.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,19 +1,10 @@ -html, body { - align-items: center; - box-sizing: border-box; - display: flex; - flex-direction: column; - height: 100vh; - justify-content: stretch; - padding: 0 1em; - overflow: hidden; - position: relative; - width: 100vw; - } -body > * { - width: min(641px, 100vw); +header { + background-color: var(--surface-1); + position: sticky; + top: 0; + z-index: 100; } -#dashboard-nav { +nav { border: 0; border-bottom: 1px solid var(--border-1); display: flex; @@ -21,11 +12,8 @@ flex-wrap: wrap; overflow-x: hidden; padding: 0; - position: sticky; - top: 0; - z-index: 10; } -.tabButton { +nav > .tabButton { background-color: transparent; border: 0; border-bottom: 3px solid transparent; @@ -38,81 +26,60 @@ text-decoration: none; white-space: nowrap; } -.tabButton:focus { +nav > .tabButton:focus { outline: 0; } -/* - * TODO: support keyboard-driven navigation - * -.tabButton:not(:active):focus { - background-color: var(--dashboard-tab-focus-surface); +nav > .tabButton:hover { + background-color: var(--dashboard-tab-hover-surface); + border-bottom-color: var(--dashboard-tab-hover-border); } - */ -.tabButton.selected { + +body[data-pane="settings"] #dashboard-nav .tabButton[data-pane="settings"], +body[data-pane="rulesets"] #dashboard-nav .tabButton[data-pane="rulesets"], +body[data-pane="filters"] #dashboard-nav .tabButton[data-pane="filters"], +body[data-pane="develop"] #dashboard-nav .tabButton[data-pane="develop"], +body[data-pane="about"] #dashboard-nav .tabButton[data-pane="about"] { background-color: var(--dashboard-tab-active-surface); border-bottom: 3px solid var(--dashboard-tab-active-ink); color: var(--dashboard-tab-active-ink); fill: var(--dashboard-tab-active-ink); } -iframe { - background-color: transparent; - border: 0; - flex-grow: 1; - margin: 0; - padding: 0; +body:not([data-develop="true"]) #dashboard-nav .tabButton[data-pane="develop"] { + display: none; } -#unsavedWarning { +body:not([data-pane="rulesets"]) header [data-pane-related="rulesets"] { display: none; - left: 0; - position: absolute; - width: 100%; - z-index: 20; - } -#unsavedWarning.on { - display: initial; - } -#unsavedWarning > div:first-of-type { - padding: 0.5em; - } -#unsavedWarning > div:last-of-type { - height: 100vh; - position: absolute; } -body:not(.canUpdateShortcuts) .tabButton[data-pane="shortcuts.html"] { +body > section { + box-sizing: border-box; display: none; + padding: 0 var(--default-gap-xxsmall); + padding-bottom: 2rem; } -body .tabButton[data-pane="no-dashboard.html"] { - display: none; +body [data-pane-related] { + padding: 0 var(--default-gap-xxsmall); } -body.noDashboard #dashboard-nav { - display: none; + +body[data-pane="settings"] > section[data-pane="settings"], +body[data-pane="rulesets"] > section[data-pane="rulesets"], +body[data-pane="filters"] > section[data-pane="filters"], +body[data-pane="develop"] > section[data-pane="develop"], +body[data-pane="about"] > section[data-pane="about"] { + display: block; } /* high dpi devices */ :root.hidpi .tabButton { - font-family: Metropolis, sans-serif; font-weight: 600; letter-spacing: 0.5px; } -/* hover-able devices */ -:root.desktop .tabButton { - cursor: default; - } -:root.desktop .tabButton:not(.selected) { - cursor: pointer; - } -:root.desktop .tabButton:not(.selected):hover { - background-color: var(--dashboard-tab-hover-surface); - border-bottom-color: var(--dashboard-tab-hover-border); - } - /* touch-screen devices */ -:root.mobile #dashboard-nav { +:root.mobile nav { flex-wrap: nowrap; overflow-x: auto; } -:root.mobile #dashboard-nav .logo { +:root.mobile nav .logo { display: none; } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/develop.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/develop.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/develop.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/develop.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,168 @@ +body[data-pane="develop"] { + height: 100vh; + } + +section[data-pane="develop"] { + display: none; + flex-grow: 1; + overflow: hidden; + } + +section[data-pane="develop"] > div { + display: flex; + flex-direction: column; + height: 100%; + } + +section[data-pane="develop"] > div > * { + margin-bottom: 0; + margin-top: 1em; + } + +#cm-container { + flex-grow: 1; + font-size: var(--monospace-size); + overflow: hidden; + } + +/* https://discuss.codemirror.net/t/how-to-set-max-height-of-the-editor/2882/2 */ +#cm-container .cm-editor { + background-color: var(--surface-0); + height: 100%; + } + +#cm-container .cm-editor .cm-line:has(.ubol-boundary) { + background-image: url('line-hor-dashed.png'), url('line-hor-dashed.png'); + background-position: left 3px, left calc(100% - 3px); + background-repeat: repeat-x; + } +#cm-container .cm-editor { + color: var(--ink-1); + } +:root.dark #cm-container .cm-editor { + color: var(--ink-2); + } +#cm-container .cm-editor .cm-line .ubol-comment { + color: #ba5300; + } +:root.dark #cm-container .cm-editor .cm-line .ubol-comment { + color: #fa7000; + } +#cm-container .cm-editor .cm-line .ubol-keyword { + color: #ae42be; + } +:root.dark #cm-container .cm-editor .cm-line .ubol-keyword { + color: #ea59ff; + } +#cm-container .cm-editor .cm-line .ubol-literal { + color: #168156; + } +:root.dark #cm-container .cm-editor .cm-line .ubol-literal { + color: #1dae74; + } +#cm-container .cm-editor .cm-line.badline:not(.cm-activeLine) { + background-color: color-mix(in srgb, var(--info3-ink) 15%, transparent 85%); + } + +#cm-container .cm-editor .cm-line .badmark { + text-decoration: underline var(--cm-negative) wavy; + text-decoration-skip-ink: none; + } + +#cm-container .cm-editor .cm-panel.cm-search { + display: flex; + flex-wrap: wrap; + font-family: sans-serif; + font-size: var(--font-size); + gap: 0.5em 1em; + padding: 0.5em 1.5em 0.5em 0.5em; + } + +#cm-container .cm-editor .cm-panel.cm-search > * { + margin: 0; + } + +#cm-container .cm-editor .cm-panel.cm-search .cm-textfield, +#cm-container .cm-editor .cm-panel.cm-search .cm-button, +#cm-container .cm-editor .cm-panel.cm-search label { + background-image: inherit; + border: inherit; + flex-grow: 0; + font-size: var(--button-font-size); + min-height: calc(var(--button-font-size) * 1.8); + } + +#cm-container .cm-editor .cm-panel .warning { + color: var(--info3-ink); + } + +#cm-container .cm-editor .cm-panel.io-panel { + background-color: var(--surface-1); + box-sizing: border-box; + display: inline-flex; + gap: 0.25em; + padding: 0.25em; + padding-inline-start: 0; + width: 100%; + } +#cm-container .cm-editor .cm-panel.io-panel button { + min-height: 30px; + } +#cm-container .cm-editor .cm-panel.io-panel button#revert { + margin-inline-end: 1em; + } +#cm-container .cm-editor .cm-panel.io-panel:not([data-io~="apply"]) button#apply { + display: none; + } +#cm-container .cm-editor .cm-panel.io-panel:not([data-io~="revert"]) button#revert { + display: none; + } +#cm-container .cm-editor .cm-panel.io-panel:not([data-io~="import"]) button#import { + display: none; + } +#cm-container .cm-editor .cm-panel.io-panel:not([data-io~="export"]) button#export { + display: none; + } + +#cm-container .cm-editor .cm-panel.info-panel { + display: flex; + flex-wrap: nowrap; + font-size: var(--font-size); + padding: var(--default-gap-xxsmall) var(--default-gap-xsmall); + } +#cm-container .cm-editor .cm-panel.info-panel .info { + flex-grow: 1; + overflow: auto; + } +#cm-container .cm-editor .cm-panel.info-panel .close { + cursor: default; + flex-shrink: 0; + padding-inline-start: 1em; + } +#cm-container .cm-editor .cm-panel.info-panel .close::after { + content: '\2715'; + } + +#cm-container .cm-editor .cm-panel.summary-panel { + background-color: color-mix(in srgb, var(--info1-ink) 15%, transparent 85%); + gap: 1em; + } +#cm-container .cm-editor .cm-panel.summary-panel .info { + flex-shrink: 0; + } + +#cm-container .cm-editor .cm-panel.feedback-panel { + background-color: color-mix(in srgb, var(--info3-ink) 15%, transparent 85%); + white-space: pre; + max-height: 10cqh; + } + +#cm-container .cm-editor .cm-gutterElement { + cursor: default; + user-select: none; + } + +#cm-container .cm-editor .cm-tooltip .badmark-tooltip { + background-color: color-mix(in srgb, var(--info3-ink) 15%, transparent 85%); + padding: var(--default-gap-xxsmall) var(--default-gap-xsmall); + } \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/filtering-mode.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/filtering-mode.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/filtering-mode.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/filtering-mode.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,19 +1,24 @@ +:root { + --filtering-mode-button-size: 60px; /* should be multiple of 4 */ + --filtering-mode-slider-width: calc(4 * var(--filtering-mode-button-size) + 3px); + } + .filteringModeSlider { align-items: center; + container-type: size; display: flex; - height: 60px; + height: var(--filtering-mode-button-size); justify-content: center; position: relative; - width: 240px; + width: var(--filtering-mode-slider-width); } .filteringModeButton { background-color: var(--surface-1); - box-sizing: border-box; - border-radius: 30% 15% / 15% 30%; - height: 100%; + border-radius: 20%; + height: var(--filtering-mode-button-size); position: absolute; - width: 25%; + width: var(--filtering-mode-button-size); z-index: 10; } @@ -22,9 +27,8 @@ border: 4px solid var(--accent-surface-1); border-radius: inherit; box-sizing: border-box; - height: calc(100% - 2px); - margin: 1px; - width: calc(100% - 2px); + height: 100%; + width: 100%; } .filteringModeSlider.moving .filteringModeButton > div, @@ -40,9 +44,13 @@ .filteringModeSlider span[data-level] { background-color: var(--accent-surface-1); display: inline-flex; + flex-shrink: 0; height: 30%; margin-left: 1px; - width: 25%; + width: var(--filtering-mode-button-size); + } +.filteringModeSlider span[data-level]:first-of-type { + margin-left: 0; } .filteringModeSlider.moving span[data-level] { @@ -53,38 +61,49 @@ left: 0; } .filteringModeSlider[data-level="1"] .filteringModeButton { - left: 25%; + left: calc(var(--filtering-mode-button-size) + 1px); } .filteringModeSlider[data-level="2"] .filteringModeButton { - left: 50%; + left: calc(var(--filtering-mode-button-size) * 2 + 2px); } .filteringModeSlider[data-level="3"] .filteringModeButton { - left: 75%; + left: calc(var(--filtering-mode-button-size) * 3 + 3px); + } + +[dir="rtl"] .filteringModeSlider span[data-level] { + margin-left: 0; + margin-right: 1px; + } +[dir="rtl"] .filteringModeSlider span[data-level]:first-of-type { + margin-right: 0; } [dir="rtl"] .filteringModeSlider[data-level="0"] .filteringModeButton { - left: 75%; + right: 0; } [dir="rtl"] .filteringModeSlider[data-level="1"] .filteringModeButton { - left: 50%; + right: calc(var(--filtering-mode-button-size) + 1px); } [dir="rtl"] .filteringModeSlider[data-level="2"] .filteringModeButton { - left: 25%; + right: calc(var(--filtering-mode-button-size) * 2 + 2px); } [dir="rtl"] .filteringModeSlider[data-level="3"] .filteringModeButton { - left: 0; + right: calc(var(--filtering-mode-button-size) * 3 + 3px); } .filteringModeSlider[data-level="0"] span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level="1"] span[data-level]:nth-of-type(1) ~ span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level="2"] span[data-level]:nth-of-type(2) ~ span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level]:not(.moving) span[data-level]:hover { Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/line-hor-dashed.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/line-hor-dashed.png differ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/matched-rules.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/matched-rules.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/matched-rules.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/matched-rules.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,31 @@ + +#matchedEntries { + display: flex; + flex-direction: column; + font-family: monospace; + font-size: small; + white-space: pre-wrap; + word-break: break-all; +} + +.matchInfo { + display: flex; + flex-wrap: nowrap; +} + +.matchInfo:nth-of-type(2n) { + background-color: lightgray; +} +html.dark .matchInfo:nth-of-type(2n) { + background-color: #444; +} + +.requestInfo { + border-inline-end: 1px dotted black; + padding-inline-end: 0.5em; + width: 25vw; +} + +.ruleInfo { + padding-inline-start: 0.5em; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/picker-ui.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/picker-ui.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/picker-ui.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/picker-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,144 @@ +:root#ubol-picker { + --ubol-overlay-fill: rgba(255,64,64,0.10); + --ubol-overlay-border: #F00; +} + +#ubol-picker.paused svg#overlay { + cursor: not-allowed; +} + +:root aside { + background-color: var(--surface-1); + border: 1px solid var(--border-2); + max-width: min(32rem, 100vw - 4px); + min-width: min(24rem, 100vw - 4px); + row-gap: 1em; + width: min(32rem, 100vw - 4px); +} + +#ubol-picker aside > section:last-of-type { + margin-block-end: 0; +} +#ubol-picker aside > section:not(#windowbar,#moreOrLess) { + padding: 0 4px; +} + +#ubol-picker[data-view="0"] aside section[data-view="1"], +#ubol-picker[data-view="0"] aside section[data-view="2"] { + display: none; +} +#ubol-picker[data-view="1"] aside section[data-view="2"] { + display: none; +} + +#ubol-picker:not(.paused) aside > section:not(#windowbar) { + display: none; +} + +#ubol-picker textarea { + border: 0; + box-sizing: border-box; + min-height: 5em; + resize: none; + width: 100%; +} +#ubol-picker.mobile textarea { + height: unset; +} +#ubol-picker .resultsetWidgets { + color: var(--ink-2); + display: flex; + flex-direction: column; + font-size: small; + gap: 0.25em; +} +#ubol-picker .resultsetWidgets > span:first-of-type { + display: flex; + margin: 0 1em; +} +#ubol-picker .resultsetWidgets label { + flex-grow: 1; +} +#ubol-picker .resultsetWidgets #resultsetCount { + display: inline-block; + text-align: right; + width: 8ch; +} + +#ubol-picker #toolbar { + display: flex; + justify-content: space-between; +} +#ubol-picker #toolbar button { + min-width: 5em; +} + +#ubol-picker #candidateFilters { + font-family: monospace; + font-size: small; + max-height: min(20em, 30vh); + min-height: 6em; + overflow-y: auto; + word-break: break-all; +} +#ubol-picker #candidateFilters ul { + margin: 0; + padding-inline-start: calc(2ch + 4px); + user-select: none; + -webkit-user-select: none; +} +#ubol-picker #candidateFilters ul > li { + list-style-type: '\25A0\00A0'; +} +#ubol-picker #candidateFilters ul >li:has(:not(span.on)) { + list-style-type: '\25A1\00A0'; +} +#ubol-picker #candidateFilters ul > li:nth-of-type(2n+1) { + background-color: var(--surface-2); +} +#ubol-picker #candidateFilters ul > li > span { + border: 1px solid transparent; + padding: 1px 2px; +} +#ubol-picker #candidateFilters ul > li > span.on { + background-color: var(--accent-surface-1); + color: var(--accent-ink-1);} +#ubol-picker #candidateFilters ul > li > span:hover { + border: 1px solid var(--ink-1); +} + +#ubol-picker #moreOrLess { + color: var(--ink-2); + column-gap: 0; + display: grid; + font-size: small; + grid-template: auto / 1fr 1fr; + justify-items: stretch; + user-select: none; + -webkit-user-select: none; + white-space: nowrap; +} +#ubol-picker #moreOrLess > span { + cursor: pointer; + padding: var(--default-gap-xxsmall) var(--default-gap-xsmall); +} +#ubol-picker #moreOrLess > span:last-of-type { + text-align: end; +} +#ubol-picker[data-view="2"] aside #moreOrLess > span:first-of-type { + visibility: hidden; +} +#ubol-picker[data-view="0"] aside #moreOrLess > span:last-of-type { + visibility: hidden; +} +#ubol-picker.desktop aside #moreOrLess > span:hover { + background-color: var(--surface-2); +} + +#ubol-picker.preview #toolbar #preview { + color: var(--accent-ink-1); + background-color: var(--accent-surface-1); +} +#ubol-picker.preview #overlay path { + display: none; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/popup.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/popup.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/popup.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/popup.css 2025-10-25 19:32:51.000000000 +0000 @@ -2,269 +2,196 @@ .fa-icon.fa-icon-badged > .fa-icon-badge { bottom: auto; top: -20%; - } +} + +:root { + --popup-min-width: calc( + var(--filtering-mode-slider-width) + + var(--filtering-mode-button-size) / 2 + ); +} -/* Internal CSS values */ -:root body { - overflow: hidden; - } :root body, :root.mobile body { - --font-size: 14px; --popup-gap: var(--font-size); --popup-gap-thin: calc(0.5 * var(--popup-gap)); --popup-gap-extra-thin: calc(0.25 * var(--popup-gap)); - --popup-main-min-width: 18em; - --popup-firewall-min-width: 30em; - --popup-rule-cell-width: 5em; - font-size: var(--font-size); - line-height: 20px; - } + min-width: var(--popup-min-width); +} :root body.loading { - opacity: 0; - } + visibility: hidden; +} a { color: var(--ink-1); fill: var(--ink-1); text-decoration: none; - } +} :focus { outline: 0; - } +} #main { align-self: flex-start; - max-width: 340px; - min-width: var(--popup-main-min-width); - } + display: flex; + flex-direction: column; +} :root.portrait #main { align-self: inherit; - } +} hr { - border: 0; - border-top: 1px solid var(--hr-ink); - margin: 0; - padding: 0; - } + margin: 0.5em 0; +} + +#hostname { + align-items: center; + background-color: var(--popup-toolbar-surface); + display: flex; + justify-content: center; + min-height: calc(var(--font-size) * 3); + padding: 0 var(--popup-gap-extra-thin); + text-align: center; + word-break: break-all; +} +#hostname > span { + word-break: break-all; +} +#hostname > span + span { + font-weight: 600; +} + +body[data-forbid~="filteringMode"] .filteringModeSlider { + pointer-events: none; +} +body[data-forbid~="zapper"] #gotoZapper, +body[data-forbid~="picker"] #gotoPicker, +body[data-forbid~="picker"] #gotoUnpicker, +body[data-forbid~="report"] #gotoReport, +body[data-forbid~="zapper"][data-forbid~="picker"][data-forbid~="report"] .localTools { + display: none; +} +body[data-forbid~="dashboard"] .globalTools { + display: none; +} #filteringModeText { - background-color: var(--surface-2); color: var(--ink-3); - display: flex; - padding: var(--default-gap-xsmall); + margin-bottom: var(--popup-gap-thin); + text-align: center; text-transform: lowercase; - } +} +#filteringModeText > span { + color: var(--accent-surface-1); +} #filteringModeText > span:nth-of-type(2) { display: none; - } +} #filteringModeText > span:nth-of-type(2):not(:empty) { display: inline; - } +} #filteringModeText > span:nth-of-type(2):not(:empty)::before { content: '\2002\2192\2002'; - } +} [dir="rtl"] #filteringModeText > span:nth-of-type(2):not(:empty)::before { content: '\2002\2190\2002'; - } +} .filteringModeSlider { - height: 32px; - margin: 8px; - width: 128px; - } - -.rulesetTools { - background-color: transparent; - border: 0; - box-sizing: border-box; - display: flex; - flex-direction: column; - justify-content: space-evenly; - width: 25%; - } -.rulesetTools [id] { - background-color: var(--popup-ruleset-tool-surface); - border-radius: 4px; - cursor: pointer; - fill: var(--popup-ruleset-tool-ink); - flex-grow: 1; - font-size: 2.2em; - padding: 0; - visibility: hidden; - } -.rulesetTools [id]:not(:first-of-type) { - margin-block-start: 1px; - } -.rulesetTools [id] > svg { - fill: var(--ink-4); - } + align-self: center; + margin: var(--popup-gap) 0; +} + body.needReload #refresh { visibility: visible; - } -#hostname { - font-size: var(--font-size-larger); - margin: var(--popup-gap) var(--popup-gap-thin); - text-align: center; - } -#hostname > span { - word-break: break-all; - } -#hostname > span + span { - font-weight: 600; - } +} -#rulesetStats { - padding: 0 var(--popup-gap-thin); - } -#rulesetStats .rulesetDetails h1 { - font-size: 1em; - font-weight: normal; - margin: 0.5em 0 0.25em 0; - text-transform: capitalize; - } -#rulesetStats .rulesetDetails p { +.toolMenu { + border-top: 1px solid var(--surface-2); + display: flex; + flex-direction: column; + margin: 0.5em 0; + padding-top: 0.5em; +} +:root:not(.isHTTP) .needHTTP { + display: none; +} +.toolMenu > label { + font-size: 90%; color: var(--ink-2); - font-size: var(--font-size-smaller); - margin: 0.25em 0 0.5em 0.5em; - } - -.itemRibbon { - column-gap: var(--popup-gap); - display: grid; - grid-auto-columns: 1fr; - grid-auto-flow: column; - grid-template: auto / 1fr 1fr; - margin: var(--popup-gap); - } -.itemRibbon > span + span { - text-align: end; - } + line-height: calc(var(--font-size) * 1.8); + margin-inline-start: 0.5em; +} +.toolMenu > .tool { + cursor: pointer; + display: flex; + padding: 0.5em 0.5em 0.5em 0; + unicode-bidi: embed; +} +.toolMenu > .tool:hover { + color: var(--ink-1); + fill: var(--ink-1); +} +.toolMenu > .tool:not(.enabled) { + display: none; +} +.toolMenu > .tool .fa-icon { + font-size: 1.4em; + min-width: 1.4em; +} +.toolMenu > .tool [data-i18n] { + flex-grow: 1; +} .toolRibbon { - align-items: start; background-color: var(--popup-toolbar-surface); - display: grid; - grid-auto-columns: 1fr; - grid-auto-flow: column; - grid-template: auto / repeat(5, 1fr); - justify-items: center; + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + margin: 0; white-space: normal; - } +} .toolRibbon .tool { cursor: pointer; display: flex; flex-direction: column; - font-size: 1.4em; min-width: 32px; - padding: var(--popup-gap) - var(--popup-gap-thin); + padding: var(--default-gap-small); unicode-bidi: embed; visibility: hidden; - } +} .toolRibbon .tool:hover { color: var(--ink-1); fill: var(--ink-1); - } +} .toolRibbon .tool.enabled { visibility: visible; - } +} +.toolRibbon .tool.fa-icon { + font-size: 1.4em; +} +:root.mobile .toolRibbon .tool.fa-icon { + font-size: 1.6em; +} .toolRibbon .tool .caption { font: 10px/12px sans-serif; margin-top: 6px; text-align: center; - } -body.mobile.no-tooltips .toolRibbon .tool { - font-size: 1.6em; - } -.toolRibbon.genericTools { - margin-bottom: 0; - } - -#moreOrLess { - column-gap: 0; - display: grid; - grid-template: auto / 1fr 1fr; - justify-items: stretch; - margin: 1px 0 0 0; - } -#moreOrLess > span { - cursor: pointer; - margin: 0; - padding: var(--popup-gap-thin) var(--popup-gap); - user-select: none; - white-space: nowrap; - } -#moreButton .fa-icon { - transform: rotate(180deg); - } -#lessButton { - border-inline-start: 1px solid var(--surface-1); - text-align: end; - } -body[data-section="a b"] #moreButton { - pointer-events: none; - visibility: hidden; - } -body[data-section=""] #lessButton { - pointer-events: none; - visibility: hidden; - } -body:not([data-section~="a"]) [data-section="a"] { +} +:root:not(.mobile) .toolRibbon .caption { display: none; - } -body:not([data-section~="b"]) [data-section="b"] { - display: none; - } - -/* configurable UI elements */ -:root:not(.mobile) .toolRibbon .caption, -:root.mobile body.no-tooltips .toolRibbon .caption, -:root.mobile body[data-ui~="-captions"] .toolRibbon .caption { - display: none; - } -:root.mobile .toolRibbon .caption, -:root:not(.mobile) body[data-ui~="+captions"] .toolRibbon .caption { - display: inherit; - } -:root:not(.mobile) .toolRibbon .tool, -:root.mobile body.no-tooltips .toolRibbon .tool, -:root.mobile body[data-ui~="-captions"] .toolRibbon .tool { - padding: var(--popup-gap) var(--popup-gap-thin); - } -:root.mobile #moreOrLess > span { - padding: var(--popup-gap); - } +} /* horizontally-constrained viewport */ :root.portrait body { overflow-y: auto; width: 100%; - } +} :root.portrait #main { max-width: unset; - } +} /* mouse-driven devices */ :root.desktop { display: flex; - justify-content: flex-end; - } -:root.desktop body { - --popup-gap: calc(var(--font-size) * 0.875); - } -:root.desktop .rulesetTools [id]:hover { - background-color: var(--popup-ruleset-tool-surface-hover); - } -:root.desktop .rulesetTools [id]:hover > svg { - fill: var(--ink-2); - } +} :root.desktop .tool:hover { background-color: var(--popup-toolbar-surface-hover); - } -:root.desktop #moreOrLess > span:hover { - background-color: var(--surface-2); - /* background-color: var(--popup-toolbar-surface-hover); */ - } - -#templates { - display: none; - } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/report.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/report.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/report.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/report.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,3 @@ +.warning { + color: var(--info2-ink); +} \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/settings.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/settings.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/settings.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/settings.css 2025-10-25 19:32:51.000000000 +0000 @@ -2,30 +2,41 @@ 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } -body { - margin-bottom: 6rem; + +:root { + --filtering-mode-button-size: 32px; } -legend { - color: var(--ink-3); + +body.loading { + visibility: hidden; + } +h3 { + margin: 1em 0; + } + +label + legend { + color: color-mix(in srgb, currentColor 69%, transparent); font-size: var(--font-size-smaller); - padding: var(--default-gap-xxsmall); + margin-inline-start: var(--default-gap-large); } -body .firstRun { + +body[data-forbid~="dashboard"] #dashboard-nav [data-pane="settings"], +body[data-forbid~="dashboard"] section[data-pane="settings"], +body[data-forbid~="dashboard"] #dashboard-nav [data-pane="rulesets"], +body[data-forbid~="dashboard"] section[data-pane="rulesets"] { display: none; } -body.firstRun .firstRun { - background-color: rgb(var(--dashboard-highlight-surface-rgb)); - display: block; - padding: 8px; - } -body > div { - margin: 1em 0; +body[data-forbid~="filteringMode"] section[data-pane="settings"] > div:has(> h3[data-i18n="defaultFilteringModeSectionLabel"]), +body[data-forbid~="filteringMode"] section[data-pane="settings"] > div:has(> h3[data-i18n="filteringMode0Name"]) { + display: none; } -h3 { - margin: 0; +body[data-forbid~="develop"] #developerMode { + display: none; } -p { - white-space: pre-line; + +label:has(input[type="checkbox"][disabled]), +label:has(input[type="checkbox"][disabled]) + legend { + filter: var(--checkbox-disabled-filter); } #defaultFilteringMode { @@ -39,6 +50,9 @@ display: flex; flex-direction: column; } +.filteringModeCard:hover { + background-color: color-mix(in hsl, var(--surface-1) 75%, var(--surface-0) 25%); + } .filteringModeCard:has(.radio > [type="radio"]:checked) { background-color: var(--surface-0); } @@ -65,85 +79,134 @@ white-space: pre-line; } .filteringModeSlider { - height: calc(60px / 2); pointer-events: none; - width: calc(240px / 2); } -#lists { - margin: 0.5em 0 0 0; - padding: 0; +h3[data-i18n="filteringMode0Name"]::first-letter { + text-transform: capitalize; } -.groupEntry:not([data-groupkey="user"]) .geDetails::before { - color: var(--ink-3); - content: '\2212'; - font-family: monospace; - font-size: large; - margin-inline-end: 0.25em; - -webkit-margin-end: 0.25em; + +body[data-platform="safari"] [data-platform-exclude="safari"] { + display: none; + } + +section[data-pane="settings"] p:has(button) { + display: flex; + flex-wrap: wrap; + gap: 1em; } -.groupEntry.hideUnused:not([data-groupkey="user"]) .geDetails::before { - content: '+'; + +body:not(.committing) #commit-spinner { + display: none; + } +body.committing #commit-spinner { + animation: spin 1s steps(8) infinite; + fill: var(--accent-surface-1); + } +#dnrError { + color: var(--info3-ink); + } +#dnrError:empty { + display: none; + } +section[data-pane="rulesets"] > div:first-of-type > p:first-of-type { + margin-top: 0; } -.groupEntry { - margin: 0.5em 0; +section[data-pane="rulesets"] > div:first-of-type > p:last-of-type { + margin-bottom: 0; } -.groupEntry .geDetails { +.listEntry { + display: flex; + flex-direction: column; + } +.listEntry[data-nodeid] > .detailbar .listExpander { cursor: pointer; + top: 2px; } -.groupEntry .geName { +.listEntry[data-role="rootnode"] > .detailbar, +.listEntry[data-nodeid] > .detailbar .count { + cursor: pointer; + } +.listEntry[data-role="rootnode"] > .detailbar > *:not(.listExpander) { pointer-events: none; } -.groupEntry .geCount { +.listEntry .detailbar .count { + align-self: flex-end; color: var(--ink-3); - font-size: 90%; + font-size: small; pointer-events: none; } .listEntries { - margin-inline-start: 0.6em; - -webkit-margin-start: 0.6em; + display: flex; + flex-direction: column; } -.groupEntry:not([data-groupkey="user"]) .listEntry:not(.isDefault).unused { +.listEntry:not([data-role="rootnode"]) > .listEntries { + margin-inline-start: var(--checkbox-size); + } +.listEntry.hideUnused > .listEntries > .listEntry:not(.isDefault):has(> .detailbar input:not(:checked)) { + display: none; + } +.listEntry.fromAdmin:has(> .detailbar input[disabled]:not(:checked)) { display: none; } .listEntry > * { - margin-left: 0; - margin-right: 0; - text-transform: capitalize; unicode-bidi: embed; } -.listEntry .listname { +.listEntry h3 { + display: inline-block; + margin: 0; + } +.listEntry > .detailbar { + align-items: center; + display: inline-flex; + margin: calc(var(--default-gap-xsmall) / 2 + var(--default-gap-xxsmall) / 2) 0; white-space: nowrap; } +.listEntry > .detailbar > *:not(:first-child) { + margin-inline-start: var(--default-gap-xxsmall); + } +.listEntry[data-nodeid="default"] > .detailbar > .listExpander { + display: none; + } +.listEntry > .detailbar > .listExpander svg { + transform: rotate(180deg); + transform-origin: 50%; + } +.listEntry.hideUnused > .detailbar > .listExpander svg { + transform: rotate(90deg); + } +.listEntry .checkbox:has(input[disabled]), +.listEntry .checkbox:has(input[disabled]) ~ span { + filter: var(--checkbox-disabled-filter); + } .listEntry a, .listEntry .fa-icon { color: var(--info0-ink); fill: var(--info0-ink); - display: none; font-size: 120%; - margin: 0 0.2em 0 0; } .listEntry .fa-icon:hover { transform: scale(1.25); } -.listEntry .content { - display: inline-flex; +.listEntry .iconbar a.support[href="#"] { + display: none; } -.listEntry a.towiki { - display: inline-flex; + +body.noMoreRuleset .listEntry:has(> .detailbar input:not(:checked)) { + opacity: 0.5; + pointer-events: none; +} + +#lists.searchMode > .listEntries .listEntries, +#lists.searchMode > .listEntries .listEntry.searchMatch { + display: flex !important; } -.listEntry.support a.support { - display: inline-flex; +#lists.searchMode > .listEntries .listEntry { + display: none; } -.listEntry.mustread a.mustread { - color: var(--info1-ink); - fill: var(--info1-ink); - display: inline-flex; +#lists.searchMode > .listEntries .listExpander { + visibility: hidden; } -.listEntry .status { - cursor: default; - display: none; -} /* touch-screen devices */ :root.mobile .listEntry .fa-icon { @@ -170,6 +233,111 @@ margin-top: 0.2em; } -#templates { +body section[data-pane="filters"] { + padding-inline: 0; + } +body section[data-pane="filters"] .hostnames { + border-bottom: 1px solid var(--border-1); + margin-block-start: 1em; + } +body section[data-pane="filters"] .hostnames:empty { + display: none; + } +body.busy section[data-pane="filters"] .hostnames { + pointer-events: none; + } +section[data-pane="filters"] ul { + list-style: none; + margin: 0; + padding-inline-start: 0; + } +section[data-pane="filters"] .hostnames > li.hostname > div { + background-color: var(--surface-2); + padding-inline-start: 0.5em; + } +section[data-pane="filters"] ul ul { + padding-block-end: 1em; + padding-inline-start: 0.5em; + } +section[data-pane="filters"] li > div { + display: flex; + padding-block: 4px; + } +section[data-pane="filters"] li [contenteditable] { + flex-grow: 1; + word-break: break-all; + } +section[data-pane="filters"] li [contenteditable]:focus { + background-color: var(--surface-0); + } +section[data-pane="filters"] li .fa-icon { + align-self: baseline; + font-size: calc(var(--font-size) + 2px); + padding: 0 0.5em; + top: 2px; + } +section[data-pane="filters"] li.selector:not(:first-of-type) { + border-top: 1px dotted var(--border-1); + } +section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div [contenteditable], +section[data-pane="filters"] li.selector.removed [contenteditable] { + color: red; + text-decoration-line: line-through; + } +section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div span.remove, +section[data-pane="filters"] li.selector.removed > div span.remove, +section[data-pane="filters"] li.hostname:has(li.selector:not(.removed)) > div span.undo, +section[data-pane="filters"] li.selector:not(.removed) > div span.undo { display: none; } +html.desktop section[data-pane="filters"] li > div:hover { + background-color: var(--surface-0); + } +html.desktop section[data-pane="filters"] li > div span.fa-icon:hover { + transform: scale(1.3); + } +section[data-pane="filters"] aside { + padding: 1em 0.5em; + } +section[data-pane="filters"] aside details { + padding: 0; + } +section[data-pane="filters"] aside summary { + cursor: default; + line-height: 2; + } +section[data-pane="filters"] aside .importFromText { + color: var(--ink-2); + } +section[data-pane="filters"] aside .importFromText textarea { + background-color: var(--surface-1); + border: 1px solid var(--border-1); + box-sizing: border-box; + min-height: 6em; + resize: vertical; + width: 100%; + } +section[data-pane="filters"] aside .importFromText textarea:focus { + background-color: var(--surface-0); + } +section[data-pane="filters"] aside .importFromText:has(textarea:placeholder-shown) button:has([data-i18n="addButton"]) { + display: none; + } +section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder-shown)) button:has([data-i18n="importAndAppendButton"]), +section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder-shown)) button:has([data-i18n="exportButton"]) { + display: none; + } +section[data-pane="filters"] aside p { + display: flex; + flex-wrap: wrap; + gap: 1em; + } + +@media (max-width: 480px) { + #defaultFilteringMode { + grid: 1fr 1fr 1fr / auto-flow dense; + } + .filteringModeCard > div:nth-of-type(2) { + justify-content: flex-start; + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/strictblock.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/strictblock.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/strictblock.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/strictblock.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,158 @@ +/** + uBlock Origin - a browser extension to block requests. + Copyright (C) 2018-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +body { + display: flex; + padding: var(--default-gap-xxlarge) var(--default-gap-small); + justify-content: center; + } +:root.mobile body { + padding: var(--default-gap-small); + } +body.loading { + visibility: hidden; + } + +#rootContainer { + width: min(100%, 640px); + } +#rootContainer > * { + margin: 0 0 var(--default-gap-xxlarge) 0; + } +:root.mobile #rootContainer > * { + margin-bottom: var(--default-gap-xlarge); + } + +p { + margin: 0.5em 0; + } +a { + text-decoration: none; + } +q { + font-weight: bold; + } +.code { + font-size: var(--font-size-smaller); + word-break: break-all; + } +#warningSign { + color: var(--accent-surface-1); + fill: var(--accent-surface-1); + font-size: 96px; + line-height: 1; + width: 100%; + } +:root.mobile #warningSign { + font-size: 64px; + } +#theURL { + color: var(--ink-2); + padding: 0; + } +#theURL > * { + margin: 0; + } +#theURL > p { + position: relative; + z-index: 10; + } +#theURL > p > span:first-of-type { + display: block; + max-height: 6lh; + overflow-y: auto; + } +:root.mobile #theURL > p > span:first-of-type { + max-height: 3lh; + } +#theURL #toggleParse { + background-color: transparent; + top: 100%; + box-sizing: border-box; + color: var(--ink-3); + fill: var(--ink-3); + cursor: pointer; + font-size: 1.2rem; + padding: var(--default-gap-xxsmall); + position: absolute; + transform: translate(0, -50%); + } +#theURL:not(.collapsed) #toggleParse > span:first-of-type { + display: none; + } +#theURL.collapsed #toggleParse > span:last-of-type { + display: none; + } +body[dir="ltr"] #toggleParse { + right: 0; + } +body[dir="rtl"] #toggleParse { + left: 0; + } +#theURL > p:hover #toggleParse { + transform: translate(0, -50%) scale(1.15); + } +#parsed { + background-color: var(--surface-1); + border: 4px solid var(--surface-2); + font-size: small; + overflow-x: auto; + padding: var(--default-gap-xxsmall); + text-align: initial; + text-overflow: ellipsis; + } +#theURL.collapsed > #parsed { + display: none; + } +#parsed ul, #parsed li { + list-style-type: none; + } +#parsed li { + white-space: nowrap; + } +#parsed span { + display: inline-block; + } +#parsed span:first-of-type { + font-weight: bold; + } + +#urlskip a { + display: block; + overflow-y: auto; + } + +#actionContainer { + display: flex; + justify-content: space-between; + } +:root.mobile #actionContainer { + justify-content: center; + display: flex; + flex-direction: column; + } +#actionContainer > button { + margin-bottom: 2rem + } + +/* Small-screen devices */ +:root.mobile button { + width: 100%; + } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,99 @@ +:root { + --ubol-overlay-fill: rgba(255,255,255,0.2); + --ubol-overlay-border: #FFF; + --ubol-overlay-canvas: rgba(128,128,128,0.3); +} +:root.dark aside { + color-scheme: dark; +} + +:root, +:root > body { + background: transparent; + height: 100vh; + height: 100svh; + margin: 0; + overflow: hidden; + width: 100vw; +} +:root > body.loading { + visibility: hidden; +} + +:root :focus { + outline: none; +} + +svg#overlay { + cursor: crosshair; + box-sizing: border-box; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +svg#overlay > path:first-child { + fill: var(--ubol-overlay-canvas); + fill-rule: evenodd; +} +svg#overlay > path + path { + stroke: var(--ubol-overlay-border); + stroke-width: 1.5px; + fill: var(--ubol-overlay-fill); +} + +:root aside { + box-sizing: border-box; + cursor: default; + display: flex; + flex-direction: column; + position: fixed; + z-index: 100; +} +:root body[dir="rtl"] aside { + left: 2px; + right: unset; +} + +:root.minimized aside > section:not(#windowbar) { + display: none !important; +} +:root.minimized aside { + min-width: min(12em, 100vw - 4px); + width: min(12em, 100vw - 4px); +} + +:root aside #windowbar { + border-bottom: 1px solid var(--border-1); + display: flex; +} +:root aside #windowbar > div { + fill: none; + height: 2em; + stroke: var(--ink-1); + stroke-width: 2px; + width: 2em; +} +:root.minimized aside #windowbar > div { + height: 3em; + width: 3em; +} +:root.minimized aside #windowbar > #minimize svg > path, +#windowbar #minimize svg > rect { + display: none; +} +:root.minimized aside #windowbar > #minimize svg > rect { + display: initial; +} +:root #windowbar > #move { + align-items: center; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAFElEQVQI12NgwAfKy8v/M5ANYLoBshgEyQo6H9UAAAAASUVORK5CYII='); + cursor: grab; + display: flex; + justify-content: center; + flex-grow: 1; +} +:root #windowbar > div:hover { + background-color: var(--surface-2) +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/unpicker-ui.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/unpicker-ui.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/unpicker-ui.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/unpicker-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,64 @@ +:root#ubol-unpicker { + --ubol-overlay-fill: rgba(64,255,64,0.10); + --ubol-overlay-border: #0F0; +} + +#ubol-unpicker svg#overlay { + cursor: not-allowed; +} + +:root aside { + background-color: var(--surface-1); + border: 1px solid var(--border-2); + max-height: 40vh; + max-width: min(32rem, 100vw - 4px); + min-width: min(24rem, 100vw - 4px); + width: min(32rem, 100vw - 4px); +} + +#ubol-unpicker aside > section:not(#windowbar) { + margin: 1em 1em 0 1em; +} +#ubol-unpicker aside > section:not(#windowbar):last-of-type { + margin-bottom: 1em; +} +#ubol-unpicker aside > section [data-i18n="unpickerUsage"] { + color: var(--ink-2); + font-size: small; +} + +#ubol-unpicker #customFilters { + font-family: monospace; + overflow: auto; +} +#ubol-unpicker .customFilter { + display: flex; +} +#ubol-unpicker .customFilter:nth-of-type(2n+1) { + background-color: var(--surface-2); +} +#ubol-unpicker .customFilter > span.selector { + flex-grow: 1; + font-size: small; + padding: 0.5em; +} +#ubol-unpicker .customFilter.on > span.selector { + background-color: var(--accent-surface-1); + color: var(--accent-ink-1); +} +#ubol-unpicker .customFilter.removed > span.remove { + display: none; +} +#ubol-unpicker .customFilter.removed > span.selector { + color: red; + pointer-events: none; + text-decoration-line: line-through; +} +#ubol-unpicker .customFilter > span.fa-icon { + flex-shrink: 0; + font-size: 1.25em; + padding: 0 0.5em; +} +#ubol-unpicker .customFilter:not(.removed) > span.undo { + display: none; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/zapper-ui.css ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/zapper-ui.css --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/css/zapper-ui.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/zapper-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,29 @@ +:root#ubol-zapper { + --quit-button-size: max(4em, min(6em, calc(100vw / 8), calc(100vh / 8))); + --ubol-overlay-fill: rgba(255,255,63,0.10); + --ubol-overlay-border: #FF0; +} + +#ubol-zapper aside { + gap: 2px; + right: 2px; + top: 50%; + transform: translateY(-50%); +} + +#ubol-zapper aside > div { + background-color: var(--surface-1); + border: 1px solid rgba(0,0,0,0.5); + box-sizing: border-box; + fill: none; + stroke: var(--ink-1); + stroke-width: 2px; + width: var(--quit-button-size); + height: var(--quit-button-size); +} +#ubol-zapper aside > div:hover { + background-color: var(--surface-2) +} +:root:not(.mobile) #pick { + display: none; +} \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/dashboard.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/dashboard.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/dashboard.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/dashboard.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,36 +3,250 @@ + - + + + + + + + - + + +
+ + +
+

spinner

+

+

+
+
+ +
+
+

+

+
+ + + +
+
+
+

+

+

+

+

+

+

+
+

_

+

_

+

+ + +

+
+
-
- -
+
+
+
+ +
+
    + +
    -
    +
    -   -   - +

    +   +

    +
    -
    - +
    +
    +
    +
    +
    Copyright (c) Raymond Hill 2014-present
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    
    +            
    +
    +
    + + + + + + + + + + + + + + + + Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/img/icon_128_off.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_128_off.png differ Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/img/icon_16_off.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_16_off.png differ Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/img/icon_32_off.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_32_off.png differ Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/img/icon_512.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_512.png differ Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/platform/mv3/extension/img/icon_64_off.png and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_64_off.png differ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/about.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/about.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/about.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/about.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -'use strict'; - -import { runtime } from './ext.js'; -import { dom } from './dom.js'; - -/******************************************************************************/ - -(async ( ) => { - const manifest = runtime.getManifest(); - - dom.text('#aboutNameVer', `${manifest.name} ${manifest.version}`); -})(); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/action.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/action.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/action.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/action.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,110 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { matchesFromHostnames, strArrayEq } from './utils.js'; +import { browser } from './ext.js'; + +/******************************************************************************/ + +let reverseMode = false; + +/******************************************************************************/ + +function disableToolbarIcon(tabId) { + const details = { + path: { + '16': '/img/icon_16_off.png', + '32': '/img/icon_32_off.png', + '64': '/img/icon_64_off.png', + '128': '/img/icon_128_off.png', + } + }; + if ( tabId !== undefined ) { + details.tabId = tabId; + } + browser.action.setIcon(details); +} + +function enableToolbarIcon(tabId) { + const details = { + path: { + '16': '/img/icon_16.png', + '32': '/img/icon_32.png', + '64': '/img/icon_64.png', + '128': '/img/icon_128.png', + } + }; + if ( tabId !== undefined ) { + details.tabId = tabId; + } + browser.action.setIcon(details); +} + +/******************************************************************************/ + +export function toggleToolbarIcon(tabId) { + if ( reverseMode ) { + enableToolbarIcon(tabId); + } else { + disableToolbarIcon(tabId); + } +} + +/******************************************************************************/ + +// https://github.com/uBlockOrigin/uBOL-home/issues/198 +// Ensure the toolbar icon reflects the no-filtering mode of "trusted sites" + +export async function registerToolbarIconToggler(context) { + const { none, basic, optimal, complete } = context.filteringModeDetails; + const reverseModeAfter = none.delete('all-urls'); + const toToggle = reverseModeAfter ? + new Set([ ...basic, ...optimal, ...complete ]) + : none; + + if ( reverseModeAfter !== reverseMode ) { + if ( reverseModeAfter ) { + disableToolbarIcon(); + } else { + enableToolbarIcon(); + } + reverseMode = reverseModeAfter; + } + + if ( toToggle.size === 0 ) { return; } + + const registered = context.before.get('toolbar-icon'); + context.before.delete('toolbar-icon'); // Important! + + const directive = { + id: 'toolbar-icon', + js: [ '/js/scripting/toolbar-icon.js' ], + matches: matchesFromHostnames(toToggle), + runAt: 'document_start', + }; + + if ( registered === undefined ) { + context.toAdd.push(directive); + } else if ( strArrayEq(registered.matches, directive.matches) === false ) { + context.toRemove.push('toolbar-icon'); + context.toAdd.push(directive); + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/admin.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/admin.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/admin.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/admin.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,215 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + adminRead, + localRead, localRemove, localWrite, + sessionRead, sessionWrite, +} from './ext.js'; + +import { + enableRulesets, + getRulesetDetails, + setStrictBlockMode, +} from './ruleset-manager.js'; + +import { + getDefaultFilteringMode, + readFilteringModeDetails, +} from './mode-manager.js'; + +import { + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + +import { broadcastMessage } from './utils.js'; +import { dnr } from './ext-compat.js'; +import { registerInjectables } from './scripting-manager.js'; +import { ubolLog } from './debug.js'; + +/******************************************************************************/ + +export async function loadAdminConfig() { + const [ + showBlockedCount, + strictBlockMode, + ] = await Promise.all([ + adminReadEx('showBlockedCount'), + adminReadEx('strictBlockMode'), + ]); + applyAdminConfig({ showBlockedCount, strictBlockMode }); +} + +/******************************************************************************/ + +function applyAdminConfig(config, apply = false) { + const toApply = []; + for ( const [ key, val ] of Object.entries(config) ) { + if ( typeof val !== typeof rulesetConfig[key] ) { continue; } + if ( val === rulesetConfig[key] ) { continue; } + rulesetConfig[key] = val; + toApply.push(key); + } + if ( toApply.length === 0 ) { return; } + saveRulesetConfig(); + if ( apply !== true ) { return; } + while ( toApply.length !== 0 ) { + const key = toApply.pop(); + switch ( key ) { + case 'showBlockedCount': { + if ( typeof dnr.setExtensionActionOptions !== 'function' ) { break; } + const { showBlockedCount } = config; + dnr.setExtensionActionOptions({ + displayActionCountAsBadgeText: showBlockedCount, + }); + broadcastMessage({ showBlockedCount }); + break; + } + case 'strictBlockMode': { + const { strictBlockMode } = config; + setStrictBlockMode(strictBlockMode, true).then(( ) => { + broadcastMessage({ strictBlockMode }); + }); + break; + } + default: + break; + } + } +} + +/******************************************************************************/ + +const adminSettings = { + keys: new Map(), + timer: undefined, + change(key, value) { + this.keys.set(key, value); + if ( this.timer !== undefined ) { return; } + this.timer = self.setTimeout(( ) => { + this.timer = undefined; + this.process(); + }, 127); + }, + async process() { + if ( this.keys.has('rulesets') ) { + ubolLog('admin setting "rulesets" changed'); + await enableRulesets(rulesetConfig.enabledRulesets); + await registerInjectables(); + const results = await Promise.all([ + getAdminRulesets(), + dnr.getEnabledRulesets(), + ]); + const [ adminRulesets, enabledRulesets ] = results; + broadcastMessage({ adminRulesets, enabledRulesets }); + } + if ( this.keys.has('defaultFiltering') ) { + ubolLog('admin setting "defaultFiltering" changed'); + await readFilteringModeDetails(true); + await registerInjectables(); + const defaultFilteringMode = await getDefaultFilteringMode(); + broadcastMessage({ defaultFilteringMode }); + } + if ( this.keys.has('noFiltering') ) { + ubolLog('admin setting "noFiltering" changed'); + const filteringModeDetails = await readFilteringModeDetails(true); + broadcastMessage({ filteringModeDetails }); + } + if ( this.keys.has('showBlockedCount') ) { + ubolLog('admin setting "showBlockedCount" changed'); + const showBlockedCount = this.keys.get('showBlockedCount'); + applyAdminConfig({ showBlockedCount }, true); + } + if ( this.keys.has('strictBlockMode') ) { + ubolLog('admin setting "strictBlockMode" changed'); + const strictBlockMode = this.keys.get('strictBlockMode'); + applyAdminConfig({ strictBlockMode }, true); + } + this.keys.clear(); + } +}; + +/******************************************************************************/ + +export async function getAdminRulesets() { + const [ + adminList, + rulesetDetails, + ] = await Promise.all([ + adminReadEx('rulesets'), + getRulesetDetails(), + ]); + const adminRulesets = new Set(Array.isArray(adminList) && adminList || []); + if ( adminRulesets.has('-default') ) { + adminRulesets.delete('-default'); + for ( const ruleset of rulesetDetails.values() ) { + if ( ruleset.enabled !== true ) { continue; } + if ( adminRulesets.has(`+${ruleset.id}`) ) { continue; } + adminRulesets.add(`-${ruleset.id}`); + } + } + if ( adminRulesets.has('+default') ) { + adminRulesets.delete('+default'); + for ( const ruleset of rulesetDetails.values() ) { + if ( ruleset.enabled !== true ) { continue; } + if ( adminRulesets.has(`-${ruleset.id}`) ) { continue; } + adminRulesets.add(`+${ruleset.id}`); + } + } + if ( adminRulesets.has('-*') ) { + adminRulesets.delete('-*'); + for ( const ruleset of rulesetDetails.values() ) { + if ( ruleset.enabled ) { continue; } + if ( adminRulesets.has(`+${ruleset.id}`) ) { continue; } + adminRulesets.add(`-${ruleset.id}`); + } + } + return Array.from(adminRulesets); +} + +/******************************************************************************/ + +export async function adminReadEx(key) { + let cacheValue; + const session = await sessionRead(`admin.${key}`); + if ( session ) { + cacheValue = session.data; + } else { + const local = await localRead(`admin.${key}`); + if ( local ) { + cacheValue = local.data; + } + localRemove(`admin_${key}`); // TODO: remove eventually + } + adminRead(key).then(async value => { + const adminKey = `admin.${key}`; + await Promise.all([ + sessionWrite(adminKey, { data: value }), + localWrite(adminKey, { data: value }), + ]); + if ( JSON.stringify(value) === JSON.stringify(cacheValue) ) { return; } + adminSettings.change(key, value); + }); + return cacheValue; +} + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/background.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/background.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/background.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/background.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,50 +19,94 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ +import { + MODE_BASIC, + MODE_OPTIMAL, + defaultFilteringModes, + getDefaultFilteringMode, + getFilteringMode, + getFilteringModeDetails, + setDefaultFilteringMode, + setFilteringMode, + setFilteringModeDetails, + syncWithBrowserPermissions, +} from './mode-manager.js'; -'use strict'; +import { + addCustomFilters, + customFiltersFromHostname, + getAllCustomFilters, + hasCustomFilters, + injectCustomFilters, + removeAllCustomFilters, + removeCustomFilters, + startCustomFilters, + terminateCustomFilters, +} from './filter-manager.js'; -/******************************************************************************/ +import { + adminReadEx, + getAdminRulesets, + loadAdminConfig, +} from './admin.js'; + +import { + broadcastMessage, + gotoURL, + hasBroadHostPermissions, + hostnamesFromMatches, +} from './utils.js'; import { browser, - dnr, + localRead, localRemove, localWrite, runtime, + webextFlavor, } from './ext.js'; import { - CURRENT_CONFIG_BASE_RULE_ID, - getRulesetDetails, - getDynamicRules, - defaultRulesetsFromLanguage, + defaultConfig, + loadRulesetConfig, + process, + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + +import { enableRulesets, - getEnabledRulesetsDetails, + excludeFromStrictBlock, + getDefaultRulesetsFromEnv, + getEffectiveDynamicRules, + getEffectiveSessionRules, + getEffectiveUserRules, + getRulesetDetails, + patchDefaultRulesets, + setStrictBlockMode, updateDynamicRules, + updateSessionRules, + updateUserRules, } from './ruleset-manager.js'; import { - registerInjectables, -} from './scripting-manager.js'; - -import { - getFilteringMode, - setFilteringMode, - getDefaultFilteringMode, - setDefaultFilteringMode, - syncWithBrowserPermissions, -} from './mode-manager.js'; + getConsoleOutput, + getMatchedRules, + isSideloaded, + toggleDeveloperMode, + ubolErr, + ubolLog, +} from './debug.js'; + +import { dnr } from './ext-compat.js'; +import { registerInjectables } from './scripting-manager.js'; +import { toggleToolbarIcon } from './action.js'; /******************************************************************************/ -const rulesetConfig = { - version: '', - enabledRulesets: [ 'default' ], - autoReload: 1, - firstRun: false, -}; +const UBOL_ORIGIN = runtime.getURL('').replace(/\/$/, '').toLowerCase(); + +const canShowBlockedCount = typeof dnr.setExtensionActionOptions === 'function'; -const UBOL_ORIGIN = runtime.getURL('').replace(/\/$/, ''); +let pendingPermissionRequest; /******************************************************************************/ @@ -70,163 +114,284 @@ return runtime.getManifest().version; } -async function loadRulesetConfig() { - const dynamicRuleMap = await getDynamicRules(); - const configRule = dynamicRuleMap.get(CURRENT_CONFIG_BASE_RULE_ID); - if ( configRule === undefined ) { - rulesetConfig.enabledRulesets = await defaultRulesetsFromLanguage(); - rulesetConfig.firstRun = true; - return; - } - let rawConfig; - try { - rawConfig = JSON.parse(self.atob(configRule.condition.urlFilter)); - } catch(ex) { - } - - // New format - if ( Array.isArray(rawConfig) ) { - rulesetConfig.version = rawConfig[0]; - rulesetConfig.enabledRulesets = rawConfig[1]; - rulesetConfig.autoReload = rawConfig[2]; - return; - } - - // Legacy format. TODO: remove when next new format is widely in use. - const match = /^\|\|(?:example|ubolite)\.invalid\/([^\/]+)\/(?:([^\/]+)\/)?/.exec( - configRule.condition.urlFilter - ); - if ( match === null ) { return; } - rulesetConfig.version = match[1]; - if ( match[2] ) { - rulesetConfig.enabledRulesets = - decodeURIComponent(match[2] || '').split(' '); - } -} - -async function saveRulesetConfig() { - const dynamicRuleMap = await getDynamicRules(); - let configRule = dynamicRuleMap.get(CURRENT_CONFIG_BASE_RULE_ID); - if ( configRule === undefined ) { - configRule = { - id: CURRENT_CONFIG_BASE_RULE_ID, - action: { - type: 'allow', - }, - condition: { - urlFilter: '', - initiatorDomains: [ - 'ubolite.invalid', - ], - resourceTypes: [ - 'main_frame', - ], - }, - }; - } - const rawConfig = [ - rulesetConfig.version, - rulesetConfig.enabledRulesets, - rulesetConfig.autoReload, - ]; - const urlFilter = self.btoa(JSON.stringify(rawConfig)); - if ( urlFilter === configRule.condition.urlFilter ) { return; } - configRule.condition.urlFilter = urlFilter; - - return dnr.updateDynamicRules({ - addRules: [ configRule ], - removeRuleIds: [ CURRENT_CONFIG_BASE_RULE_ID ], - }); -} - /******************************************************************************/ -async function hasGreatPowers(origin) { - if ( /^https?:\/\//.test(origin) === false ) { return false; } - return browser.permissions.contains({ - origins: [ `${origin}/*` ], - }); +async function onPermissionsRemoved() { + const modified = await syncWithBrowserPermissions(); + if ( modified === false ) { return false; } + registerInjectables(); + return true; } -function hasOmnipotence() { - return browser.permissions.contains({ - origins: [ '' ], - }); +// https://github.com/uBlockOrigin/uBOL-home/issues/280 +async function onPermissionsAdded(permissions) { + const details = pendingPermissionRequest; + pendingPermissionRequest = undefined; + if ( details === undefined ) { + const modified = await syncWithBrowserPermissions(); + if ( modified === false ) { return; } + return Promise.all([ + updateSessionRules(), + registerInjectables(), + ]); + } + const defaultMode = await getDefaultFilteringMode(); + if ( defaultMode >= MODE_OPTIMAL ) { return; } + if ( Array.isArray(permissions.origins) === false ) { return; } + const hostnames = hostnamesFromMatches(permissions.origins); + if ( hostnames.includes(details.hostname) === false ) { return; } + const beforeLevel = await getFilteringMode(details.hostname); + if ( beforeLevel === details.afterLevel ) { return; } + const afterLevel = await setFilteringMode(details.hostname, details.afterLevel); + if ( afterLevel !== details.afterLevel ) { return; } + await registerInjectables(); + if ( rulesetConfig.autoReload ) { + self.setTimeout(( ) => { + browser.tabs.update(details.tabId, { + url: details.url, + }); + }, 437); + } } -async function onPermissionsRemoved() { - const beforeMode = await getDefaultFilteringMode(); - const modified = await syncWithBrowserPermissions(); - if ( modified === false ) { return; } - const afterMode = await getDefaultFilteringMode(); - if ( beforeMode > 1 && afterMode <= 1 ) { - updateDynamicRules(); - } - registerInjectables(); +/******************************************************************************/ + +function setDeveloperMode(state) { + rulesetConfig.developerMode = state === true; + toggleDeveloperMode(rulesetConfig.developerMode); + broadcastMessage({ developerMode: rulesetConfig.developerMode }); + return Promise.all([ + updateUserRules(), + saveRulesetConfig(), + ]); } /******************************************************************************/ function onMessage(request, sender, callback) { - if ( sender.origin !== UBOL_ORIGIN ) { return; } + const tabId = sender?.tab?.id ?? false; + const frameId = tabId && (sender?.frameId ?? false); + + // Does not require trusted origin. switch ( request.what ) { - case 'applyRulesets': { - enableRulesets(request.enabledRulesets).then(( ) => { - rulesetConfig.enabledRulesets = request.enabledRulesets; - return saveRulesetConfig(); + case 'insertCSS': { + if ( frameId === false ) { return false; } + // https://bugs.webkit.org/show_bug.cgi?id=262491 + if ( frameId !== 0 && webextFlavor === 'safari' ) { return false; } + browser.scripting.insertCSS({ + css: request.css, + origin: 'USER', + target: { tabId, frameIds: [ frameId ] }, + }).catch(reason => { + ubolErr(`insertCSS/${reason}`); + }); + return false; + } + + case 'removeCSS': { + if ( frameId === false ) { return false; } + browser.scripting.removeCSS({ + css: request.css, + origin: 'USER', + target: { tabId, frameIds: [ frameId ] }, + }).catch(reason => { + ubolErr(`removeCSS/${reason}`); + }); + return false; + } + + case 'toggleToolbarIcon': { + if ( tabId ) { + toggleToolbarIcon(tabId); + } + return false; + } + + case 'startCustomFilters': + if ( frameId === false ) { return false; } + startCustomFilters(tabId, frameId).then(( ) => { + callback(); + }); + return true; + + case 'terminateCustomFilters': + if ( frameId === false ) { return false; } + terminateCustomFilters(tabId, frameId).then(( ) => { + callback(); + }); + return true; + + case 'injectCustomFilters': + if ( frameId === false ) { return false; } + injectCustomFilters(tabId, frameId, request.hostname).then(selectors => { + callback(selectors); + }); + return true; + + case 'injectCSSProceduralAPI': + browser.scripting.executeScript({ + files: [ '/js/scripting/css-procedural-api.js' ], + target: { tabId, frameIds: [ frameId ] }, + injectImmediately: true, + }).catch(reason => { + ubolErr(`executeScript/${reason}`); }).then(( ) => { - registerInjectables(); callback(); }); return true; + + default: + break; + } + + // Does require trusted origin. + + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/MessageSender + // Firefox API does not set `sender.origin` + if ( sender.origin !== undefined ) { + if ( sender.origin.toLowerCase() !== UBOL_ORIGIN ) { return; } + } + + switch ( request.what ) { + + case 'applyRulesets': { + enableRulesets(request.enabledRulesets).then(result => { + if ( result === undefined || result.error ) { + callback(result); + return; + } + rulesetConfig.enabledRulesets = result.enabledRulesets; + return saveRulesetConfig().then(( ) => { + return registerInjectables(); + }).then(( ) => { + callback(result); + }); + }).finally(( ) => { + broadcastMessage({ enabledRulesets: rulesetConfig.enabledRulesets }); + }); + return true; } - case 'getOptionsPageData': { + case 'getDefaultConfig': + getDefaultRulesetsFromEnv().then(rulesets => { + callback({ + autoReload: defaultConfig.autoReload, + developerMode: defaultConfig.developerMode, + showBlockedCount: defaultConfig.showBlockedCount, + strictBlockMode: defaultConfig.strictBlockMode, + rulesets, + filteringModes: Object.assign(defaultFilteringModes), + }); + }); + return true; + + case 'getOptionsPageData': Promise.all([ + hasBroadHostPermissions(), getDefaultFilteringMode(), getRulesetDetails(), dnr.getEnabledRulesets(), + getAdminRulesets(), + adminReadEx('disabledFeatures'), ]).then(results => { const [ + hasOmnipotence, defaultFilteringMode, rulesetDetails, enabledRulesets, + adminRulesets, + disabledFeatures, ] = results; callback({ + hasOmnipotence, defaultFilteringMode, enabledRulesets, + adminRulesets, + maxNumberOfEnabledRulesets: dnr.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS, rulesetDetails: Array.from(rulesetDetails.values()), - autoReload: rulesetConfig.autoReload === 1, - firstRun: rulesetConfig.firstRun, + autoReload: rulesetConfig.autoReload, + showBlockedCount: rulesetConfig.showBlockedCount, + canShowBlockedCount, + strictBlockMode: rulesetConfig.strictBlockMode, + firstRun: process.firstRun, + isSideloaded, + developerMode: rulesetConfig.developerMode, + disabledFeatures, }); - rulesetConfig.firstRun = false; + process.firstRun = false; + }); + return true; + + case 'getEnabledRulesets': + dnr.getEnabledRulesets().then(rulesets => { + callback(rulesets); + }); + return true; + + case 'getRulesetDetails': + getRulesetDetails().then(rulesetDetails => { + callback(Array.from(rulesetDetails.values())); + }); + return true; + + case 'hasBroadHostPermissions': + hasBroadHostPermissions().then(result => { + callback(result); }); return true; - } case 'setAutoReload': - rulesetConfig.autoReload = request.state ? 1 : 0; + rulesetConfig.autoReload = request.state && true || false; saveRulesetConfig().then(( ) => { callback(); + broadcastMessage({ autoReload: rulesetConfig.autoReload }); + }); + return true; + + case 'setShowBlockedCount': + rulesetConfig.showBlockedCount = request.state && true || false; + if ( canShowBlockedCount ) { + dnr.setExtensionActionOptions({ + displayActionCountAsBadgeText: rulesetConfig.showBlockedCount, + }); + } + saveRulesetConfig().then(( ) => { + callback(); + broadcastMessage({ showBlockedCount: rulesetConfig.showBlockedCount }); + }); + return true; + + case 'setStrictBlockMode': + setStrictBlockMode(request.state).then(( ) => { + callback(); + broadcastMessage({ strictBlockMode: rulesetConfig.strictBlockMode }); + }); + return true; + + case 'setDeveloperMode': + setDeveloperMode(request.state).then(( ) => { + callback(); }); return true; case 'popupPanelData': { Promise.all([ + hasBroadHostPermissions(), getFilteringMode(request.hostname), - hasOmnipotence(), - hasGreatPowers(request.origin), - getEnabledRulesetsDetails(), + adminReadEx('disabledFeatures'), + hasCustomFilters(request.hostname), ]).then(results => { callback({ - level: results[0], - autoReload: rulesetConfig.autoReload === 1, - hasOmnipotence: results[1], - hasGreatPowers: results[2], - rulesetDetails: results[3], + hasOmnipotence: results[0], + level: results[1], + autoReload: rulesetConfig.autoReload, + isSideloaded, + developerMode: rulesetConfig.developerMode, + disabledFeatures: results[2], + hasCustomFilters: results[3], }); }); return true; @@ -239,84 +404,312 @@ return true; } + case 'gotoURL': + gotoURL(request.url, request.type); + break; + case 'setFilteringMode': { - getFilteringMode(request.hostname).then(actualLevel => { - if ( request.level === actualLevel ) { return actualLevel; } + getFilteringMode(request.hostname).then(beforeLevel => { + if ( request.level === beforeLevel ) { return beforeLevel; } return setFilteringMode(request.hostname, request.level); - }).then(actualLevel => { + }).then(afterLevel => { registerInjectables(); - callback(actualLevel); + callback(afterLevel); + }); + return true; + } + + case 'setPendingFilteringMode': + pendingPermissionRequest = request; + break; + + case 'getDefaultFilteringMode': { + getDefaultFilteringMode().then(level => { + callback(level); }); return true; } - case 'setDefaultFilteringMode': { - getDefaultFilteringMode( - ).then(beforeLevel => + case 'setDefaultFilteringMode': + getDefaultFilteringMode().then(beforeLevel => setDefaultFilteringMode(request.level).then(afterLevel => ({ beforeLevel, afterLevel }) ) ).then(({ beforeLevel, afterLevel }) => { - if ( beforeLevel === 1 || afterLevel === 1 ) { - updateDynamicRules(); - } if ( afterLevel !== beforeLevel ) { registerInjectables(); } callback(afterLevel); }); return true; + + case 'getFilteringModeDetails': + getFilteringModeDetails(true).then(details => { + callback(details); + }); + return true; + + case 'setFilteringModeDetails': + setFilteringModeDetails(request.modes).then(( ) => { + registerInjectables(); + getDefaultFilteringMode().then(defaultFilteringMode => { + broadcastMessage({ defaultFilteringMode }); + }); + getFilteringModeDetails(true).then(details => { + callback(details); + }); + }); + return true; + + case 'excludeFromStrictBlock': { + excludeFromStrictBlock(request.hostname, request.permanent).then(( ) => { + callback(); + }); + return true; } + case 'getMatchedRules': + getMatchedRules(request.tabId).then(entries => { + callback(entries); + }); + return true; + + case 'showMatchedRules': + browser.windows.create({ + type: 'popup', + url: `/matched-rules.html?tab=${request.tabId}`, + }); + break; + + case 'getEffectiveDynamicRules': + getEffectiveDynamicRules().then(result => { + callback(result); + }); + return true; + + case 'getEffectiveSessionRules': + getEffectiveSessionRules().then(result => { + callback(result); + }); + return true; + + case 'getEffectiveUserRules': + getEffectiveUserRules().then(result => { + callback(result); + }); + return true; + + case 'updateUserDnrRules': + updateUserRules().then(result => { + callback(result); + }); + return true; + + case 'addCustomFilters': + addCustomFilters(request.hostname, request.selectors).then(modified => { + if ( modified !== true ) { return; } + return registerInjectables(); + }).then(( ) => { + callback(); + }) + return true; + + case 'removeCustomFilters': + removeCustomFilters(request.hostname, request.selectors).then(modified => { + if ( modified !== true ) { return; } + return registerInjectables(); + }).then(( ) => { + callback(); + }); + return true; + + case 'removeAllCustomFilters': + removeAllCustomFilters(request.hostname).then(modified => { + if ( modified !== true ) { return; } + return registerInjectables(); + }).then(( ) => { + callback(); + }); + return true; + + case 'customFiltersFromHostname': + customFiltersFromHostname(request.hostname).then(selectors => { + callback(selectors); + }); + return true; + + case 'getAllCustomFilters': + getAllCustomFilters().then(data => { + callback(data); + }); + return true; + + case 'getConsoleOutput': + callback(getConsoleOutput()); + break; + default: break; } + + return false; } /******************************************************************************/ -async function start() { - await loadRulesetConfig(); - await enableRulesets(rulesetConfig.enabledRulesets); +function onCommand(command, tab) { + switch ( command ) { + case 'enter-zapper-mode': { + if ( browser.scripting === undefined ) { return; } + browser.scripting.executeScript({ + files: [ '/js/scripting/tool-overlay.js', '/js/scripting/zapper.js' ], + target: { tabId: tab.id }, + }); + break; + } + case 'enter-picker-mode': { + if ( browser.scripting === undefined ) { return; } + browser.scripting.executeScript({ + files: [ + '/js/scripting/css-procedural-api.js', + '/js/scripting/tool-overlay.js', + '/js/scripting/picker.js', + ], + target: { tabId: tab.id }, + }); + break; + } + default: + break; + } +} - // We need to update the regex rules only when ruleset version changes. +/******************************************************************************/ + +async function startSession() { const currentVersion = getCurrentVersion(); - if ( currentVersion !== rulesetConfig.version ) { - console.log(`Version change: ${rulesetConfig.version} => ${currentVersion}`); - updateDynamicRules().then(( ) => { - rulesetConfig.version = currentVersion; - saveRulesetConfig(); - }); + const isNewVersion = currentVersion !== rulesetConfig.version; + + // Admin settings override user settings + await loadAdminConfig(); + + // The default rulesets may have changed, find out new ruleset to enable, + // obsolete ruleset to remove. + if ( isNewVersion ) { + ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); + rulesetConfig.version = currentVersion; + await patchDefaultRulesets(); + saveRulesetConfig(); + } + + const rulesetsUpdated = await enableRulesets(rulesetConfig.enabledRulesets); + + // We need to update the regex rules only when ruleset version changes. + if ( rulesetsUpdated === undefined ) { + if ( isNewVersion ) { + updateDynamicRules(); + } else { + updateSessionRules(); + } } // Permissions may have been removed while the extension was disabled - await onPermissionsRemoved(); + await syncWithBrowserPermissions(); // Unsure whether the browser remembers correctly registered css/scripts // after we quit the browser. For now uBOL will check unconditionally at // launch time whether content css/scripts are properly registered. registerInjectables(); - const enabledRulesets = await dnr.getEnabledRulesets(); - console.log(`Enabled rulesets: ${enabledRulesets}`); + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest + // Firefox API does not support `dnr.setExtensionActionOptions` + if ( canShowBlockedCount ) { + dnr.setExtensionActionOptions({ + displayActionCountAsBadgeText: rulesetConfig.showBlockedCount, + }); + } + + // Switch to basic filtering if uBOL doesn't have broad permissions at + // install time. + if ( process.firstRun ) { + const enableOptimal = await hasBroadHostPermissions(); + if ( enableOptimal === false ) { + const afterLevel = await setDefaultFilteringMode(MODE_BASIC); + if ( afterLevel === MODE_BASIC ) { + registerInjectables(); + process.firstRun = false; + } + } + } - dnr.getAvailableStaticRuleCount().then(count => { - console.log(`Available static rule count: ${count}`); + // Required to ensure up to date properties are available when needed + adminReadEx('disabledFeatures').then(items => { + if ( Array.isArray(items) === false ) { return; } + if ( items.includes('develop') ) { + if ( rulesetConfig.developerMode ) { + setDeveloperMode(false); + } + } }); +} - dnr.setExtensionActionOptions({ displayActionCountAsBadgeText: true }); +/******************************************************************************/ + +async function start() { + await loadRulesetConfig(); + + if ( process.wakeupRun === false ) { + await startSession(); + } + + toggleDeveloperMode(rulesetConfig.developerMode); } -(async ( ) => { - await start(); +/******************************************************************************/ - runtime.onMessage.addListener(onMessage); +// https://github.com/uBlockOrigin/uBOL-home/issues/199 +// Force a restart of the extension once when an "internal error" occurs - browser.permissions.onRemoved.addListener( - ( ) => { onPermissionsRemoved(); } - ); +const isFullyInitialized = start().then(( ) => { + localRemove('goodStart'); + return false; +}).catch(reason => { + ubolErr(reason); + if ( process.wakeupRun ) { return; } + return localRead('goodStart').then(goodStart => { + if ( goodStart === false ) { + localRemove('goodStart'); + return false; + } + return localWrite('goodStart', false).then(( ) => true); + }); +}).then(restart => { + if ( restart !== true ) { return; } + runtime.reload(); +}); + +runtime.onMessage.addListener((request, sender, callback) => { + isFullyInitialized.then(( ) => { + const r = onMessage(request, sender, callback); + if ( r !== true ) { callback(); } + }); + return true; +}); - if ( rulesetConfig.firstRun ) { - runtime.openOptionsPage(); - } -})(); +browser.permissions.onRemoved.addListener((...args) => { + isFullyInitialized.then(( ) => { + onPermissionsRemoved(...args); + }); +}); + +browser.permissions.onAdded.addListener((...args) => { + isFullyInitialized.then(( ) => { + onPermissionsAdded(...args); + }); +}); + +browser.commands.onCommand.addListener((...args) => { + isFullyInitialized.then(( ) => { + onCommand(...args); + }); +}); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/backup-restore.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/backup-restore.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/backup-restore.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/backup-restore.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,153 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + localRead, localRemove, localWrite, + runtime, + sendMessage, +} from './ext.js'; + +/******************************************************************************/ + +export async function backupToObject(currentConfig) { + const out = {}; + const manifest = runtime.getManifest(); + out.version = manifest.versionName ?? manifest.version; + const defaultConfig = await sendMessage({ what: 'getDefaultConfig' }); + if ( currentConfig.autoReload !== defaultConfig.autoReload ) { + out.autoReload = currentConfig.autoReload; + } + if ( currentConfig.developerMode !== defaultConfig.developerMode ) { + out.developerMode = currentConfig.developerMode; + } + if ( currentConfig.showBlockedCount !== defaultConfig.showBlockedCount ) { + out.showBlockedCount = currentConfig.showBlockedCount; + } + if ( currentConfig.strictBlockMode !== defaultConfig.strictBlockMode ) { + out.strictBlockMode = currentConfig.strictBlockMode; + } + const { enabledRulesets } = currentConfig; + const customRulesets = []; + for ( const id of enabledRulesets ) { + if ( defaultConfig.rulesets.includes(id) ) { continue; } + customRulesets.push(`+${id}`); + } + for ( const id of defaultConfig.rulesets ) { + if ( enabledRulesets.includes(id) ) { continue; } + customRulesets.push(`-${id}`); + } + if ( customRulesets.length !== 0 ) { + out.rulesets = customRulesets; + } + out.filteringModes = await sendMessage({ what: 'getFilteringModeDetails' }); + const customFilters = await sendMessage({ what: 'getAllCustomFilters' }); + const filters = []; + for ( const [ hostname, selectors ] of customFilters ) { + for ( const selector of selectors ) { + filters.push(`${hostname}##${selector}`); + } + } + if ( filters.length !== 0 ) { + out.cosmeticFilters = filters; + } + const dnrRules = await localRead('userDnrRules'); + if ( typeof dnrRules === 'string' && dnrRules.length !== 0 ) { + out.dnrRules = dnrRules.split(/\n+/); + } + return out; +} + +/******************************************************************************/ + +export async function restoreFromObject(targetConfig) { + const defaultConfig = await sendMessage({ what: 'getDefaultConfig' }); + + await sendMessage({ + what: 'setAutoReload', + state: targetConfig.autoReload ?? defaultConfig.autoReload + }); + + await sendMessage({ + what: 'setShowBlockedCount', + state: targetConfig.showBlockedCount ?? defaultConfig.showBlockedCount + }); + + await sendMessage({ + what: 'setDeveloperMode', + state: targetConfig.developerMode ?? defaultConfig.developerMode + }); + + await sendMessage({ + what: 'setStrictBlockMode', + state: targetConfig.strictBlockMode ?? defaultConfig.strictBlockMode + }); + + const enabledRulesets = new Set(defaultConfig.rulesets); + for ( const entry of targetConfig.rulesets || [] ) { + const id = entry.slice(1); + if ( entry.startsWith('+') ) { + enabledRulesets.add(id); + } else if ( entry.startsWith('-') ) { + enabledRulesets.delete(id); + } + } + await sendMessage({ + what: 'applyRulesets', + enabledRulesets: Array.from(enabledRulesets), + }); + + await sendMessage({ + what: 'setFilteringModeDetails', + modes: targetConfig.filteringModes ?? defaultConfig.filteringModes, + }); + + await sendMessage({ what: 'removeAllCustomFilters', hostname: '*' }); + const hostnameMap = new Map(); + for ( const line of targetConfig.cosmeticFilters ?? [] ) { + const i = line.indexOf('##'); + if ( i === -1 ) { continue; } + const hostname = line.slice(0, i); + if ( hostname === '' ) { continue; } + const selector = line.slice(i+2); + if ( selector === '' ) { continue; } + const selectors = hostnameMap.get(hostname) || []; + if ( selectors.length === 0 ) { + hostnameMap.set(hostname, selectors) + } + selectors.push(selector); + } + const promises = []; + for ( const [ hostname, selectors ] of hostnameMap ) { + promises.push( + sendMessage({ what: 'addCustomFilters', hostname, selectors }) + ); + } + await Promise.all(promises); + + const dnrRules = targetConfig.dnrRules ?? []; + if ( dnrRules.length !== 0 ) { + await localWrite('userDnrRules', dnrRules.join('\n')); + } else { + await localRemove('userDnrRules'); + } + await sendMessage({ what: 'updateUserDnrRules' }); + +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/config.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/config.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/config.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/config.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,70 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + localRead, localWrite, + sessionRead, sessionWrite, + webextFlavor, +} from './ext.js'; + +/******************************************************************************/ + +export const rulesetConfig = { + version: '', + enabledRulesets: [], + autoReload: true, + showBlockedCount: true, + strictBlockMode: webextFlavor !== 'safari', + developerMode: false, + hasBroadHostPermissions: true, +}; + +export const defaultConfig = Object.assign({}, rulesetConfig); + +export const process = { + firstRun: false, + wakeupRun: false, +}; + +/******************************************************************************/ + +export async function loadRulesetConfig() { + const sessionData = await sessionRead('rulesetConfig'); + if ( sessionData ) { + Object.assign(rulesetConfig, sessionData); + process.wakeupRun = true; + return; + } + const localData = await localRead('rulesetConfig'); + if ( localData ) { + Object.assign(rulesetConfig, localData) + sessionWrite('rulesetConfig', rulesetConfig); + return; + } + sessionWrite('rulesetConfig', rulesetConfig); + localWrite('rulesetConfig', rulesetConfig); + process.firstRun = true; +} + +export async function saveRulesetConfig() { + sessionWrite('rulesetConfig', rulesetConfig); + return localWrite('rulesetConfig', rulesetConfig); +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dashboard-common.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard-common.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dashboard-common.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard-common.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -'use strict'; - -import { dom } from './dom.js'; - -/******************************************************************************/ - -// Open links in the proper window -dom.attr('a', 'target', '_blank'); -dom.attr('a[href*="dashboard.html"]', 'target', '_parent'); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dashboard.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dashboard.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,110 +19,70 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -import { simpleStorage } from './storage.js'; import { dom, qs$ } from './dom.js'; +import { + localRead, localRemove, localWrite, + runtime, + webextFlavor, +} from './ext.js'; +import { faIconsInit } from './fa-icons.js'; +import { i18n } from './i18n.js'; /******************************************************************************/ -const discardUnsavedData = function(synchronous = false) { - const paneFrame = qs$('#iframe'); - const paneWindow = paneFrame.contentWindow; - if ( - typeof paneWindow.hasUnsavedData !== 'function' || - paneWindow.hasUnsavedData() === false - ) { - return true; - } +dom.body.dataset.platform = webextFlavor; - if ( synchronous ) { - return false; - } +{ + const manifest = runtime.getManifest(); + dom.text('#aboutNameVer', `${manifest.name} ${manifest.version}`); +} - return new Promise(resolve => { - const modal = document.querySelector('#unsavedWarning'); - dom.cl.add(modal, 'on'); - modal.focus(); - - const onDone = status => { - dom.cl.remove(modal, 'on'); - document.removeEventListener('click', onClick, true); - resolve(status); - }; - - const onClick = ev => { - const target = ev.target; - if ( target.matches('[data-i18n="dashboardUnsavedWarningStay"]') ) { - return onDone(false); - } - if ( target.matches('[data-i18n="dashboardUnsavedWarningIgnore"]') ) { - return onDone(true); - } - if ( modal.querySelector('[data-i18n="dashboardUnsavedWarning"]').contains(target) ) { - return; - } - onDone(false); - }; +dom.attr('a', 'target', '_blank'); - document.addEventListener('click', onClick, true); +dom.on('#dashboard-nav', 'click', '.tabButton', ev => { + const { pane } = ev.target.dataset; + dom.body.dataset.pane = pane; + if ( pane === 'settings' ) { + localRemove('dashboard.activePane'); + } else { + localWrite('dashboard.activePane', pane); + } +}); + +localRead('dashboard.activePane').then(pane => { + if ( typeof pane !== 'string' ) { return; } + dom.body.dataset.pane = pane; +}); + +// Update troubleshooting on-demand +const tsinfoObserver = new IntersectionObserver(entries => { + if ( entries.every(a => a.isIntersecting === false) ) { return; } + import('./troubleshooting.js').then(module => { + return module.getTroubleshootingInfo(); + }).then(config => { + qs$('[data-i18n="supportS5H"] + pre').textContent = config; }); -}; +}); +tsinfoObserver.observe(qs$('[data-i18n="supportS5H"] + pre')); -const loadDashboardPanel = function(pane, first) { - const tabButton = document.querySelector(`[data-pane="${pane}"]`); - if ( tabButton === null || dom.cl.has(tabButton, 'selected') ) { - return; - } - const loadPane = ( ) => { - self.location.replace(`#${pane}`); - for ( const node of document.querySelectorAll('.tabButton.selected') ) { - dom.cl.remove(node, 'selected'); - } - dom.cl.add(tabButton, 'selected'); - tabButton.scrollIntoView(); - document.querySelector('#iframe').contentWindow.location.replace(pane); - if ( pane !== 'no-dashboard.html' ) { - simpleStorage.setItem('dashboardLastVisitedPane', pane); - } - }; - if ( first ) { - return loadPane(); - } - const r = discardUnsavedData(); - if ( r === false ) { return; } - if ( r === true ) { - return loadPane(); - } - r.then(status => { - if ( status === false ) { return; } - loadPane(); - }); -}; - -const onTabClickHandler = function(ev) { - loadDashboardPanel(dom.attr(ev.target, 'data-pane')); -}; +/******************************************************************************/ -if ( self.location.hash.slice(1) === 'no-dashboard.html' ) { - dom.cl.add(dom.body, 'noDashboard'); +export function nodeFromTemplate(templateId, nodeSelector) { + const template = qs$(`template#${templateId}`); + const fragment = template.content.cloneNode(true); + const node = nodeSelector !== undefined + ? qs$(fragment, nodeSelector) + : fragment.firstElementChild; + faIconsInit(node); + i18n.render(node); + return node; } -(async ( ) => { - let pane = null; - if ( self.location.hash !== '' ) { - pane = self.location.hash.slice(1) || null; - } - loadDashboardPanel(pane !== null ? pane : 'settings.html', true); - - dom.on('#dashboard-nav', 'click', '.tabButton', onTabClickHandler); +/******************************************************************************/ - // https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event - window.addEventListener('beforeunload', ( ) => { - if ( discardUnsavedData(true) ) { return; } - event.preventDefault(); - event.returnValue = ''; - }); -})(); +export function hashFromIterable(iter) { + if ( Boolean(iter) === false ) { return ''; } + return Array.from(iter).sort().join('\n'); +} /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/debug.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/debug.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/debug.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/debug.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,211 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + dnr, + normalizeDNRRules, + webext, +} from './ext-compat.js'; + +import { + sessionRead, + sessionWrite, +} from './ext.js'; + +/******************************************************************************/ + +const isModern = dnr.onRuleMatchedDebug instanceof Object; + +export const isSideloaded = (( ) => { + const { permissions } = webext.runtime.getManifest(); + return permissions?.includes('declarativeNetRequestFeedback') ?? false; +})(); + +/******************************************************************************/ + +const CONSOLE_MAX_LINES = 32; +const consoleOutput = []; + +sessionRead('console').then(before => { + if ( Array.isArray(before) === false ) { return; } + for ( const s of before.reverse() ) { + consoleOutput.unshift(s); + } + consoleTruncate(); +}); + +const consoleTruncate = ( ) => { + if ( consoleOutput.length <= CONSOLE_MAX_LINES ) { return; } + consoleOutput.copyWithin(0, -CONSOLE_MAX_LINES); + consoleOutput.length = CONSOLE_MAX_LINES; +}; + +const consoleAdd = (...args) => { + if ( args.length === 0 ) { return; } + const now = new Date(); + const time = [ + `${now.getUTCMonth()+1}`.padStart(2, '0'), + `${now.getUTCDate()}`.padStart(2, '0'), + '.', + `${now.getUTCHours()}`.padStart(2, '0'), + `${now.getUTCMinutes()}`.padStart(2, '0'), + ].join(''); + for ( let i = 0; i < args.length; i++ ) { + const s = `[${time}]${args[i]}`; + if ( Boolean(s) === false ) { continue; } + if ( s === consoleOutput.at(-1) ) { continue; } + consoleOutput.push(s); + } + consoleTruncate(); + sessionWrite('console', getConsoleOutput()); +} + +export const ubolLog = (...args) => { + // Do not pollute dev console in stable releases. + if ( isSideloaded !== true ) { return; } + console.info('[uBOL]', ...args); +}; + +export const ubolErr = (...args) => { + if ( Array.isArray(args) === false ) { return; } + if ( globalThis.ServiceWorkerGlobalScope ) { + consoleAdd(...args); + } + // Do not pollute dev console in stable releases. + if ( isSideloaded !== true ) { return; } + console.error('[uBOL]', ...args); +}; + +export const getConsoleOutput = ( ) => { + return consoleOutput.slice(); +}; + +/******************************************************************************/ + +const rulesets = new Map(); +const bufferSize = isSideloaded ? 256 : 1; +const matchedRules = new Array(bufferSize); +matchedRules.fill(null); +let writePtr = 0; + +const pruneLongLists = list => { + if ( list.length <= 11 ) { return list; } + return [ ...list.slice(0, 5), '...', ...list.slice(-5) ]; +}; + +const getRuleset = async rulesetId => { + if ( rulesets.has(rulesetId) ) { + return rulesets.get(rulesetId); + } + let rules; + if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { + rules = await dnr.getDynamicRules().catch(( ) => undefined); + } else { + const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); + if ( response === undefined ) { return; } + rules = await response.json().catch(( ) => + undefined + ).then(rules => + normalizeDNRRules(rules) + ); + } + if ( Array.isArray(rules) === false ) { return; } + const ruleset = new Map(); + for ( const rule of rules ) { + const condition = rule.condition; + if ( condition ) { + if ( condition.requestDomains ) { + condition.requestDomains = pruneLongLists(condition.requestDomains); + } + if ( condition.initiatorDomains ) { + condition.initiatorDomains = pruneLongLists(condition.initiatorDomains); + } + } + const ruleId = rule.id; + rule.id = `${rulesetId}/${ruleId}`; + ruleset.set(ruleId, rule); + } + rulesets.set(rulesetId, ruleset); + return ruleset; +}; + +const getRuleDetails = async ruleInfo => { + const { rulesetId, ruleId } = ruleInfo.rule; + const ruleset = await getRuleset(rulesetId); + if ( ruleset === undefined ) { return; } + return { request: ruleInfo.request, rule: ruleset.get(ruleId) }; +}; + +/******************************************************************************/ + +export const getMatchedRules = (( ) => { + if ( isSideloaded !== true ) { + return ( ) => Promise.resolve([]); + } + + if ( isModern ) { + return async tabId => { + const promises = []; + for ( let i = 0; i < bufferSize; i++ ) { + const j = (writePtr + i) % bufferSize; + const ruleInfo = matchedRules[j]; + if ( ruleInfo === null ) { continue; } + if ( ruleInfo.request.tabId !== -1 ) { + if ( ruleInfo.request.tabId !== tabId ) { continue; } + } + const promise = getRuleDetails(ruleInfo); + if ( promise === undefined ) { continue; } + promises.unshift(promise); + } + return Promise.all(promises); + }; + } + + return async tabId => { + if ( typeof dnr.getMatchedRules !== 'function' ) { return []; } + const matchedRules = await dnr.getMatchedRules({ tabId }); + if ( matchedRules instanceof Object === false ) { return []; } + const promises = []; + for ( const { tabId, rule } of matchedRules.rulesMatchedInfo ) { + promises.push(getRuleDetails({ request: { tabId }, rule })); + } + return Promise.all(promises); + }; +})(); + +/******************************************************************************/ + +const matchedRuleListener = ruleInfo => { + matchedRules[writePtr] = ruleInfo; + writePtr = (writePtr + 1) % bufferSize; +}; + +export const toggleDeveloperMode = state => { + if ( isSideloaded !== true ) { return; } + if ( isModern === false ) { return; } + if ( state ) { + dnr.onRuleMatchedDebug.addListener(matchedRuleListener); + } else { + dnr.onRuleMatchedDebug.removeListener(matchedRuleListener); + } +}; + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/develop.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/develop.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/develop.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/develop.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,624 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$, qsa$ } from './dom.js'; +import { localRead, localWrite, sendMessage } from './ext.js'; +import { faIconsInit } from './fa-icons.js'; +import { i18n } from './i18n.js'; + +/******************************************************************************/ + +class Editor { + constructor() { + this.lastSavedText = ''; + this.view = null; + this.reYamlDocSeparator = /^(?:---|...)\s*$/; + this.modifiedRange = { start: 0, end: 0 }; + this.updateTimer = undefined; + this.ioPanel = self.cm6.createViewPanel(); + this.summaryPanel = self.cm6.createViewPanel(); + this.panels = []; + this.editors = {}; + } + + async init() { + await Promise.all([ + import('./mode-editor.js').then(module => { + this.editors['modes'] = new module.ModeEditor(this); + }), + import('./ro-dnr-editor.js').then(module => { + this.editors['dnr.ro'] = new module.ReadOnlyDNREditor(this); + }), + import('./rw-dnr-editor.js').then(module => { + this.editors['dnr.rw'] = new module.ReadWriteDNREditor(this); + }), + ]); + const rulesetDetails = await sendMessage({ what: 'getRulesetDetails' }); + const parent = qs$('#editors optgroup'); + for ( const details of rulesetDetails ) { + const option = document.createElement('option'); + option.value = `dnr.ro.${details.id}`; + option.textContent = details.name; + parent.append(option); + } + this.validModes = Array.from(qsa$('#editors option')).map(a => a.value); + const mode = await localRead('dashboard.develop.editor'); + this.editorFromMode(mode); + const text = this.normalizeEditorText(await this.editor.getText(this.mode)); + const viewConfig = { + text, + yamlLike: true, + oneDark: dom.cl.has(':root', 'dark'), + updateListener: info => { this.viewUpdateListener(info); }, + saveListener: ( ) => { this.saveEditorText(); }, + lineError: true, + spanError: true, + // https://codemirror.net/examples/autocompletion/ + autocompletion: { + override: [ + context => { + return this.autoComplete(context); + }, + ], + activateOnCompletion: ( ) => true, + }, + gutterClick: (view, info) => { + return this.gutterClick(view, info); + }, + hoverTooltip: (view, pos, side) => { + return this.hoverTooltip(view, pos, side); + }, + streamParser: this.streamParser, + foldService: (state, from) => { + return this.foldService(state, from); + }, + readOnly: this.isReadOnly(), + }; + viewConfig.panels = [ this.ioPanel, this.summaryPanel, ...this.panels ]; + this.view = self.cm6.createEditorView(viewConfig, qs$('#cm-container')); + this.lastSavedText = text; + self.cm6.foldAll(this.view); + self.cm6.resetUndoRedo(this.view); + this.updateIOPanel(); + this.editor.on?.(this); + this.modifiedRange.start = 1; + this.modifiedRange.end = this.view.state.doc.lines; + this.updateViewAsync(); + } + + normalizeEditorText(text) { + text ||= ''; + text = text.trim(); + if ( text !== '' ) { text += '\n'; } + return text; + } + + setEditorText(text, saved = false) { + text = this.normalizeEditorText(text); + if ( saved ) { + this.lastSavedText = text; + } + this.view.dispatch({ + changes: { + from: 0, to: this.view.state.doc.length, + insert: text, + }, + }); + this.view.focus(); + } + + getEditorText() { + return this.view.state.doc.toString(); + } + + editorTextChanged() { + const text = this.normalizeEditorText(this.getEditorText()); + return text !== this.lastSavedText; + } + + async selectEditor(mode) { + if ( mode === this.mode ) { return; } + this.editorFromMode(mode); + const text = await this.editor.getText(this.mode); + this.setEditorText(text); + this.lastSavedText = this.getEditorText(); + self.cm6.foldAll(this.view) + self.cm6.resetUndoRedo(this.view); + self.cm6.toggleReadOnly(this.view, this.isReadOnly()); + this.updateIOPanel(); + this.editor.on?.(this); + this.modifiedRange.start = 1; + this.modifiedRange.end = this.view.state.doc.lines; + this.updateViewAsync(); + } + + editorFromMode(mode) { + if ( this.validModes.includes(mode) === false ) { + mode = 'modes'; + } + if ( mode === this.mode ) { return mode; } + let editor; + if ( mode === 'modes' ) { + editor = this.editors['modes']; + } else if ( mode.startsWith('dnr.rw.') ) { + editor = this.editors['dnr.rw']; + } else if ( mode.startsWith('dnr.ro.') ) { + editor = this.editors['dnr.ro']; + } else { + return; + } + this.editor?.off?.(this); + this.editor = editor; + this.mode = mode; + const select = qs$('#editors'); + select.value = mode; + } + + isReadOnly() { + return typeof this.editor.saveEditorText !== 'function'; + } + + viewUpdateListener(info) { + if ( info.docChanged === false ) { return; } + for ( const transaction of info.transactions ) { + if ( transaction.docChanged === false ) { continue; } + this.addToModifiedRange(transaction); + if ( transaction.isUserEvent('delete.backward') ) { + this.smartBackspace(transaction); + } else if ( transaction.isUserEvent('input.paste') ) { + if ( this.editor.importFromPaste ) { + this.editor.importFromPaste(this, transaction); + } + } else if ( transaction.isUserEvent('input') ) { + if ( this.smartReturn(transaction) ) { continue; } + this.smartSpacebar(transaction); + } + } + this.updateViewAsync(); + } + + updateViewAsync() { + if ( this.updateTimer !== undefined ) { return; } + this.updateTimer = self.setTimeout(( ) => { + this.updateTimer = undefined; + this.updateView(); + }, 71); + } + + updateView() { + const { doc } = this.view.state; + const changed = this.editorTextChanged(); + dom.attr('#apply', 'disabled', changed ? null : ''); + dom.attr('#revert', 'disabled', changed ? null : ''); + if ( typeof this.editor.updateView !== 'function' ) { return; } + let { start, end } = this.modifiedRange; + if ( start === 0 || end === 0 ) { return; } + this.modifiedRange.start = this.modifiedRange.end = 0; + if ( start > doc.lines ) { start = doc.lines; } + if ( end > doc.lines ) { end = doc.lines; } + self.cm6.lineErrorClear(this.view, start, end); + self.cm6.spanErrorClear(this.view, start, end); + const firstLine = doc.line(start); + const lastLine = doc.line(end); + this.editor.updateView(this, firstLine, lastLine); + } + + updateIOPanel() { + const ioButtons = []; + if ( this.editor.saveEditorText ) { + ioButtons.push('apply', 'revert'); + } + if ( this.editor.importFromFile ) { + ioButtons.push('import'); + } + if ( this.editor.exportToFile ) { + ioButtons.push('export'); + } + if ( ioButtons.length === 0 ) { + return this.ioPanel.render(this.view, null); + } + const template = document.querySelector('template.io-panel'); + const fragment = template.content.cloneNode(true); + const root = fragment.querySelector('.io-panel'); + i18n.render(root); + faIconsInit(root); + root.dataset.io = ioButtons.join(' '); + const config = { + dom: root, + mount: ( ) => { + dom.on('#apply', 'click', ( ) => { + this.saveEditorText(); + }); + dom.on('#revert', 'click', ( ) => { + this.revertEditorText(); + }); + dom.on('#import', 'click', ( ) => { + this.importFromFile() + }); + dom.on('#export', 'click', ( ) => { + this.exportToFile(); + }); + } + }; + this.ioPanel.render(this.view, config); + } + + updateSummaryPanel(dom) { + if ( dom instanceof Object ) { + if ( this.updateSummaryPanel.timer !== undefined ) { + self.clearTimeout(this.updateSummaryPanel.timer); + this.updateSummaryPanel.timer = undefined; + } + return this.summaryPanel.render(this.view, { dom }); + } + if ( this.updateSummaryPanel.timer !== undefined ) { return; } + this.updateSummaryPanel.timer = self.setTimeout(( ) => { + this.updateSummaryPanel.timer = undefined; + this.summaryPanel.render(this.view, null); + }, 157); + } + + autoComplete(context) { + if ( typeof this.editor.autoComplete !== 'function' ) { return null; } + return this.editor.autoComplete(this, context); + } + + hoverTooltip(view, pos, side) { + if ( typeof this.editor.createTooltipWidget !== 'function' ) { return null; } + const details = view.domAtPos(pos); + const textNode = details.node; + if ( textNode.nodeType !== 3 ) { return null; } + const { parentElement } = textNode; + const targetElement = parentElement.closest('[data-tooltip]'); + if ( targetElement === null ) { return null; } + const tooltipText = targetElement.getAttribute('data-tooltip'); + if ( Boolean(tooltipText) === false ) { return null; } + const start = pos - details.offset; + const end = start + textNode.nodeValue.length; + if ( start === pos && side < 0 || end === pos && side > 0 ) { return null; } + return { + above: true, + pos: start, + end, + create: ( ) => { + return { dom: this.editor.createTooltipWidget(tooltipText) }; + }, + }; + } + + foldService(state, from) { + if ( typeof this.editor.foldService !== 'function' ) { return null; } + return this.editor.foldService(state, from); + } + + // Details of YAML document(s) intersecting with a text span. If the text span + // starts on a YAML document divider, the previous YAML document will be + // included. If the text span ends on a YAML document divider, the next YAML + // document will be included. + + snapToYamlDocument(doc, start, end) { + let yamlDocStart = doc.lineAt(start).number; + if ( this.reYamlDocSeparator.test(doc.line(yamlDocStart).text) ) { + if ( yamlDocStart > 1 ) { + yamlDocStart -= 1; + } + } + while ( yamlDocStart > 1 ) { + const line = doc.line(yamlDocStart); + if ( this.reYamlDocSeparator.test(line.text) ) { break; } + yamlDocStart -= 1; + } + const lastLine = doc.lines; + let yamlDocEnd = doc.lineAt(end).number; + if ( this.reYamlDocSeparator.test(doc.line(yamlDocEnd).text) ) { + if ( yamlDocEnd < lastLine ) { + yamlDocEnd += 1; + } + } + while ( yamlDocEnd < lastLine ) { + const line = doc.line(yamlDocEnd); + if ( this.reYamlDocSeparator.test(line.text) ) { break; } + yamlDocEnd += 1; + } + return { yamlDocStart, yamlDocEnd }; + } + + rangeFromTransaction(transaction) { + let from, to; + transaction.changes.iterChangedRanges((fromA, toA, fromB, toB) => { + if ( from === undefined || fromB < from ) { from = fromB; } + if ( to === undefined || toB > to ) { to = toB; } + }); + return { from, to }; + } + + addToModifiedRange(transaction) { + const { from, to } = this.rangeFromTransaction(transaction); + if ( from === undefined || to === undefined ) { return; } + const { newDoc } = transaction; + const { yamlDocStart, yamlDocEnd } = this.snapToYamlDocument(newDoc, from, to); + if ( this.modifiedRange.start === 0 || yamlDocStart < this.modifiedRange.start ) { + this.modifiedRange.start = yamlDocStart; + } + if ( this.modifiedRange.end === 0 || yamlDocEnd > this.modifiedRange.end ) { + this.modifiedRange.end = yamlDocEnd; + } + } + + lineIndentAt(line) { + const match = /^(?: {2})*/.exec(line.text); + const indent = match !== null ? match[0].length : -1; + if ( indent === -1 || (indent & 1) !== 0 ) { return -1; } + return indent / 2; + } + + getScopeAt(from, doc) { + doc ||= this.view.state.doc; + const lineFrom = doc.lineAt(from); + const out = {}; + let depth = this.lineIndentAt(lineFrom); + if ( depth === -1 ) { return out; } + const text = lineFrom.text.trim(); + if ( text.startsWith('#') ) { return out; } + const path = []; + const end = text.indexOf(':'); + if ( end !== -1 ) { + const beg = text.startsWith('- ') ? 2 : 0; + path.push(text.slice(beg, end+1)); + } + let lineNo = lineFrom.number; + while ( depth > 0 && lineNo > 1 ) { + lineNo -= 1; + const lineBefore = doc.line(lineNo); + const text = lineBefore.text.trim(); + if ( text.startsWith('#') ) { continue; } + if ( this.lineIndentAt(lineBefore) > (depth-1) ) { continue; } + const match = /^- ([^:]+:)/.exec(text); + if ( match !== null ) { + path.unshift(match[1]); + } else { + path.unshift(text); + } + depth -= 1; + } + out.scope = path.join(''); + out.depth = path.length; + return out; + } + + async saveEditorText() { + if ( typeof this.editor.saveEditorText !== 'function' ) { return; } + if ( this.editorTextChanged() === false ) { return; } + const saved = await this.editor.saveEditorText(this); + if ( saved !== true ) { return; } + this.lastSavedText = this.normalizeEditorText(this.getEditorText()); + this.updateView(); + } + + revertEditorText() { + if ( this.editorTextChanged() === false ) { return; } + this.setEditorText(this.lastSavedText); + } + + smartBackspace(transaction) { + const { from, to } = this.rangeFromTransaction(transaction); + if ( from === undefined || to === undefined ) { return; } + if ( to !== from ) { return; } + const { newDoc } = transaction; + const line = newDoc.lineAt(from); + if ( /^(?: {2})+-$/.test(line.text) === false ) { return; } + this.view.dispatch({ changes: { from: from-3, to: from, insert: '' } }); + return true; + } + + lineIsArrayItem(doc, lineNo) { + if ( lineNo < 1 || lineNo > doc.lines ) { return false; } + const line = doc.line(lineNo); + return /^(?: {2})+- /.test(line.text); + } + + smartArrayItem(doc, from) { + const line = doc.lineAt(from); + if ( line.from === 0 ) { return; } + const blanks = /^ *$/.exec(line.text); + if ( blanks === null ) { return; } + if ( this.editor.newlineAssistant ) { + const { scope } = this.getScopeAt(line.from-1, doc); + const insert = this.editor.newlineAssistant[scope]; + if ( insert ) { + this.view.dispatch({ + changes: { from: line.from, to: line.to, insert }, + selection: { anchor: line.from + insert.length }, + }); + return true; + } + } + let targetIndent; + if ( this.lineIsArrayItem(doc, line.number-1) ) { + targetIndent = doc.line(line.number-1).text.indexOf('- '); + } else if ( this.lineIsArrayItem(doc, line.number+1) ) { + targetIndent = doc.line(line.number+1).text.indexOf('- '); + } + if ( targetIndent === undefined ) { return; } + const indent = targetIndent - blanks[0].length; + if ( indent < 0 || indent > 2 ) { return; } + const insert = `${' '.repeat(indent)}- `; + this.view.dispatch({ + changes: { from, insert }, + selection: { anchor: from + insert.length }, + }); + return true; + } + + smartReturn(transaction) { + const { from, to } = this.rangeFromTransaction(transaction); + if ( from === undefined || to === undefined ) { return; } + const { newDoc } = transaction; + return this.smartArrayItem(newDoc, to); + } + + smartSpacebar(transaction) { + const { from, to } = this.rangeFromTransaction(transaction); + if ( from === undefined || to === undefined ) { return; } + if ( (to - from) !== 1 ) { return; } + const { newDoc } = transaction; + const line = newDoc.lineAt(to); + const localTo = to - line.from; + const before = line.text.slice(0, localTo); + if ( /^(?: {1}| {3})$/.test(before) === false ) { return; } + if ( this.smartArrayItem(newDoc, to) ) { return true; } + this.view.dispatch({ + changes: { from: to, insert: ' ' }, + selection: { anchor: to + 1 }, + }); + return true; + } + + gutterClick(view, info) { + const reSeparator = /^(?:---|# ---)\s*/; + const { doc } = view.state; + const lineFirst = doc.lineAt(info.from); + if ( lineFirst.text === '' ) { return false; } + let { from, to } = lineFirst; + if ( reSeparator.test(lineFirst.text) ) { + let lineNo = lineFirst.number + 1; + while ( lineNo < doc.lines ) { + const line = doc.line(lineNo); + if ( reSeparator.test(line.text) ) { break; } + to = line.to; + lineNo += 1; + } + } + view.dispatch({ + selection: { anchor: from, head: Math.min(to+1, doc.length) } + }); + view.focus(); + return true; + } + + importFromFile() { + const editor = this.editor; + if ( typeof editor.importFromFile !== 'function' ) { return; } + const input = qs$('section[data-pane="develop"] input[type="file"]'); + input.accept = editor.ioAccept || ''; + input.onchange = ev => { + input.onchange = null; + const file = ev.target.files[0]; + if ( file === undefined || file.name === '' ) { return; } + const fr = new FileReader(); + fr.onload = ( ) => { + if ( typeof fr.result !== 'string' ) { return; } + editor.importFromFile(this, fr.result); + }; + fr.readAsText(file); + }; + // Reset to empty string, this will ensure a change event is properly + // triggered if the user pick a file, even if it's the same as the last + // one picked. + input.value = ''; + input.click(); + } + + exportToFile() { + const editor = this.editor; + if ( typeof editor.exportToFile !== 'function' ) { return; } + const text = this.getEditorText(); + const result = editor.exportToFile(text); + if ( result === undefined ) { return; } + const { fname, data, mime } = result; + const a = document.createElement('a'); + a.href = `data:${mime};charset=utf-8,${encodeURIComponent(data)}`; + dom.attr(a, 'download', fname || ''); + dom.attr(a, 'type', mime); + a.click(); + } + + streamParser = { + startState: ( ) => { + return { scope: 0 }; + }, + token: (stream, state) => { + if ( stream.sol() ) { + if ( stream.match(/^---\s*$/) ) { return 'ubol-boundary'; } + if ( stream.match(/^# ---\s*$/) ) { return 'ubol-boundary ubol-comment'; } + if ( stream.match(/\.\.\.\s*$/) ) { return 'ubol-boundary'; } + } + const c = stream.peek(); + if ( c === '#' ) { + if ( (stream.pos === 0 || /\s/.test(stream.string.charAt(stream.pos - 1))) ) { + stream.skipToEnd(); + return 'ubol-comment'; + } + } + if ( stream.eatSpace() ) { return null; } + const { scope } = state; + state.scope = 0; + if ( scope === 0 && stream.match(/^[^:]+(?=:)/) ) { + state.scope = 1; + return 'ubol-keyword'; + } + if ( scope === 1 && stream.match(/^:(?: |$)/) ) { + return 'ubol-punctuation'; + } + if ( stream.match(/^- /) ) { + return 'ubol-punctuation'; + } + if ( this.editor.streamParserKeywords ) { + if ( stream.match(this.editor.streamParserKeywords) ) { + return 'ubol-literal'; + } + } + if ( stream.match(/^\S+/) ) { + return null; + } + stream.next(); + return null; + }, + languageData: { + commentTokens: { line: '#' }, + }, + tokenTable: [ + 'ubol-boundary', + 'ubol-keyword', + 'ubol-comment', + 'ubol-punctuation', + 'ubol-literal', + ], + }; +} + +/******************************************************************************/ + +async function start() { + const editor = new Editor(); + await editor.init(); + dom.on('#editors', 'change', ( ) => { + const select = qs$('#editors'); + const mode = select.value; + if ( mode === editor.mode ) { return; } + editor.selectEditor(mode); + localWrite('dashboard.develop.editor', editor.mode); + }); +} + +dom.onFirstShown(start, qs$('section[data-pane="develop"]')); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dnr-editor.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-editor.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dnr-editor.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-editor.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,180 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dnr } from './ext-compat.js'; +import { rulesFromText } from './dnr-parser.js'; + +/******************************************************************************/ + +export class DNREditor { + constructor() { + this.validatedRegexes = []; + this.validatedRegexResults = []; + } + + updateView(editor, firstLine, lastLine) { + const { doc } = editor.view.state; + const text = doc.sliceString(firstLine.from, lastLine.to); + const { bad } = rulesFromText(text); + if ( Array.isArray(bad) && bad.length !== 0 ) { + self.cm6.lineErrorAdd(editor.view, bad.map(i => i + firstLine.number)); + } + const entries = self.cm6.findAll( + editor.view, + '\\bregexFilter: (\\S+)', + firstLine.from, + lastLine.to + ); + const regexes = []; + for ( const entry of entries ) { + const regex = entry.match[1]; + const i = this.validatedRegexes.indexOf(regex); + if ( i !== -1 ) { + const reason = this.validatedRegexResults[i]; + if ( reason === true ) { continue; } + self.cm6.spanErrorAdd(editor.view, entry.from+13, entry.to, reason); + } else { + regexes.push(regex); + } + } + this.validateRegexes(editor, regexes); + } + + exportToFile(text, fname) { + const { rules } = rulesFromText(text); + if ( Array.isArray(rules) === false ) { return; } + let ruleId = 1; + for ( const rule of rules ) { + rule.id = ruleId++; + } + return { + fname, + data: JSON.stringify(rules, null, 2), + mime: 'application/json', + }; + } + + async validateRegexes(editor, regexes) { + if ( regexes.length === 0 ) { return; } + const promises = regexes.map(regex => this.validateRegex(regex)); + await Promise.all(promises); + for ( const regex of regexes ) { + const i = this.validatedRegexes.indexOf(regex); + if ( i === -1 ) { continue; } + const reason = this.validatedRegexResults[i]; + if ( reason === true ) { continue; } + const entries = self.cm6.findAll(editor.view, + `(?<=\\bregexFilter: )${RegExp.escape(regex)}` + ); + for ( const entry of entries ) { + self.cm6.spanErrorAdd(editor.view, entry.from, entry.to, reason); + } + } + } + + async validateRegex(regex) { + const details = await dnr.isRegexSupported({ regex }); + const result = details.isSupported || details.reason; + if ( this.validatedRegexes.length > 32 ) { + this.validatedRegexes.pop(); + this.validatedRegexResults.pop(); + } + this.validatedRegexes.unshift(regex); + this.validatedRegexResults.unshift(result); + } + + createTooltipWidget(text) { + const template = document.querySelector('.badmark-tooltip'); + const fragment = template.content.cloneNode(true); + const dom = fragment.querySelector('.badmark-tooltip'); + dom.textContent = text; + return dom; + } + + foldService(state, from) { + const { doc } = state; + const lineFrom = doc.lineAt(from); + if ( this.reFoldable.test(lineFrom.text) === false ) { return null; } + if ( lineFrom.number <= 5 ) { return null ; } + const lineBlockStart = doc.line(lineFrom.number - 5); + if ( this.reFoldCandidates.test(lineBlockStart.text) === false ) { return null; } + for ( let i = lineFrom.number-4; i < lineFrom.number; i++ ) { + const line = doc.line(i); + if ( this.reFoldable.test(line.text) === false ) { return null; } + } + let i = lineFrom.number + 1; + for ( ; i <= doc.lines; i++ ) { + const lineNext = doc.line(i); + if ( this.reFoldable.test(lineNext.text) === false ) { break; } + } + i -= 1; + if ( i === lineFrom.number ) { return null; } + const lineFoldEnd = doc.line(i); + return { from: lineFrom.from+6, to: lineFoldEnd.to }; + } + reFoldable = /^ {4}- \S/; + reFoldCandidates = new RegExp(`^(?: {2})+${[ + 'initiatorDomains', + 'excludedInitiatorDomains', + 'requestDomains', + 'excludedRequestDomains', + ].join('|')}:$`); + + streamParserKeywords = new RegExp(`\\b(${[ + 'block', + 'redirect', + 'allow', + 'modifyHeaders', + 'upgradeScheme', + 'allowAllRequest', + 'append', + 'set', + 'remove', + 'firstParty', + 'thirdParty', + 'true', + 'false', + 'connect', + 'delete', + 'get', + 'head', + 'options', + 'patch', + 'post', + 'put', + 'other', + 'main_frame', + 'sub_frame', + 'stylesheet', + 'script', + 'image', + 'font', + 'object', + 'xmlhttprequest', + 'ping', + 'csp_report', + 'media', + 'websocket', + 'webtransport', + 'webbundle', + 'other', + ].join('|')})\\b`); +}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dnr-parser.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-parser.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/dnr-parser.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-parser.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,581 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +/******************************************************************************/ + +const validActionValues = [ + 'block', + 'redirect', + 'allow', + 'upgradeScheme', + 'modifyHeaders', + 'allowAllRequests', +]; + +const validBoolValues = [ + 'false', + 'true', +]; + +const validHeaderOpValues = [ + 'append', + 'remove', + 'set', +]; + +const validDomainTypeValues = [ + 'firstParty', + 'thirdParty', +]; + +const validRequestMethodValues = [ + 'connect', + 'delete', + 'get', + 'head', + 'options', + 'patch', + 'post', + 'put', + 'other', +]; + +const validResourceTypeValues = [ + 'main_frame', + 'sub_frame', + 'stylesheet', + 'script', + 'image', + 'font', + 'object', + 'xmlhttprequest', + 'ping', + 'csp_report', + 'media', + 'websocket', + 'webtransport', + 'webbundle', + 'other', +]; + +/******************************************************************************/ + +function selectParser(scope, rule, node) { + const parser = perScopeParsers[scope.join('.')]; + if ( parser === undefined ) { return false; } + return parser(scope, rule, node); +} + +const perScopeParsers = { + '': function(scope, rule, node) { + const { key, val } = node; + switch ( key ) { + case 'action': + case 'condition': + if ( val !== undefined ) { return false; } + rule[key] = {}; + scope.push(key); + break; + case 'id': { + const n = parseInt(val, 10); + if ( isNaN(n) || n < 1) { return false; } + rule.id = n; + break; + } + case 'priority': { + const n = parseInt(val, 10); + if ( isNaN(n) || n < 1 ) { return false; } + rule.priority = n; + break; + } + default: + return false; + } + return true; + }, + 'action': function(scope, rule, node) { + const { key, val } = node; + switch ( key ) { + case 'type': + if ( validActionValues.includes(val) === false ) { return false; } + rule.action.type = val; + break; + case 'redirect': + rule.action.redirect = {}; + scope.push('redirect'); + break; + case 'requestHeaders': + case 'responseHeaders': + rule.action[key] = []; + scope.push(key); + break; + default: + return false; + } + return true; + }, + 'action.redirect': function(scope, rule, node) { + const { key, val } = node; + switch ( key ) { + case 'extensionPath': + case 'regexSubstitution': + case 'url': + rule.action.redirect[key] = val; + break; + case 'transform': + rule.action.redirect.transform = {}; + scope.push('transform'); + break; + default: + return false; + } + return true; + }, + 'action.redirect.transform': function(scope, rule, node) { + const { key, val } = node; + switch ( key ) { + case 'fragment': + case 'host': + case 'path': + case 'port': + case 'query': + case 'scheme': { + if ( val === undefined ) { return false; } + rule.action.redirect.transform[key] = val; + break; + } + case 'queryTransform': + rule.action.redirect.transform.queryTransform = {}; + scope.push('queryTransform'); + break; + default: + return false; + } + return true; + }, + 'action.redirect.transform.queryTransform': function(scope, rule, node) { + const { key, val } = node; + if ( val !== undefined ) { return false; } + switch ( key ) { + case 'addOrReplaceParams': + case 'removeParams': + rule.action.redirect.transform.queryTransform[key] = []; + scope.push(key); + break; + default: + return false; + } + return true; + }, + 'action.redirect.transform.queryTransform.addOrReplaceParams': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.action.redirect.transform.queryTransform.addOrReplaceParams.push({}); + scope.push('@'); + return selectParser(scope, rule, node); + }, + 'action.redirect.transform.queryTransform.addOrReplaceParams.@': function(scope, rule, node) { + const { key, val } = node; + if ( val === undefined ) { return false; } + const item = rule.action.redirect.transform.queryTransform.addOrReplaceParams.at(-1); + switch ( key ) { + case 'key': + case 'value': + item[key] = val; + break; + case 'replaceOnly': + if ( validBoolValues.includes(val) === false ) { return false; } + item.replaceOnly = val === 'true'; + break; + default: + return false; + } + return true; + }, + 'action.redirect.transform.queryTransform.removeParams': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.action.redirect.transform.queryTransform.removeParams.push(node.val); + return true; + }, + 'action.requestHeaders': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.action.requestHeaders.push({}); + scope.push('@'); + return selectParser(scope, rule, node); + }, + 'action.requestHeaders.@': function(scope, rule, node) { + const { key, val } = node; + const item = rule.action.requestHeaders.at(-1); + switch ( key ) { + case 'header': + case 'value': + item[key] = val; + break; + case 'operation': + if ( validHeaderOpValues.includes(val) === false ) { return false; } + item.operation = val; + break; + default: + return false; + } + return true; + }, + 'action.responseHeaders': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.action.responseHeaders.push({}); + scope.push('@'); + return selectParser(scope, rule, node); + }, + 'action.responseHeaders.@': function(scope, rule, node) { + const { key, val } = node; + const item = rule.action.responseHeaders.at(-1); + switch ( key ) { + case 'header': + case 'value': + item[key] = val; + break; + case 'operation': + if ( validHeaderOpValues.includes(val) === false ) { return false; } + item.operation = val; + break; + default: + return false; + } + return true; + }, + 'condition': function(scope, rule, node) { + const { key, val } = node; + switch ( key ) { + case 'domainType': + if ( validDomainTypeValues.includes(val) === false ) { return false; } + rule.condition.domainType = val; + break; + case 'isUrlFilterCaseSensitive': + if ( validBoolValues.includes(val) === false ) { return false; } + rule.condition.isUrlFilterCaseSensitive = val === 'true'; + break; + case 'regexFilter': + case 'urlFilter': + if ( val === undefined ) { return false; } + rule.condition[key] = val; + break; + case 'initiatorDomains': + case 'excludedInitiatorDomains': + case 'requestDomains': + case 'excludedRequestDomains': + case 'resourceTypes': + case 'excludedResourceTypes': + case 'requestMethods': + case 'excludedRequestMethods': + case 'responseHeaders': + case 'excludedResponseHeaders': + rule.condition[key] = []; + scope.push(key); + break; + case 'tabIds': + rule.condition.tabIds = []; + scope.push('tabIds'); + break; + default: + return false; + } + return true; + }, + 'condition.initiatorDomains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.initiatorDomains.push(node.val); + return true; + }, + 'condition.excludedInitiatorDomains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.excludedInitiatorDomains.push(node.val); + return true; + }, + 'condition.domains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.domains.push(node.val); + return true; + }, + 'condition.excludedDomains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.excludedDomains.push(node.val); + return true; + }, + 'condition.requestDomains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.requestDomains.push(node.val); + return true; + }, + 'condition.excludedRequestDomains': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.excludedRequestDomains.push(node.val); + return true; + }, + 'condition.resourceTypes': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + if ( validResourceTypeValues.includes(node.val) === false ) { return false; } + rule.condition.resourceTypes.push(node.val); + return true; + }, + 'condition.excludedResourceTypes': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + if ( validResourceTypeValues.includes(node.val) === false ) { return false; } + rule.condition.excludedResourceTypes.push(node.val); + return true; + }, + 'condition.requestMethods': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + if ( validRequestMethodValues.includes(node.val) === false ) { return false; } + rule.condition.requestMethods.push(node.val); + return true; + }, + 'condition.excludedRequestMethods': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + if ( validRequestMethodValues.includes(node.val) === false ) { return false; } + rule.condition.excludedRequestMethods.push(node.val); + return true; + }, + 'condition.responseHeaders': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.responseHeaders.push({}); + scope.push('@'); + return selectParser(scope, rule, node); + }, + 'condition.responseHeaders.@': function(scope, rule, node) { + const item = rule.condition.responseHeaders.at(-1); + switch ( node.key ) { + case 'header': + if ( node.val === undefined ) { return false; } + item.header = node.val; + break; + case 'values': + case 'excludedValues': + item[node.key] = []; + scope.push(node.key); + break; + default: + return false; + } + return true; + }, + 'condition.responseHeaders.@.values': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + const item = rule.condition.responseHeaders.at(-1); + item.values.push(node.val); + return true; + }, + 'condition.responseHeaders.@.excludedValues': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + const item = rule.condition.responseHeaders.at(-1); + item.excludedValues.push(node.val); + return true; + }, + 'condition.excludedResponseHeaders': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + rule.condition.excludedResponseHeaders.push({}); + scope.push('@'); + return selectParser(scope, rule, node); + }, + 'condition.excludedResponseHeaders.@': function(scope, rule, node) { + const item = rule.condition.excludedResponseHeaders.at(-1); + switch ( node.key ) { + case 'header': + if ( node.val === undefined ) { return false; } + item.header = node.val; + break; + case 'values': + case 'excludedValues': + item[node.key] = []; + scope.push(node.key); + break; + default: + return false; + } + return true; + }, + 'condition.excludedResponseHeaders.@.values': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + const item = rule.condition.excludedResponseHeaders.at(-1); + item.values.push(node.val); + return true; + }, + 'condition.excludedResponseHeaders.@.excludedValues': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + const item = rule.condition.excludedResponseHeaders.at(-1); + item.excludedValues.push(node.val); + return true; + }, + 'condition.tabIds': function(scope, rule, node) { + if ( node.list !== true ) { return false; } + const n = parseInt(node.val, 10); + if ( isNaN(n) || n === 0 ) { return false; } + rule.condition.tabIds.push(n); + }, +}; + +/******************************************************************************/ + +function depthFromIndent(line) { + const match = /^\s*/.exec(line); + const count = match[0].length; + if ( (count & 1) !== 0 ) { return -1; } + return count / 2; +} + +/******************************************************************************/ + +function nodeFromLine(line) { + const match = reNodeParser.exec(line); + const out = {}; + if ( match === null ) { return out; } + if ( match[1] ) { + out.list = true; + } + if ( match[4] ) { + out.val = match[4].trim(); + } else if ( match[3] ) { + out.key = match[2]; + out.val = match[3].trim(); + if ( out.val === "''" ) { out.val = '' }; + } else { + out.key = match[2]; + } + return out; +} + +const reNodeParser = /^\s*(- )?(?:(\S+):( \S.*)?|(\S.*))$/; + +/******************************************************************************/ + +function ruleFromLines(lines, indices) { + const rule = {}; + const bad = []; + const scope = []; + for ( const i of indices ) { + const line = lines[i]; + const depth = depthFromIndent(line); + if ( depth < 0 ) { + bad.push(i); + continue; + } + scope.length = depth; + const node = nodeFromLine(line); + const result = selectParser(scope, rule, node); + if ( result === false ) { + bad.push(i); + } + } + if ( bad.length !== 0 ) { return { bad }; } + return { rule }; +} + +/******************************************************************************/ + +export function rulesFromText(text) { + const rules = []; + const bad = []; + const lines = [ ...text.split(/\n\r|\r\n|\n|\r/), '---' ]; + const indices = []; + for ( let i = 0; i < lines.length; i++ ) { + const line = lines[i].trimEnd(); + if ( line.trim().startsWith('#') ) { continue; } + if ( line !== '---' && line !== '...' ) { + indices.push(i); + continue; + } + // Discard leading empty lines + while ( indices.length !== 0 ) { + const s = lines[indices[0]].trim(); + if ( s.length !== 0 ) { break; } + indices.shift(); + } + // Discard trailing empty lines + while ( indices.length !== 0 ) { + const s = lines[indices.at(-1)].trim(); + if ( s.length !== 0 ) { break; } + indices.pop(); + } + if ( indices.length === 0 ) { continue; } + const result = ruleFromLines(lines, indices); + if ( result.bad ) { + bad.push(...result.bad.slice(4)); + } else if ( result.rule ) { + rules.push(result.rule); + } + indices.length = 0; + } + return { rules, bad }; +} + +/******************************************************************************/ + +function textFromValue(val, depth) { + const indent = ' '.repeat(depth); + switch ( typeof val ) { + case 'boolean': + case 'number': + return `${val}`; + case 'string': + if ( val === '' ) { return "''"; } + return val; + } + const out = []; + if ( Array.isArray(val) ) { + for ( const a of val ) { + const s = textFromValue(a, depth+1); + if ( s === undefined ) { continue; } + out.push(`${indent}- ${s.trimStart()}`); + } + return out.join('\n'); + } + if ( val instanceof Object ) { + for ( const [ a, b ] of Object.entries(val) ) { + const s = textFromValue(b, depth+1); + if ( s === undefined ) { continue; } + if ( b instanceof Object ) { + out.push(`${indent}${a}:\n${s}`); + } else { + out.push(`${indent}${a}: ${s}`); + } + } + return out.join('\n'); + } +} + +/******************************************************************************/ + +export function textFromRules(rules, option = {}) { + if ( Array.isArray(rules) === false ) { + if ( rules instanceof Object === false ) { return; } + rules = [ rules ]; + } + const out = []; + for ( const rule of rules ) { + if ( option.keepId !== true && rule.id ) { rule.id = undefined }; + const text = textFromValue(rule, 0); + if ( text === undefined ) { continue; } + out.push(text, '---' ); + } + if ( out.length !== 0 ) { + out.unshift('---'); + out.push(''); + } + return out.join('\n'); +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ext-compat.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext-compat.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ext-compat.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext-compat.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,103 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +export const webext = self.browser || self.chrome; +export const dnr = webext.declarativeNetRequest || {}; + +/******************************************************************************/ + +const ruleCompare = (a, b) => a.id - b.id; + +const isSameRules = (a, b) => { + a.sort(ruleCompare); + b.sort(ruleCompare); + return JSON.stringify(a) === JSON.stringify(b); +}; + +/******************************************************************************/ + +export function normalizeDNRRules(rules, ruleIds) { + if ( Array.isArray(rules) === false ) { return rules; } + return Array.isArray(ruleIds) + ? rules.filter(rule => ruleIds.includes(rule.id)) + : rules; +} + +/******************************************************************************/ + +dnr.setAllowAllRules = async function(id, allowed, notAllowed, reverse, priority) { + const [ + beforeDynamicRules, + beforeSessionRules, + ] = await Promise.all([ + dnr.getDynamicRules({ ruleIds: [ id+0 ] }), + dnr.getSessionRules({ ruleIds: [ id+1 ] }), + ]); + const addDynamicRules = []; + const addSessionRules = []; + if ( reverse || allowed.length || notAllowed.length ) { + const rule0 = { + id: id+0, + action: { type: 'allowAllRequests' }, + condition: { + resourceTypes: [ 'main_frame' ], + }, + priority, + }; + if ( allowed.length ) { + rule0.condition.requestDomains = allowed.slice(); + } else if ( notAllowed.length ) { + rule0.condition.excludedRequestDomains = notAllowed.slice(); + } + addDynamicRules.push(rule0); + // https://github.com/uBlockOrigin/uBOL-home/issues/114 + // https://github.com/uBlockOrigin/uBOL-home/issues/247 + const rule1 = { + id: id+1, + action: { type: 'allow' }, + condition: { + tabIds: [ webext.tabs.TAB_ID_NONE ], + }, + priority, + }; + if ( allowed.length ) { + rule1.condition.initiatorDomains = allowed.slice(); + } else if ( notAllowed.length ) { + rule1.condition.excludedInitiatorDomains = notAllowed.slice(); + } + addSessionRules.push(rule1); + } + if ( isSameRules(addDynamicRules, beforeDynamicRules) ) { return false; } + return Promise.all([ + dnr.updateDynamicRules({ + addRules: addDynamicRules, + removeRuleIds: beforeDynamicRules.map(r => r.id), + }), + dnr.updateSessionRules({ + addRules: addSessionRules, + removeRuleIds: beforeSessionRules.map(r => r.id), + }), + ]).then(( ) => + true + ).catch(( ) => + false + ); +}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ext.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ext.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,46 +19,103 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; +import { webext } from './ext-compat.js'; /******************************************************************************/ -const browser = - self.browser instanceof Object && - self.browser instanceof Element === false - ? self.browser - : self.chrome; - -const dnr = browser.declarativeNetRequest; -const i18n = browser.i18n; -const runtime = browser.runtime; +export const browser = webext; +export const i18n = browser.i18n; +export const runtime = browser.runtime; + +export const webextFlavor = (( ) => { + const extURL = runtime.getURL(''); + if ( extURL.startsWith('safari-web-extension:') ) { return 'safari'; } + return extURL.startsWith('moz-extension:') ? 'firefox' : 'chromium'; +})(); /******************************************************************************/ // The extension's service worker can be evicted at any time, so when we // send a message, we try a few more times when the message fails to be sent. -function sendMessage(msg) { - return new Promise((resolve, reject) => { - let i = 5; - const send = ( ) => { - runtime.sendMessage(msg).then(response => { - resolve(response); - }).catch(reason => { - i -= 1; - if ( i <= 0 ) { - reject(reason); - } else { - setTimeout(send, 200); - } - }); - }; - send(); +export function sendMessage(msg) { + return runtime.sendMessage(msg).catch(reason => { + console.log(reason); }); } /******************************************************************************/ -export { browser, dnr, i18n, runtime, sendMessage }; +export async function localRead(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.local instanceof Object === false ) { return; } + try { + const bin = await browser.storage.local.get(key); + if ( bin instanceof Object === false ) { return; } + return bin[key] ?? undefined; + } catch { + } +} + +export async function localWrite(key, value) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.local instanceof Object === false ) { return; } + return browser.storage.local.set({ [key]: value }); +} + +export async function localRemove(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.local instanceof Object === false ) { return; } + return browser.storage.local.remove(key); +} + +export async function localKeys() { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.local instanceof Object === false ) { return; } + if ( browser.storage.local.getKeys ) { + return browser.storage.local.getKeys(); + } + const bin = await browser.storage.local.get(null); + if ( bin instanceof Object === false ) { return; } + return Object.keys(bin); +} + +/******************************************************************************/ + +export async function sessionRead(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.session instanceof Object === false ) { return; } + try { + const bin = await browser.storage.session.get(key); + if ( bin instanceof Object === false ) { return; } + return bin[key] ?? undefined; + } catch { + } +} + +export async function sessionWrite(key, value) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.session instanceof Object === false ) { return; } + return browser.storage.session.set({ [key]: value }); +} + +export async function sessionRemove(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.session instanceof Object === false ) { return; } + return browser.storage.session.remove(key); +} + +/******************************************************************************/ + +export async function adminRead(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.managed instanceof Object === false ) { return; } + try { + const bin = await browser.storage.managed.get(key); + if ( bin instanceof Object === false ) { return; } + return bin[key] ?? undefined; + } catch { + } +} + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/fetch.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/fetch.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/fetch.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/fetch.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,9 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; +import { ubolErr } from './debug.js'; /******************************************************************************/ @@ -29,7 +27,7 @@ return fetch(`${path}.json`).then(response => response.json() ).catch(reason => { - console.info(reason); + ubolErr(`fetchJSON/${reason}`); }); } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-lists.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-lists.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-lists.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-lists.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,464 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$, qsa$ } from './dom.js'; +import { hashFromIterable, nodeFromTemplate } from './dashboard.js'; +import { i18n, i18n$ } from './i18n.js'; +import { localRead, localWrite, sendMessage } from './ext.js'; + +/******************************************************************************/ + +export const rulesetMap = new Map(); + +let cachedRulesetData = {}; +let hideUnusedSet = new Set([ 'ads', 'regions' ]); + +/******************************************************************************/ + +function renderNumber(value) { + return value.toLocaleString(); +} + +/******************************************************************************/ + +function renderTotalRuleCounts() { + let rulesetCount = 0; + let filterCount = 0; + let ruleCount = 0; + for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { + if ( qs$(liEntry, 'input[type="checkbox"]:checked') === null ) { continue; } + rulesetCount += 1; + const stats = rulesetStats(liEntry.dataset.rulesetid); + if ( stats === undefined ) { continue; } + ruleCount += stats.ruleCount; + filterCount += stats.filterCount; + } + dom.text('#listsOfBlockedHostsPrompt', i18n$('perRulesetStats') + .replace('{{ruleCount}}', renderNumber(ruleCount)) + .replace('{{filterCount}}', renderNumber(filterCount)) + ); + + dom.cl.toggle(dom.body, 'noMoreRuleset', + rulesetCount === cachedRulesetData.maxNumberOfEnabledRulesets + ); +} + +/******************************************************************************/ + +function updateNodes(listEntries) { + listEntries = listEntries || qs$('#lists'); + const sublistSelector = '.listEntry[data-rulesetid] > .detailbar input'; + const checkedSublistSelector = `${sublistSelector}:checked`; + const adminSublistSelector = '.listEntry.fromAdmin[data-rulesetid] > .detailbar input'; + for ( const listEntry of qsa$(listEntries, '.listEntry[data-nodeid]') ) { + const countElem = qs$(listEntry, ':scope > .detailbar .count'); + if ( countElem === null ) { continue; } + const totalCount = qsa$(listEntry, sublistSelector).length; + const checkedCount = qsa$(listEntry, checkedSublistSelector).length; + dom.text(countElem, `${checkedCount}/${totalCount}`); + const checkboxElem = qs$(listEntry, ':scope > .detailbar .checkbox'); + if ( checkboxElem === null ) { continue; } + const checkboxInput = qs$(checkboxElem, 'input'); + dom.prop(checkboxInput, 'checked', checkedCount !== 0); + dom.cl.toggle(checkboxElem, 'partial', + checkedCount !== 0 && checkedCount !== totalCount + ); + const adminCount = qsa$(listEntry, adminSublistSelector).length; + const fromAdmin = adminCount === totalCount; + dom.cl.toggle(listEntry, 'fromAdmin', fromAdmin); + dom.attr(checkboxInput, 'disabled', fromAdmin ? '' : null); + } +} + +/******************************************************************************/ + +function rulesetStats(rulesetId) { + const rulesetDetails = rulesetMap.get(rulesetId); + if ( rulesetDetails === undefined ) { return; } + const { rules, filters } = rulesetDetails; + const ruleCount = rules.plain + rules.regex; + const filterCount = filters.accepted; + return { ruleCount, filterCount }; +} + +/******************************************************************************/ + +function isAdminRuleset(listkey) { + const { adminRulesets = [] } = cachedRulesetData; + for ( const id of adminRulesets ) { + const pos = id.indexOf(listkey); + if ( pos === 0 ) { return true; } + if ( pos !== 1 ) { continue; } + const c = id.charAt(0); + if ( c === '+' || c === '-' ) { return true; } + } + return false; +} + +/******************************************************************************/ + +export function renderFilterLists(rulesetData) { + cachedRulesetData = rulesetData; + const { enabledRulesets, rulesetDetails } = cachedRulesetData; + + const shouldUpdate = rulesetMap.size !== 0; + + rulesetDetails.forEach(rule => rulesetMap.set(rule.id, rule)); + + const listStatsTemplate = i18n$('perRulesetStats'); + + const initializeListEntry = (ruleset, listEntry) => { + const on = enabledRulesets.includes(ruleset.id); + if ( dom.cl.has(listEntry, 'toggled') === false ) { + dom.prop(qs$(listEntry, ':scope > .detailbar input'), 'checked', on); + } + if ( ruleset.homeURL ) { + dom.attr(qs$(listEntry, 'a.support'), 'href', ruleset.homeURL); + } + dom.cl.toggle(listEntry, 'isDefault', ruleset.enabled === true); + const stats = rulesetStats(ruleset.id); + if ( stats === undefined ) { return; } + listEntry.title = listStatsTemplate + .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) + .replace('{{filterCount}}', renderNumber(stats.filterCount)); + const fromAdmin = isAdminRuleset(ruleset.id); + dom.cl.toggle(listEntry, 'fromAdmin', fromAdmin); + dom.attr( + qs$(listEntry, '.input.checkbox input'), + 'disabled', + fromAdmin ? '' : null + ); + }; + + // Update already rendered DOM lists + if ( shouldUpdate ) { + for ( const listEntry of qsa$('#lists .listEntry[data-rulesetid]') ) { + const rulesetid = listEntry.dataset.rulesetid; + const ruleset = rulesetMap.get(rulesetid); + initializeListEntry(ruleset, listEntry); + } + updateNodes(); + renderTotalRuleCounts(); + return; + } + + const createListEntry = (listDetails, depth) => { + if ( listDetails.lists === undefined ) { + return nodeFromTemplate('listEntryLeaf', '.listEntry'); + } + if ( depth !== 0 ) { + return nodeFromTemplate('listEntryNode', '.listEntry'); + } + return nodeFromTemplate('listEntryRoot', '.listEntry'); + }; + + const createListEntries = (parentkey, listTree, depth = 0) => { + const listEntries = nodeFromTemplate('listEntries', '.listEntries'); + const treeEntries = Object.entries(listTree); + if ( depth !== 0 ) { + const reEmojis = /\p{Emoji}+/gu; + treeEntries.sort((a ,b) => { + const ap = a[1].preferred === true; + const bp = b[1].preferred === true; + if ( ap !== bp ) { return ap ? -1 : 1; } + const as = (a[1].title || a[0]).replace(reEmojis, ''); + const bs = (b[1].title || b[0]).replace(reEmojis, ''); + return as.localeCompare(bs); + }); + } + for ( const [ listkey, listDetails ] of treeEntries ) { + const listEntry = createListEntry(listDetails, depth); + if ( listDetails.lists === undefined ) { + listEntry.dataset.rulesetid = listkey; + } else { + listEntry.dataset.nodeid = listkey; + dom.cl.toggle(listEntry, 'hideUnused', hideUnusedSet.has(listkey)); + } + qs$(listEntry, ':scope > .detailbar .listname').append( + i18n.patchUnicodeFlags(listDetails.name) + ); + if ( listDetails.lists !== undefined ) { + listEntry.append(createListEntries(listkey, listDetails.lists, depth+1)); + dom.cl.toggle(listEntry, 'expanded', true/*listIsExpanded(listkey)*/); + //updateListNode(listEntry); + } else { + initializeListEntry(listDetails, listEntry); + } + listEntries.append(listEntry); + } + return listEntries; + }; + + // Visually split the filter lists in groups + const groups = new Map([ + [ + 'default', + rulesetDetails.filter(ruleset => + ruleset.group === 'default' + ), + ], [ + 'ads', + rulesetDetails.filter(ruleset => + ruleset.group === 'ads' + ), + ], [ + 'privacy', + rulesetDetails.filter(ruleset => + ruleset.group === 'privacy' + ), + ], [ + 'malware', + rulesetDetails.filter(ruleset => + ruleset.group === 'malware' + ), + ], [ + 'annoyances', + rulesetDetails.filter(ruleset => + ruleset.group === 'annoyances' + ), + ], [ + 'misc', + rulesetDetails.filter(ruleset => + ruleset.group === undefined && + typeof ruleset.lang !== 'string' + ), + ], [ + 'regions', + rulesetDetails.filter(ruleset => + ruleset.group === 'regions' + ), + ], + ]); + + dom.cl.toggle(dom.body, 'hideUnused', mustHideUnusedLists('*')); + + // Build list tree + const listTree = {}; + const groupNames = new Map(); + for ( const [ nodeid, rulesets ] of groups ) { + let name = groupNames.get(nodeid); + if ( name === undefined ) { + name = i18n$(`3pGroup${nodeid.charAt(0).toUpperCase()}${nodeid.slice(1)}`); + groupNames.set(nodeid, name); + } + const details = { name, lists: {} }; + listTree[nodeid] = details; + for ( const ruleset of rulesets ) { + if ( ruleset.parent !== undefined ) { + let lists = details.lists; + for ( const parent of ruleset.parent.split('|') ) { + if ( lists[parent] === undefined ) { + lists[parent] = { name: parent, lists: {} }; + } + lists = lists[parent].lists; + } + lists[ruleset.id] = ruleset; + } else { + details.lists[ruleset.id] = ruleset; + } + } + } + // Replace composite list with only one sublist with sublist itself + const promoteLonelySublist = (parent, depth = 0) => { + if ( Boolean(parent.lists) === false ) { return parent; } + const childKeys = Object.keys(parent.lists); + for ( const childKey of childKeys ) { + const child = promoteLonelySublist(parent.lists[childKey], depth + 1); + if ( child === parent.lists[childKey] ) { continue; } + parent.lists[child.id] = child; + delete parent.lists[childKey]; + } + if ( depth === 0 ) { return parent; } + if ( childKeys.length > 1 ) { return parent; } + return parent.lists[childKeys[0]] + }; + for ( const key of Object.keys(listTree) ) { + promoteLonelySublist(listTree[key]); + } + const listEntries = createListEntries('root', listTree); + + updateNodes(listEntries); + + dom.clear('#lists'); + qs$('#lists').append(listEntries); + + renderTotalRuleCounts(); +} + +/******************************************************************************/ + +// Collapsing of unused lists. + +function mustHideUnusedLists(which) { + const hideAll = hideUnusedSet.has('*'); + if ( which === '*' ) { return hideAll; } + return hideUnusedSet.has(which) !== hideAll; +} + +function toggleHideUnusedLists(which) { + const doesHideAll = hideUnusedSet.has('*'); + if ( which === '*' ) { + const mustHide = doesHideAll === false; + hideUnusedSet.clear(); + if ( mustHide ) { + hideUnusedSet.add(which); + } + dom.cl.toggle('#lists', 'hideUnused', mustHide); + dom.cl.toggle('.listEntry[data-nodeid]', 'hideUnused', mustHide); + } else { + const doesHide = hideUnusedSet.has(which); + if ( doesHide ) { + hideUnusedSet.delete(which); + } else { + hideUnusedSet.add(which); + } + const mustHide = doesHide === doesHideAll; + const groupSelector = `.listEntry[data-nodeid="${which}"]`; + dom.cl.toggle(groupSelector, 'hideUnused', mustHide); + } + + localWrite('hideUnusedFilterLists', Array.from(hideUnusedSet)); +} + +dom.on('#lists', 'click', '.listEntry[data-nodeid] > .detailbar, .listExpander', ev => { + toggleHideUnusedLists( + dom.attr(ev.target.closest('[data-nodeid]'), 'data-nodeid') + ); +}); + +// Initialize from saved state. +localRead('hideUnusedFilterLists').then(value => { + if ( Array.isArray(value) === false ) { return; } + hideUnusedSet = new Set(value); + for ( const listEntry of qsa$('[data-nodeid]') ) { + dom.cl.toggle(listEntry, 'hideUnused', + hideUnusedSet.has(listEntry.dataset.nodeid) + ); + } +}); + +/******************************************************************************/ + +const searchFilterLists = ( ) => { + const pattern = dom.prop('#findInLists', 'value') || ''; + dom.cl.toggle('#lists', 'searchMode', pattern !== ''); + if ( pattern === '' ) { return; } + const re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'); + for ( const listEntry of qsa$('#lists [data-role="leaf"]') ) { + if ( dom.cl.has(listEntry, 'fromAdmin') ) { continue; } + const rulesetid = listEntry.dataset.rulesetid; + const rulesetDetails = rulesetMap.get(rulesetid); + if ( rulesetDetails === undefined ) { continue; } + let haystack = perListHaystack.get(rulesetDetails); + if ( haystack === undefined ) { + haystack = [ + rulesetDetails.name, + listEntry.dataset.nodeid, + rulesetDetails.group || '', + rulesetDetails.tags || '', + ].join(' ').trim(); + perListHaystack.set(rulesetDetails, haystack); + } + dom.cl.toggle(listEntry, 'searchMatch', re.test(haystack)); + } + for ( const listEntry of qsa$('#lists .listEntry:not([data-role="leaf"])') ) { + dom.cl.toggle(listEntry, 'searchMatch', + qs$(listEntry, '.listEntries .listEntry.searchMatch') !== null + ); + } +}; + +const perListHaystack = new WeakMap(); + +dom.on('#findInLists', 'input', searchFilterLists); + +/******************************************************************************/ + +const applyEnabledRulesets = (( ) => { + const apply = async ( ) => { + dom.cl.add(dom.body, 'committing'); + + const enabledRulesets = []; + for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { + const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; + if ( checked === false ) { continue; } + const { rulesetid } = liEntry.dataset; + if ( dom.cl.has(liEntry, 'fromAdmin') ) { continue; } + enabledRulesets.push(rulesetid); + } + + dom.cl.remove('#lists .listEntry.toggled', 'toggled'); + + const modified = hashFromIterable(enabledRulesets) !== + hashFromIterable(cachedRulesetData.enabledRulesets); + if ( modified ) { + const result = await sendMessage({ + what: 'applyRulesets', + enabledRulesets, + }); + dom.text('#dnrError', result?.error || ''); + } + + dom.cl.remove(dom.body, 'committing'); + }; + + let timer; + + self.addEventListener('beforeunload', ( ) => { + if ( timer !== undefined ) { return; } + self.clearTimeout(timer); + timer = undefined; + apply(); + }); + + return function() { + if ( timer !== undefined ) { + self.clearTimeout(timer); + } + timer = self.setTimeout(( ) => { + timer = undefined; + if ( dom.cl.has(dom.body, 'committing') ) { + applyEnabledRulesets(); + } else { + apply(); + } + }, 997); + } +})(); + +dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ev => { + const input = ev.target; + const listEntry = input.closest('.listEntry'); + if ( listEntry === null ) { return; } + if ( listEntry.dataset.nodeid !== undefined ) { + const checkAll = input.checked || + dom.cl.has(qs$(listEntry, ':scope > .detailbar .checkbox'), 'partial'); + for ( const subListEntry of qsa$(listEntry, ':scope > .listEntries .listEntry[data-rulesetid]') ) { + dom.cl.add(subListEntry, 'toggled'); + dom.prop(qsa$(subListEntry, ':scope > .detailbar input'), 'checked', checkAll); + } + } else { + dom.cl.add(listEntry, 'toggled'); + } + updateNodes(); + renderTotalRuleCounts(); + applyEnabledRulesets(); +}); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,486 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { browser, sendMessage } from './ext.js'; +import { dom, qs$, qsa$ } from './dom.js'; +import { nodeFromTemplate } from './dashboard.js'; +import punycode from './punycode.js'; + +/******************************************************************************/ + +const dataContainer = qs$('section[data-pane="filters"] .hostnames'); + +/******************************************************************************/ + +function isValidHostname(hostname) { + try { + const url = new URL(`https://${hostname}/`); + return url.hostname === hostname; + } catch { + } + return false; +} + +/******************************************************************************/ + +function toPrettySelector(selector) { + if ( selector.startsWith('{') === false ) { return selector; } + try { + return JSON.parse(selector).raw; + } catch { + } + return selector; +} + +/******************************************************************************/ + +function hostnameFromNode(node) { + const li = node.closest('li.hostname'); + if ( li === null ) { return; } + const span = qs$(li, '.hostname[data-pretty]'); + if ( span === null ) { return; } + return span.dataset.ugly || undefined; +} + +function selectorFromNode(node) { + const li = node.closest('li.selector'); + if ( li === null ) { return; } + const span = qs$(li, '.selector[data-pretty]'); + if ( span === null ) { return; } + return span.dataset.ugly || undefined; +} + +function selectorsFromNode(node, all = false) { + const li = node.closest('li.hostname'); + if ( li === null ) { return []; } + const qsel = all + ? 'li.selector [contenteditable]' + : 'li.selector:not(.removed) [contenteditable]'; + return Array.from(qsa$(li, qsel)).map(a => a.dataset.ugly); +} + +/******************************************************************************/ + +async function removeSelectorsFromHostname(node) { + const hostnameNode = node.closest('li.hostname'); + if ( hostnameNode === null ) { return; } + const hostname = hostnameFromNode(hostnameNode); + if ( hostname === undefined ) { return; } + const selectors = Array.from( + qsa$(hostnameNode, 'li.selector.removed [contenteditable]') + ).map(a => a.dataset.ugly); + if ( selectors.length === 0 ) { return; } + dom.cl.add(dom.body, 'busy'); + updateContentEditability(); + await sendMessage({ what: 'removeCustomFilters', hostname, selectors }); + await debounceRenderCustomFilters(); + dom.cl.remove(dom.body, 'busy'); + updateContentEditability(); +} + +async function unremoveSelectorsFromHostname(node) { + const hostnameNode = node.closest('li.hostname'); + if ( hostnameNode === null ) { return; } + const hostname = hostnameFromNode(hostnameNode); + if ( hostname === undefined ) { return; } + const selectors = Array.from( + qsa$(hostnameNode, 'li.selector:not(.removed) [contenteditable]') + ).map(a => a.dataset.ugly); + if ( selectors.length === 0 ) { return; } + dom.cl.add(dom.body, 'busy'); + updateContentEditability(); + await sendMessage({ what: 'addCustomFilters', hostname, selectors }); + await debounceRenderCustomFilters(); + dom.cl.remove(dom.body, 'busy'); + updateContentEditability(); +} + +/******************************************************************************/ + +function dataFromDOM() { + const data = new Map(); + for ( const hostnameNode of qsa$('li.hostname') ) { + const hostname = hostnameFromNode(hostnameNode); + const selectors = []; + for ( const selectorNode of qsa$(hostnameNode, 'li.selector') ) { + selectors.push(selectorFromNode(selectorNode)); + } + data.set(hostname, selectors); + } + return data; +} + +/******************************************************************************/ + +async function renderCustomFilters() { + const data = await sendMessage({ what: 'getAllCustomFilters' }); + if ( Boolean(data) === false ) { return; } + const storedData = new Map(data); + const domData = dataFromDOM(); + const hostnames = Array.from( + new Set([ + ...Array.from(storedData.keys()), + ...Array.from(domData.keys()), + ]) + ).sort(); + const fragment = document.createDocumentFragment(); + for ( const hostname of hostnames ) { + const hostnameNode = nodeFromTemplate('customFiltersHostname'); + const label = qs$(hostnameNode, 'span.hostname'); + label.dataset.ugly = hostname; + const pretty = punycode.toUnicode(hostname); + label.dataset.pretty = pretty; + dom.text(label, pretty); + const storedSelectors = new Set(storedData.get(hostname)); + const domSelectors = new Set(domData.get(hostname)); + const selectors = Array.from( + new Set([ + ...Array.from(storedSelectors), + ...Array.from(domSelectors), + ]) + ).sort(); + const ulSelectors = qs$(hostnameNode, '.selectors'); + for ( const selector of selectors ) { + const selectorNode = nodeFromTemplate('customFiltersSelector'); + const label = qs$(selectorNode, 'span.selector'); + label.dataset.ugly = selector; + const pretty = toPrettySelector(selector); + label.dataset.pretty = pretty; + dom.text(label, pretty); + if ( storedSelectors.has(selector) === false ) { + dom.cl.add(selectorNode, 'removed'); + } + ulSelectors.append(selectorNode); + } + fragment.append(hostnameNode); + } + dom.remove('section[data-pane="filters"] .hostnames > .hostname'); + dataContainer.prepend(fragment); +} + +async function debounceRenderCustomFilters() { + let { debouncer } = debounceRenderCustomFilters; + if ( debouncer === undefined ) { + debouncer = debounceRenderCustomFilters.debouncer = {}; + debouncer.promise = new Promise(resolve => { + debouncer.resolve = resolve; + }); + } + if ( debouncer.timer !== undefined ) { + self.clearTimeout(debouncer.timer); + } + debouncer.timer = self.setTimeout(( ) => { + const { resolve } = debounceRenderCustomFilters.debouncer; + debounceRenderCustomFilters.debouncer = undefined; + renderCustomFilters().then(resolve); + }, 151); + return debouncer.promise; +} +debounceRenderCustomFilters.debouncer = undefined; + +/******************************************************************************/ + +function updateContentEditability() { + if ( dom.cl.has(dom.body, 'busy') ) { + dom.attr('[contenteditable]', 'contenteditable', 'false'); + return; + } + dom.attr('section[data-pane="filters"] li:not(.removed) [contenteditable]', + 'contenteditable', + 'plaintext-only' + ); + // No point editing a removed hostname + dom.attr('section[data-pane="filters"] li.hostname:not(:has(li.selector:not(.removed))) > div [contenteditable]', + 'contenteditable', + 'false' + ); + // No point editing a removed selector + dom.attr('section[data-pane="filters"] .selector.removed [contenteditable]', + 'contenteditable', + 'false' + ); +} + +/******************************************************************************/ + +async function onHostnameChanged(target, before, after) { + const uglyAfter = punycode.toASCII(after); + if ( isValidHostname(uglyAfter) === false ) { + target.textContent = before; + return; + } + + dom.cl.add(dom.body, 'busy'); + updateContentEditability(); + + // Remove old hostname from storage + await sendMessage({ what: 'removeAllCustomFilters', + hostname: target.dataset.ugly, + }); + + // Add selectors under new hostname to storage + target.dataset.ugly = uglyAfter; + target.dataset.pretty = after; + await sendMessage({ what: 'addCustomFilters', + hostname: hostnameFromNode(target), + selectors: selectorsFromNode(target), + }); + + await debounceRenderCustomFilters(); + dom.cl.remove(dom.body, 'busy'); + updateContentEditability(); +} + +async function onSelectorChanged(target, before, after) { + // Validate selector + const parserModule = await import('./static-filtering-parser.js'); + const compiler = new parserModule.ExtSelectorCompiler({ nativeCssHas: true }); + const result = {}; + if ( compiler.compile(after, result) === false ) { + target.textContent = before; + return; + } + + const hostname = hostnameFromNode(target); + + dom.cl.add(dom.body, 'busy'); + updateContentEditability(); + + // Remove old selector from storage + await sendMessage({ what: 'removeCustomFilters', + hostname, + selectors: [ target.dataset.ugly ], + }); + + // Add new selector to storage + target.dataset.ugly = result.compiled; + target.dataset.pretty = result.raw; + await sendMessage({ what: 'addCustomFilters', + hostname, + selectors: [ result.compiled ], + }); + + await debounceRenderCustomFilters(); + dom.cl.remove(dom.body, 'busy'); + updateContentEditability(); +} + +function onTextChanged(target) { + const before = target.dataset.pretty; + const after = target.textContent.trim(); + if ( after !== target.textContent ) { + target.textContent = after; + } + if ( after === before ) { return; } + if ( after === '' ) { + target.textContent = before; + return; + } + if ( target.matches('.hostname') ) { + onHostnameChanged(target, before, after); + } else if ( target.matches('.selector') ) { + onSelectorChanged(target, before, after); + } +} + +/******************************************************************************/ + +function startEdit(ev) { + focusedEditableContent = ev.target; +} + +function endEdit(ev) { + const { target } = ev; + if ( target.textContent !== target.dataset.pretty ) { + onTextChanged(target); + } + focusedEditableContent = null; +} + +function commitEdit(ev) { + const { target } = ev; + if ( target === focusedEditableContent ) { + if ( ev.inputType === 'insertLineBreak' ) { target.blur(); } + return; + } + onTextChanged(target); +} + +let focusedEditableContent = null; + +/******************************************************************************/ + +function onTrashClicked(ev) { + const { target } = ev; + const node = target.closest('li.selector'); + if ( node ) { + dom.cl.add(node, 'removed'); + } else { + dom.cl.add(qsa$(target.closest('li.hostname'), 'li.selector'), 'removed'); + } + removeSelectorsFromHostname(target); +} + +function onUndoClicked(ev) { + const { target } = ev; + const node = target.closest('li.selector'); + if ( node ) { + dom.cl.remove(node, 'removed'); + } else { + dom.cl.remove(qsa$(target.closest('li.hostname'), 'li.selector'), 'removed'); + } + unremoveSelectorsFromHostname(target); +} + +/******************************************************************************/ + +async function importFromText(text) { + const parserModule = await import('./static-filtering-parser.js'); + const parser = new parserModule.AstFilterParser({ nativeCssHas: true }); + const lines = text.split(/\n/); + const hostnameToSelectorsMap = new Map(); + + for ( const line of lines ) { + parser.parse(line); + if ( parser.hasError() ) { continue; } + if ( parser.isCosmeticFilter() === false ) { continue; } + if ( parser.hasOptions() === false ) { continue; } + const { compiled, exception } = parser.result; + if ( compiled === undefined ) { continue; } + if ( exception ) { continue; } + const hostnames = new Set(); + for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { + if ( bad ) { continue; } + if ( hn.includes('/') ) { continue; } + if ( hn.includes('*') ) { continue; } + if ( not ) { hostnames.length = 0; break; } + hostnames.add(hn); + } + for ( const hn of hostnames ) { + const selectors = hostnameToSelectorsMap.get(hn) || new Set(); + if ( selectors.size === 0 ) { + hostnameToSelectorsMap.set(hn, selectors) + } + selectors.add(compiled); + } + } + + if ( hostnameToSelectorsMap.size === 0 ) { return; } + + dom.cl.add(dom.body, 'busy'); + updateContentEditability(); + + const promises = []; + for ( const [ hostname, selectors ] of hostnameToSelectorsMap ) { + promises.push( + sendMessage({ what: 'addCustomFilters', + hostname, + selectors: Array.from(selectors), + }) + ); + } + await Promise.all(promises); + + await debounceRenderCustomFilters(); + dom.cl.remove(dom.body, 'busy'); + updateContentEditability(); +} + +/******************************************************************************/ + +function importFromTextarea() { + dom.prop('section[data-pane="filters"] details', 'open', false); + const textarea = qs$('section[data-pane="filters"] .importFromText textarea'); + importFromText(textarea.value); + textarea.value = ''; +} + +/******************************************************************************/ + +function importFromFile() { + const input = qs$('section[data-pane="filters"] input[type="file"]'); + input.onchange = ev => { + input.onchange = null; + const file = ev.target.files[0]; + if ( file === undefined || file.name === '' ) { return; } + const fr = new FileReader(); + fr.onload = ( ) => { + if ( typeof fr.result !== 'string' ) { return; } + importFromText(fr.result); + }; + fr.readAsText(file); + }; + // Reset to empty string, this will ensure a change event is properly + // triggered if the user pick a file, even if it's the same as the last + // one picked. + input.value = ''; + input.click(); + dom.prop('section[data-pane="filters"] details', 'open', false); +} + +/******************************************************************************/ + +function exportToFile() { + const lines = []; + for ( const hostnameNode of qsa$('.hostnames li.hostname') ) { + const hostname = punycode.toUnicode(hostnameFromNode(hostnameNode)); + const selectors = selectorsFromNode(hostnameNode); + for ( const selector of selectors ) { + lines.push(`${hostname}##${toPrettySelector(selector)}`); + } + lines.push(''); + } + const text = lines.join('\n').trim(); + if ( text.length === 0 ) { return; } + const a = document.createElement('a'); + a.href = `data:text/plain;charset=utf-8,${encodeURIComponent(text + '\n')}`; + dom.attr(a, 'download', 'my-ubol-filters.txt'); + dom.attr(a, 'type', 'text/plain'); + a.click(); + dom.prop('section[data-pane="filters"] details', 'open', false); +} + +/******************************************************************************/ + +async function start() { + renderCustomFilters(); + + dom.on(dataContainer, 'focusin', 'section[data-pane="filters"] [contenteditable]', startEdit); + dom.on(dataContainer, 'focusout', 'section[data-pane="filters"] [contenteditable]', endEdit); + dom.on(dataContainer, 'input', 'section[data-pane="filters"] [contenteditable]', commitEdit); + dom.on(dataContainer, 'click', 'section[data-pane="filters"] .remove', onTrashClicked); + dom.on(dataContainer, 'click', 'section[data-pane="filters"] .undo', onUndoClicked); + dom.on('section[data-pane="filters"] [data-i18n="addButton"]', 'click', importFromTextarea); + dom.on('section[data-pane="filters"] [data-i18n="importAndAppendButton"]', 'click', importFromFile); + dom.on('section[data-pane="filters"] [data-i18n="exportButton"]', 'click', exportToFile); + + browser.storage.local.onChanged.addListener((changes, area) => { + if ( area !== undefined && area !== 'local' ) { return; } + if ( Object.keys(changes).some(a => a.startsWith('site.')) ) { + debounceRenderCustomFilters(); + } + }); +} + +/******************************************************************************/ + +// Update pane on-demand +dom.onFirstShown(start, qs$('section[data-pane="filters"]')); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-manager.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/filter-manager.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,277 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + browser, + localKeys, + localRead, + localRemove, + localWrite, +} from './ext.js'; + +import { + intersectHostnameIters, + matchesFromHostnames, + strArrayEq, + subtractHostnameIters, +} from './utils.js'; + +import { ubolErr } from './debug.js'; + +/******************************************************************************/ + +async function flushWrites() { + while ( pendingWrites.length !== 0 ) { + const promises = pendingWrites; + pendingWrites.length = 0; + await Promise.all(promises); + } +} + +async function keysFromStorage() { + await flushWrites(); + return localKeys(); +} + +async function readFromStorage(key) { + await flushWrites(); + return localRead(key); +} + +async function writeToStorage(key, value) { + pendingWrites.push(localWrite(key, value)); +} + +async function removeFromStorage(key) { + pendingWrites.push(localRemove(key)); +} + +const pendingWrites = []; + +/******************************************************************************/ + +export async function customFiltersFromHostname(hostname) { + const promises = []; + let hn = hostname; + while ( hn !== '' ) { + promises.push(readFromStorage(`site.${hn}`)); + const pos = hn.indexOf('.'); + if ( pos === -1 ) { break; } + hn = hn.slice(pos + 1); + } + const results = await Promise.all(promises); + const out = []; + for ( let i = 0; i < promises.length; i++ ) { + const selectors = results[i]; + if ( selectors === undefined ) { continue; } + selectors.forEach(selector => { + out.push(selector.startsWith('0') ? selector.slice(1) : selector); + }); + } + return out.sort(); +} + +/******************************************************************************/ + +export async function hasCustomFilters(hostname) { + const selectors = await customFiltersFromHostname(hostname); + return selectors?.length ?? 0; +} + +/******************************************************************************/ + +async function getAllCustomFilterKeys() { + const storageKeys = await keysFromStorage() || []; + return storageKeys.filter(a => a.startsWith('site.')); +} + +/******************************************************************************/ + +export async function getAllCustomFilters() { + const collect = async key => { + const selectors = await readFromStorage(key); + return [ key.slice(5), selectors.map(a => a.startsWith('0') ? a.slice(1) : a) ]; + }; + const keys = await getAllCustomFilterKeys(); + const promises = keys.map(k => collect(k)); + return Promise.all(promises); +} + +/******************************************************************************/ + +export function startCustomFilters(tabId, frameId) { + return browser.scripting.executeScript({ + files: [ '/js/scripting/css-user.js' ], + target: { tabId, frameIds: [ frameId ] }, + injectImmediately: true, + }).catch(reason => { + ubolErr(`startCustomFilters/${reason}`); + }) +} + +export function terminateCustomFilters(tabId, frameId) { + return browser.scripting.executeScript({ + files: [ '/js/scripting/css-user-terminate.js' ], + target: { tabId, frameIds: [ frameId ] }, + injectImmediately: true, + }).catch(reason => { + ubolErr(`terminateCustomFilters/${reason}`); + }) +} + +/******************************************************************************/ + +export async function injectCustomFilters(tabId, frameId, hostname) { + const selectors = await customFiltersFromHostname(hostname); + if ( selectors.length === 0 ) { return; } + const promises = []; + const plainSelectors = selectors.filter(a => a.startsWith('{') === false); + if ( plainSelectors.length !== 0 ) { + promises.push( + browser.scripting.insertCSS({ + css: `${plainSelectors.join(',\n')}{display:none!important;}`, + origin: 'USER', + target: { tabId, frameIds: [ frameId ] }, + }).catch(reason => { + ubolErr(`injectCustomFilters/insertCSS/${reason}`); + }) + ); + } + const proceduralSelectors = selectors.filter(a => a.startsWith('{')); + if ( proceduralSelectors.length !== 0 ) { + promises.push( + browser.scripting.executeScript({ + files: [ '/js/scripting/css-procedural-api.js' ], + target: { tabId, frameIds: [ frameId ] }, + injectImmediately: true, + }).catch(reason => { + ubolErr(`injectCustomFilters/executeScript/${reason}`); + }) + ); + } + await Promise.all(promises); + return { plainSelectors, proceduralSelectors }; +} + +/******************************************************************************/ + +export async function registerCustomFilters(context) { + const siteKeys = await getAllCustomFilterKeys(); + if ( siteKeys.length === 0 ) { return; } + + const { none } = context.filteringModeDetails; + let hostnames = siteKeys.map(a => a.slice(5)); + if ( none.has('all-urls') ) { + const { basic, optimal, complete } = context.filteringModeDetails; + hostnames = intersectHostnameIters(hostnames, [ + ...basic, ...optimal, ...complete + ]); + } else if ( none.size !== 0 ) { + hostnames = [ ...subtractHostnameIters(hostnames, none) ]; + } + if ( hostnames.length === 0 ) { return; } + + const registered = context.before.get('css-user'); + context.before.delete('css-user'); // Important! + + const directive = { + id: 'css-user', + js: [ '/js/scripting/css-user.js' ], + matches: matchesFromHostnames(hostnames), + runAt: 'document_start', + }; + + if ( registered === undefined ) { + context.toAdd.push(directive); + } else if ( strArrayEq(registered.matches, directive.matches) === false ) { + context.toRemove.push('css-user'); + context.toAdd.push(directive); + } +} + +/******************************************************************************/ + +export async function addCustomFilters(hostname, toAdd) { + if ( hostname === '' ) { return false; } + const key = `site.${hostname}`; + const selectors = await readFromStorage(key) || []; + const countBefore = selectors.length; + for ( const selector of toAdd ) { + if ( selectors.includes(selector) ) { continue; } + selectors.push(selector); + } + if ( selectors.length === countBefore ) { return false; } + selectors.sort(); + writeToStorage(key, selectors); + return true; +} + +/******************************************************************************/ + +export async function removeAllCustomFilters(hostname) { + if ( hostname === '*' ) { + const keys = await getAllCustomFilterKeys(); + if ( keys.length === 0 ) { return false; } + for ( const key of keys ) { + removeFromStorage(key); + } + return true; + } + const key = `site.${hostname}`; + const selectors = await readFromStorage(key) || []; + removeFromStorage(key); + return selectors.length !== 0; +} + +export async function removeCustomFilters(hostname, selectors) { + const promises = []; + let hn = hostname; + while ( hn !== '' ) { + promises.push(removeCustomFiltersByKey(`site.${hn}`, selectors)); + const pos = hn.indexOf('.'); + if ( pos === -1 ) { break; } + hn = hn.slice(pos + 1); + } + const results = await Promise.all(promises); + return results.some(a => a); +} + +async function removeCustomFiltersByKey(key, toRemove) { + const selectors = await readFromStorage(key); + if ( selectors === undefined ) { return false; } + const beforeCount = selectors.length; + for ( const selector of toRemove ) { + let i = selectors.indexOf(selector); + if ( i === -1 ) { + i = selectors.indexOf(`0${selector}`); + if ( i === -1 ) { continue; } + } + selectors.splice(i, 1); + } + const afterCount = selectors.length; + if ( afterCount === beforeCount ) { return false; } + if ( afterCount !== 0 ) { + writeToStorage(key, selectors); + } else { + removeFromStorage(key); + } + return true; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/matched-rules.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/matched-rules.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/matched-rules.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/matched-rules.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,48 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$ } from './dom.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +const url = new URL(document.location.href); +const tabId = parseInt(url.searchParams.get('tab'), 10) || 0; + +const entries = await sendMessage({ + what: 'getMatchedRules', + tabId, +}); + +const fragment = new DocumentFragment(); +const template = qs$('#matchInfo'); +for ( const entry of (entries || []) ) { + if ( entry instanceof Object === false ) { continue; } + const row = template.content.cloneNode(true); + qs$(row, '.requestInfo').textContent = JSON.stringify(entry.request, null, 2); + qs$(row, '.ruleInfo').textContent = JSON.stringify(entry.rule, null, 2); + fragment.append(row); +} + +dom.empty('#matchedEntries'); +qs$('#matchedEntries').append(fragment); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-editor.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-editor.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-editor.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-editor.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,91 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + modesFromText, + textFromModes, +} from './mode-parser.js'; +import { i18n$ } from './i18n.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +export class ModeEditor { + constructor(editor) { + this.editor = editor; + this.bc = null; + } + + on() { + if ( this.bc !== null ) { return; } + this.bc = new self.BroadcastChannel('uBOL'); + this.bc.onmessage = ev => { + const message = ev.data; + if ( message instanceof Object === false ) { return; } + if ( message.filteringModeDetails === undefined ) { return; } + // TODO: merge with ongoing edits? + const text = textFromModes(message.filteringModeDetails); + this.editor.setEditorText(text, true); + }; + } + + off() { + if ( this.bc === null ) { return; } + this.bc.onmessage = null; + this.bc = null; + } + + async getText() { + const modes = await sendMessage({ what: 'getFilteringModeDetails' }); + return textFromModes(modes); + } + + async saveEditorText(editor) { + const { modes } = modesFromText(editor.getEditorText()); + if ( modes instanceof Object === false ) { return; } + const modesAfter = await sendMessage({ what: 'setFilteringModeDetails', modes }); + const text = textFromModes(modesAfter); + editor.setEditorText(text); + return true; + } + + updateView(editor, firstLine, lastLine) { + const { doc } = editor.view.state; + const text = doc.sliceString(firstLine.from, lastLine.to); + const { bad } = modesFromText(text, true); + if ( Array.isArray(bad) && bad.length !== 0 ) { + self.cm6.lineErrorAdd(editor.view, bad.map(i => i + firstLine.number)); + } + } + + newlineAssistant = { + 'no filtering:': ' - ', + 'basic:': ' - ', + 'optimal:': ' - ', + 'complete:': ' - ', + [`${i18n$('filteringMode0Name')}:`]: ' - ', + [`${i18n$('filteringMode1Name')}:`]: ' - ', + [`${i18n$('filteringMode2Name')}:`]: ' - ', + [`${i18n$('filteringMode3Name')}:`]: ' - ', + }; + + ioAccept = '.json,application/json'; +}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-manager.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-manager.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-manager.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-manager.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,27 +19,46 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ +import { + broadcastMessage, + hasBroadHostPermissions, + hostnamesFromMatches, + isDescendantHostnameOfIter, + toBroaderHostname, +} from './utils.js'; import { browser, - dnr, + localRead, localWrite, + sessionRead, sessionWrite, } from './ext.js'; import { - hostnamesFromMatches, - isDescendantHostnameOfIter, -} from './utils.js'; + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + +import { adminReadEx } from './admin.js'; +import { filteringModesToDNR } from './ruleset-manager.js'; -import { - TRUSTED_DIRECTIVE_BASE_RULE_ID, - BLOCKING_MODES_RULE_ID, - getDynamicRules -} from './ruleset-manager.js'; +/******************************************************************************/ + +// 0: no filtering +// 1: basic filtering +// 2: optimal filtering +// 3: complete filtering + +export const MODE_NONE = 0; +export const MODE_BASIC = 1; +export const MODE_OPTIMAL = 2; +export const MODE_COMPLETE = 3; + +export const defaultFilteringModes = { + none: [], + basic: [], + optimal: [ 'all-urls' ], + complete: [], +}; /******************************************************************************/ @@ -52,328 +71,318 @@ } }; -/******************************************************************************/ - -const eqSets = (setBefore, setAfter) => { - for ( const hn of setAfter ) { - if ( setBefore.has(hn) === false ) { return false; } - } - for ( const hn of setBefore ) { - if ( setAfter.has(hn) === false ) { return false; } +const pruneHostnameFromSet = (hostname, hnSet) => { + let hn = hostname; + for (;;) { + hnSet.delete(hn); + hn = toBroaderHostname(hn); + if ( hn === '*' ) { break; } } - return true; }; /******************************************************************************/ -// 0: no blocking => TRUSTED_DIRECTIVE_BASE_RULE_ID / requestDomains -// 1: network => BLOCKING_MODES_RULE_ID / excludedInitiatorDomains -// 2: specific content => BLOCKING_MODES_RULE_ID / excludedRequestDomains -// 3: generic content => BLOCKING_MODES_RULE_ID / initiatorDomains - -let filteringModeDetailsPromise; - -function getActualFilteringModeDetails() { - if ( filteringModeDetailsPromise !== undefined ) { - return filteringModeDetailsPromise; - } - filteringModeDetailsPromise = Promise.all([ - getDynamicRules(), - getAllTrustedSiteDirectives(), - ]).then(results => { - const [ dynamicRuleMap, trustedSiteDirectives ] = results; - const details = { - none: new Set(trustedSiteDirectives), - }; - const rule = dynamicRuleMap.get(BLOCKING_MODES_RULE_ID); - if ( rule ) { - details.network = new Set(rule.condition.excludedInitiatorDomains); - details.extendedSpecific = new Set(rule.condition.excludedRequestDomains); - details.extendedGeneric = new Set(rule.condition.initiatorDomains); - } else { - details.network = new Set([ 'all-urls' ]); - details.extendedSpecific = new Set(); - details.extendedGeneric = new Set(); - } - return details; - }); - return filteringModeDetailsPromise; -} - -/******************************************************************************/ +const serializeModeDetails = details => { + return { + none: Array.from(details.none), + basic: Array.from(details.basic), + optimal: Array.from(details.optimal), + complete: Array.from(details.complete), + }; +}; -async function getFilteringModeDetails() { - const actualDetails = await getActualFilteringModeDetails(); +const unserializeModeDetails = details => { return { - none: new Set(actualDetails.none), - network: new Set(actualDetails.network), - extendedSpecific: new Set(actualDetails.extendedSpecific), - extendedGeneric: new Set(actualDetails.extendedGeneric), + none: new Set(details.none), + basic: new Set(details.basic ?? details.network), + optimal: new Set(details.optimal ?? details.extendedSpecific), + complete: new Set(details.complete ?? details.extendedGeneric), }; -} +}; /******************************************************************************/ -async function setFilteringModeDetails(afterDetails) { - const [ dynamicRuleMap, actualDetails ] = await Promise.all([ - getDynamicRules(), - getActualFilteringModeDetails(), - ]); - const addRules = []; - const removeRuleIds = []; - if ( eqSets(actualDetails.none, afterDetails.none) === false ) { - actualDetails.none = afterDetails.none; - if ( dynamicRuleMap.has(TRUSTED_DIRECTIVE_BASE_RULE_ID) ) { - removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID); - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID); - } - const rule = { - id: TRUSTED_DIRECTIVE_BASE_RULE_ID, - action: { type: 'allowAllRequests' }, - condition: { - requestDomains: [], - resourceTypes: [ 'main_frame' ], - }, - priority: 100, - }; - if ( actualDetails.none.size ) { - rule.condition.requestDomains = Array.from(actualDetails.none); - addRules.push(rule); - dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID, rule); - } - } - if ( - eqSets(actualDetails.network, afterDetails.network) === false || - eqSets(actualDetails.extendedSpecific, afterDetails.extendedSpecific) === false || - eqSets(actualDetails.extendedGeneric, afterDetails.extendedGeneric) === false - ) { - actualDetails.network = afterDetails.network; - actualDetails.extendedSpecific = afterDetails.extendedSpecific; - actualDetails.extendedGeneric = afterDetails.extendedGeneric; - if ( dynamicRuleMap.has(BLOCKING_MODES_RULE_ID) ) { - removeRuleIds.push(BLOCKING_MODES_RULE_ID); - dynamicRuleMap.delete(BLOCKING_MODES_RULE_ID); - } - const rule = { - id: BLOCKING_MODES_RULE_ID, - action: { type: 'allow' }, - condition: { - resourceTypes: [ 'main_frame' ], - urlFilter: '||ubol-blocking-modes.invalid^', - }, - }; - if ( actualDetails.network.size ) { - rule.condition.excludedInitiatorDomains = - Array.from(actualDetails.network); - } - if ( actualDetails.extendedSpecific.size ) { - rule.condition.excludedRequestDomains = - Array.from(actualDetails.extendedSpecific); - } - if ( actualDetails.extendedGeneric.size ) { - rule.condition.initiatorDomains = - Array.from(actualDetails.extendedGeneric); - } - if ( - actualDetails.network.size || - actualDetails.extendedSpecific.size || - actualDetails.extendedGeneric.size - ) { - addRules.push(rule); - dynamicRuleMap.set(BLOCKING_MODES_RULE_ID, rule); - } - } - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } - const updateOptions = {}; - if ( addRules.length ) { - updateOptions.addRules = addRules; - } - if ( removeRuleIds.length ) { - updateOptions.removeRuleIds = removeRuleIds; +function lookupFilteringMode(filteringModes, hostname) { + const { none, basic, optimal, complete } = filteringModes; + if ( hostname === 'all-urls' ) { + if ( filteringModes.none.has('all-urls') ) { return MODE_NONE; } + if ( filteringModes.basic.has('all-urls') ) { return MODE_BASIC; } + if ( filteringModes.optimal.has('all-urls') ) { return MODE_OPTIMAL; } + if ( filteringModes.complete.has('all-urls') ) { return MODE_COMPLETE; } + return MODE_BASIC; + } + if ( none.has(hostname) ) { return MODE_NONE; } + if ( none.has('all-urls') === false ) { + if ( isDescendantHostnameOfIter(hostname, none) ) { return MODE_NONE; } + } + if ( basic.has(hostname) ) { return MODE_BASIC; } + if ( basic.has('all-urls') === false ) { + if ( isDescendantHostnameOfIter(hostname, basic) ) { return MODE_BASIC; } + } + if ( optimal.has(hostname) ) { return MODE_OPTIMAL; } + if ( optimal.has('all-urls') === false ) { + if ( isDescendantHostnameOfIter(hostname, optimal) ) { return MODE_OPTIMAL; } + } + if ( complete.has(hostname) ) { return MODE_COMPLETE; } + if ( complete.has('all-urls') === false ) { + if ( isDescendantHostnameOfIter(hostname, complete) ) { return MODE_COMPLETE; } } - return dnr.updateDynamicRules(updateOptions); + return lookupFilteringMode(filteringModes, 'all-urls'); } /******************************************************************************/ -async function getFilteringMode(hostname) { - const filteringModes = await getFilteringModeDetails(); - if ( filteringModes.none.has(hostname) ) { return 0; } - if ( filteringModes.network.has(hostname) ) { return 1; } - if ( filteringModes.extendedSpecific.has(hostname) ) { return 2; } - if ( filteringModes.extendedGeneric.has(hostname) ) { return 3; } - return getDefaultFilteringMode(); -} - -/******************************************************************************/ - -async function setFilteringMode(hostname, afterLevel) { +function applyFilteringMode(filteringModes, hostname, afterLevel) { + const defaultLevel = lookupFilteringMode(filteringModes, 'all-urls'); if ( hostname === 'all-urls' ) { - return setDefaultFilteringMode(afterLevel); + if ( afterLevel === defaultLevel ) { return afterLevel; } + switch ( afterLevel ) { + case MODE_NONE: + filteringModes.none.clear(); + filteringModes.none.add('all-urls'); + break; + case MODE_BASIC: + filteringModes.basic.clear(); + filteringModes.basic.add('all-urls'); + break; + case MODE_OPTIMAL: + filteringModes.optimal.clear(); + filteringModes.optimal.add('all-urls'); + break; + case MODE_COMPLETE: + filteringModes.complete.clear(); + filteringModes.complete.add('all-urls'); + break; + } + switch ( defaultLevel ) { + case MODE_NONE: + filteringModes.none.delete('all-urls'); + break; + case MODE_BASIC: + filteringModes.basic.delete('all-urls'); + break; + case MODE_OPTIMAL: + filteringModes.optimal.delete('all-urls'); + break; + case MODE_COMPLETE: + filteringModes.complete.delete('all-urls'); + break; + } + return lookupFilteringMode(filteringModes, 'all-urls'); } - const [ - beforeLevel, - defaultLevel, - filteringModes - ] = await Promise.all([ - getFilteringMode(hostname), - getDefaultFilteringMode(), - getFilteringModeDetails(), - ]); + const beforeLevel = lookupFilteringMode(filteringModes, hostname); if ( afterLevel === beforeLevel ) { return afterLevel; } - const { - none, - network, - extendedSpecific, - extendedGeneric, - } = filteringModes; + const { none, basic, optimal, complete } = filteringModes; switch ( beforeLevel ) { - case 0: - none.delete(hostname); + case MODE_NONE: + pruneHostnameFromSet(hostname, none); break; - case 1: - network.delete(hostname); + case MODE_BASIC: + pruneHostnameFromSet(hostname, basic); break; - case 2: - extendedSpecific.delete(hostname); + case MODE_OPTIMAL: + pruneHostnameFromSet(hostname, optimal); break; - case 3: - extendedGeneric.delete(hostname); + case MODE_COMPLETE: + pruneHostnameFromSet(hostname, complete); break; } if ( afterLevel !== defaultLevel ) { switch ( afterLevel ) { - case 0: + case MODE_NONE: if ( isDescendantHostnameOfIter(hostname, none) === false ) { filteringModes.none.add(hostname); pruneDescendantHostnamesFromSet(hostname, none); } break; - case 1: - if ( isDescendantHostnameOfIter(hostname, network) === false ) { - filteringModes.network.add(hostname); - pruneDescendantHostnamesFromSet(hostname, network); + case MODE_BASIC: + if ( isDescendantHostnameOfIter(hostname, basic) === false ) { + filteringModes.basic.add(hostname); + pruneDescendantHostnamesFromSet(hostname, basic); } break; - case 2: - if ( isDescendantHostnameOfIter(hostname, extendedSpecific) === false ) { - filteringModes.extendedSpecific.add(hostname); - pruneDescendantHostnamesFromSet(hostname, extendedSpecific); + case MODE_OPTIMAL: + if ( isDescendantHostnameOfIter(hostname, optimal) === false ) { + filteringModes.optimal.add(hostname); + pruneDescendantHostnamesFromSet(hostname, optimal); } break; - case 3: - if ( isDescendantHostnameOfIter(hostname, extendedGeneric) === false ) { - filteringModes.extendedGeneric.add(hostname); - pruneDescendantHostnamesFromSet(hostname, extendedGeneric); + case MODE_COMPLETE: + if ( isDescendantHostnameOfIter(hostname, complete) === false ) { + filteringModes.complete.add(hostname); + pruneDescendantHostnamesFromSet(hostname, complete); } break; } } - await setFilteringModeDetails(filteringModes); - return getFilteringMode(hostname); + return lookupFilteringMode(filteringModes, hostname); } /******************************************************************************/ -async function getDefaultFilteringMode() { - const filteringModes = await getFilteringModeDetails(); - if ( filteringModes.none.has('all-urls') ) { return 0; } - if ( filteringModes.network.has('all-urls') ) { return 1; } - if ( filteringModes.extendedSpecific.has('all-urls') ) { return 2; } - if ( filteringModes.extendedGeneric.has('all-urls') ) { return 3; } - return 1; +export async function readFilteringModeDetails(bypassCache = false) { + if ( bypassCache === false ) { + if ( readFilteringModeDetails.cache ) { + return readFilteringModeDetails.cache; + } + const sessionModes = await sessionRead('filteringModeDetails'); + if ( sessionModes instanceof Object ) { + readFilteringModeDetails.cache = unserializeModeDetails(sessionModes); + return readFilteringModeDetails.cache; + } + } + let [ + userModes = structuredClone(defaultFilteringModes), + adminDefaultFiltering, + adminNoFiltering, + ] = await Promise.all([ + localRead('filteringModeDetails'), + adminReadEx('defaultFiltering'), + adminReadEx('noFiltering'), + ]); + userModes = unserializeModeDetails(userModes); + if ( adminDefaultFiltering !== undefined ) { + const modefromName = { + none: MODE_NONE, + basic: MODE_BASIC, + optimal: MODE_OPTIMAL, + complete: MODE_COMPLETE, + }; + const adminDefaultFilteringMode = modefromName[adminDefaultFiltering]; + if ( adminDefaultFilteringMode !== undefined ) { + applyFilteringMode(userModes, 'all-urls', adminDefaultFilteringMode); + } + } + if ( Array.isArray(adminNoFiltering) && adminNoFiltering.length !== 0 ) { + if ( adminNoFiltering.includes('-*') ) { + userModes.none.clear(); + } + for ( const hn of adminNoFiltering ) { + if ( hn.charAt(0) === '-' ) { + userModes.none.delete(hn.slice(1)); + } else { + applyFilteringMode(userModes, hn, 0); + } + } + } + filteringModesToDNR(userModes); + sessionWrite('filteringModeDetails', serializeModeDetails(userModes)); + readFilteringModeDetails.cache = userModes; + return userModes; } /******************************************************************************/ -async function setDefaultFilteringMode(afterLevel) { - const [ beforeLevel, filteringModes ] = await Promise.all([ +async function writeFilteringModeDetails(afterDetails) { + await filteringModesToDNR(afterDetails); + const data = serializeModeDetails(afterDetails); + localWrite('filteringModeDetails', data); + sessionWrite('filteringModeDetails', data); + readFilteringModeDetails.cache = unserializeModeDetails(data); + return Promise.all([ getDefaultFilteringMode(), - getFilteringModeDetails(), - ]); - if ( afterLevel === beforeLevel ) { return afterLevel; } - switch ( afterLevel ) { - case 0: - filteringModes.none.clear(); - filteringModes.none.add('all-urls'); - break; - case 1: - filteringModes.network.clear(); - filteringModes.network.add('all-urls'); - break; - case 2: - filteringModes.extendedSpecific.clear(); - filteringModes.extendedSpecific.add('all-urls'); - break; - case 3: - filteringModes.extendedGeneric.clear(); - filteringModes.extendedGeneric.add('all-urls'); - break; - } - switch ( beforeLevel ) { - case 0: - filteringModes.none.delete('all-urls'); - break; - case 1: - filteringModes.network.delete('all-urls'); - break; - case 2: - filteringModes.extendedSpecific.delete('all-urls'); - break; - case 3: - filteringModes.extendedGeneric.delete('all-urls'); - break; - } - await setFilteringModeDetails(filteringModes); - return getDefaultFilteringMode(); + hasBroadHostPermissions(), + localWrite('filteringModeDetails', data), + sessionWrite('filteringModeDetails', data), + ]).then(results => { + broadcastMessage({ + defaultFilteringMode: results[0], + hasOmnipotence: results[1], + filteringModeDetails: readFilteringModeDetails.cache, + }); + }); +} + +/******************************************************************************/ + +export async function getFilteringModeDetails(serializable = false) { + const actualDetails = await readFilteringModeDetails(); + const out = { + none: new Set(actualDetails.none), + basic: new Set(actualDetails.basic), + optimal: new Set(actualDetails.optimal), + complete: new Set(actualDetails.complete), + }; + return serializable ? serializeModeDetails(out) : out; +} + +export async function setFilteringModeDetails(details) { + await localWrite('filteringModeDetails', serializeModeDetails(details)); + await readFilteringModeDetails(true); } /******************************************************************************/ -async function syncWithBrowserPermissions() { - const permissions = await browser.permissions.getAll(); +export async function getFilteringMode(hostname) { + const filteringModes = await getFilteringModeDetails(); + return lookupFilteringMode(filteringModes, hostname); +} + +export async function setFilteringMode(hostname, afterLevel) { + const filteringModes = await getFilteringModeDetails(); + const level = applyFilteringMode(filteringModes, hostname, afterLevel); + await writeFilteringModeDetails(filteringModes); + return level; +} + +/******************************************************************************/ + +export function getDefaultFilteringMode() { + return getFilteringMode('all-urls'); +} + +export function setDefaultFilteringMode(afterLevel) { + return setFilteringMode('all-urls', afterLevel); +} + +/******************************************************************************/ + +export async function syncWithBrowserPermissions() { + const [ + permissions, + beforeMode, + ] = await Promise.all([ + browser.permissions.getAll(), + getDefaultFilteringMode(), + ]); const allowedHostnames = new Set(hostnamesFromMatches(permissions.origins || [])); - const beforeMode = await getDefaultFilteringMode(); + const hasBroadHostPermissions = allowedHostnames.has('all-urls'); + const broadHostPermissionsToggled = + hasBroadHostPermissions !== rulesetConfig.hasBroadHostPermissions; let modified = false; - if ( beforeMode > 1 && allowedHostnames.has('all-urls') === false ) { - await setDefaultFilteringMode(1); + if ( beforeMode > MODE_BASIC && hasBroadHostPermissions === false ) { + await setDefaultFilteringMode(MODE_BASIC); modified = true; + } else if ( beforeMode === MODE_BASIC && hasBroadHostPermissions && broadHostPermissionsToggled ) { + await setDefaultFilteringMode(MODE_OPTIMAL); + modified = true; + } + if ( broadHostPermissionsToggled ) { + rulesetConfig.hasBroadHostPermissions = hasBroadHostPermissions; + saveRulesetConfig(); } const afterMode = await getDefaultFilteringMode(); - if ( afterMode > 1 ) { return false; } + if ( afterMode > MODE_BASIC ) { return afterMode !== beforeMode; } const filteringModes = await getFilteringModeDetails(); - const { extendedSpecific, extendedGeneric } = filteringModes; - for ( const hn of extendedSpecific ) { - if ( allowedHostnames.has(hn) ) { continue; } - extendedSpecific.delete(hn); - modified = true; - } - for ( const hn of extendedGeneric ) { - if ( allowedHostnames.has(hn) ) { continue; } - extendedGeneric.delete(hn); - modified = true; + if ( allowedHostnames.has('all-urls') === false ) { + const { optimal, complete } = filteringModes; + for ( const hn of optimal ) { + if ( allowedHostnames.has(hn) ) { continue; } + if ( isDescendantHostnameOfIter(hn, allowedHostnames) ) { continue; } + optimal.delete(hn); + modified = true; + } + for ( const hn of complete ) { + if ( allowedHostnames.has(hn) ) { continue; } + if ( isDescendantHostnameOfIter(hn, allowedHostnames) ) { continue; } + complete.delete(hn); + modified = true; + } + if ( modified ) { + await writeFilteringModeDetails(filteringModes); + } } - await setFilteringModeDetails(filteringModes); return modified; } /******************************************************************************/ - -async function getAllTrustedSiteDirectives() { - const dynamicRuleMap = await getDynamicRules(); - const rule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID); - if ( rule === undefined ) { return []; } - return rule.condition.requestDomains; -} - -/******************************************************************************/ - -export { - getFilteringMode, - setFilteringMode, - getDefaultFilteringMode, - setDefaultFilteringMode, - getFilteringModeDetails, - getAllTrustedSiteDirectives, - syncWithBrowserPermissions, -}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-parser.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-parser.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/mode-parser.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-parser.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,211 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { i18n$ } from './i18n.js'; +import punycode from './punycode.js'; + +/******************************************************************************/ + +function selectParser(scope, modes, node) { + const parser = perScopeParsers[scope.join('.')]; + if ( parser === undefined ) { return false; } + return parser(scope, modes, node); +} + +const validModes = [ + 'none', + 'basic', + 'optimal', + 'complete', +]; + +const uglyModeNames = { + [i18n$('filteringMode0Name')]: 'none', + [i18n$('filteringMode1Name')]: 'basic', + [i18n$('filteringMode2Name')]: 'optimal', + [i18n$('filteringMode3Name')]: 'complete', +}; + +const prettyModeNames = { + none: i18n$('filteringMode0Name'), + basic: i18n$('filteringMode1Name'), + optimal: i18n$('filteringMode2Name'), + complete: i18n$('filteringMode3Name'), +}; + +const perScopeParsers = { + '': function(scope, modes, node) { + const { key, val } = node; + switch ( key ) { + case 'none': + case 'basic': + case 'optimal': + case 'complete': + case prettyModeNames.none: + case prettyModeNames.basic: + case prettyModeNames.optimal: + case prettyModeNames.complete: { + const mode = uglyModeNames[key] || key; + if ( val !== undefined ) { return false; } + modes[mode] ||= []; + scope.push(mode); + break; + } + default: + return false; + } + return true; + }, + none: function(scope, modes, node) { + return addHostnameToMode(modes, 'none', node) + }, + basic: function(scope, modes, node) { + return addHostnameToMode(modes, 'basic', node) + }, + optimal: function(scope, modes, node) { + return addHostnameToMode(modes, 'optimal', node) + }, + complete: function(scope, modes, node) { + return addHostnameToMode(modes, 'complete', node) + }, +}; + +const addHostnameToMode = (modes, mode, node) => { + if ( node.list !== true ) { return false; } + modes[mode].push(punycode.toASCII(node.val)); +}; + +/******************************************************************************/ + +function depthFromIndent(line) { + const match = /^\s*/.exec(line); + const count = match[0].length; + if ( (count & 1) !== 0 ) { return -1; } + return count / 2; +} + +/******************************************************************************/ + +function nodeFromLine(line) { + const match = reNodeParser.exec(line); + const out = {}; + if ( match === null ) { return out; } + if ( match[1] ) { + out.list = true; + } + if ( match[4] ) { + out.val = match[4].trim(); + } else if ( match[3] ) { + out.key = match[2]; + out.val = match[3].trim(); + if ( out.val === "''" ) { out.val = '' }; + } else { + out.key = match[2]; + } + return out; +} + +const reNodeParser = /^\s*(- )?(?:([^:]+):( \S.*)?|(\S.*))$/; + +/******************************************************************************/ + +export function modesFromText(text, justbad = false) { + const lines = [ ...text.split(/\n\r|\r\n|\n|\r/) ]; + const indices = []; + for ( let i = 0; i < lines.length; i++ ) { + const line = lines[i].trimEnd(); + if ( line.trim().startsWith('#') ) { continue; } + indices.push(i); + } + // Discard leading empty lines + while ( indices.length !== 0 ) { + const s = lines[indices[0]].trim(); + if ( s.length !== 0 ) { break; } + indices.shift(); + } + // Discard trailing empty lines + while ( indices.length !== 0 ) { + const s = lines[indices.at(-1)].trim(); + if ( s.length !== 0 ) { break; } + indices.pop(); + } + // Parse + const modes = {}; + const bad = []; + const scope = []; + for ( const i of indices ) { + const line = lines[i]; + const depth = depthFromIndent(line); + if ( depth < 0 ) { + bad.push(i); + continue; + } + scope.length = depth; + const node = nodeFromLine(line); + const result = selectParser(scope, modes, node); + if ( result === false ) { + bad.push(i); + } + } + if ( justbad ) { + return bad.length !== 0 ? { bad } : { }; + } + // Ensure all modes are present, and that one mode is the default one + const seen = new Map(); + let defaultMode = ''; + for ( const mode of validModes ) { + modes[mode] = new Set(modes[mode]); + if ( modes[mode].has('all-urls') ) { + defaultMode = mode; + } + for ( const hn of modes[mode] ) { + if ( seen.has(hn) ) { + modes[seen.get(hn)].delete(hn); + } + seen.set(hn, mode); + } + } + if ( defaultMode === '' ) { + defaultMode = 'optimal'; + } + modes[defaultMode].clear(); + modes[defaultMode].add('all-urls'); + for ( const mode of validModes ) { + modes[mode] = Array.from(modes[mode]); + } + return { modes }; +} + +/******************************************************************************/ + +export function textFromModes(modes) { + const out = []; + for ( const mode of validModes ) { + const hostnames = modes[mode]; + if ( hostnames === undefined ) { continue; } + out.push(`${prettyModeNames[mode]}:`); + for ( const hn of hostnames ) { + out.push(` - ${punycode.toUnicode(hn)}`); + } + } + out.push(''); + return out.join('\n'); +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/picker-ui.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/picker-ui.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/picker-ui.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/picker-ui.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,422 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$, qsa$ } from './dom.js'; +import { localRead, localWrite } from './ext.js'; +import { ExtSelectorCompiler } from './static-filtering-parser.js'; +import { toolOverlay } from './tool-overlay-ui.js'; + +/******************************************************************************/ + +const selectorCompiler = new ExtSelectorCompiler({ nativeCssHas: true }); + +let selectorPartsDB = new Map(); +let sliderParts = []; +let sliderPartsPos = -1; + +/******************************************************************************/ + +function validateSelector(selector) { + validateSelector.error = undefined; + if ( selector === '' ) { return; } + const result = {}; + if ( selectorCompiler.compile(selector, result) ) { + return result.compiled; + } + validateSelector.error = 'Error'; +} + +/******************************************************************************/ + +function onSvgTouch(ev) { + if ( ev.type === 'touchstart' ) { + onSvgTouch.x0 = ev.touches[0].screenX; + onSvgTouch.y0 = ev.touches[0].screenY; + onSvgTouch.t0 = ev.timeStamp; + return; + } + if ( onSvgTouch.x0 === undefined ) { return; } + const stopX = ev.changedTouches[0].screenX; + const stopY = ev.changedTouches[0].screenY; + const distance = Math.sqrt( + Math.pow(stopX - onSvgTouch.x0, 2) + + Math.pow(stopY - onSvgTouch.y0, 2) + ); + // Interpret touch events as a tap if: + // - Swipe is not valid; and + // - The time between start and stop was less than 200ms. + const duration = ev.timeStamp - onSvgTouch.t0; + if ( distance >= 32 || duration >= 200 ) { return; } + onSvgClicked({ + type: 'touch', + target: ev.target, + clientX: ev.changedTouches[0].pageX, + clientY: ev.changedTouches[0].pageY, + }); + ev.preventDefault(); +} +onSvgTouch.x0 = onSvgTouch.y0 = 0; +onSvgTouch.t0 = 0; + +/******************************************************************************/ + +function onSvgClicked(ev) { + // Unpause picker if: + // - click outside dialog AND + // - not in preview mode + if ( dom.cl.has(dom.root, 'paused') ) { + if ( dom.cl.has(dom.root, 'preview') ) { + updatePreview(false); + } + unpausePicker(); + return; + } + // Force dialog to always be visible when using a touch-driven device. + if ( ev.type === 'touch' ) { + dom.cl.add(dom.root, 'show'); + } + toolOverlay.postMessage({ + what: 'candidatesAtPoint', + mx: ev.clientX, + my: ev.clientY, + broad: ev.ctrlKey, + }).then(details => { + showDialog(details); + }); +} + +/******************************************************************************/ + +function onKeyPressed(ev) { + if ( ev.key === 'Escape' || ev.which === 27 ) { + quitPicker(); + return; + } +} + +/******************************************************************************/ + +function onMinimizeClicked() { + if ( dom.cl.has(dom.root, 'paused') === false ) { + pausePicker(); + highlightCandidate(); + return; + } + dom.cl.toggle(dom.root, 'minimized'); +} + +/******************************************************************************/ + +function onFilterTextChanged() { + highlightCandidate(); +} + +/******************************************************************************/ + +function toggleView(view, persist = false) { + dom.root.dataset.view = `${view}`; + if ( persist !== true ) { return; } + localWrite('picker.view', dom.root.dataset.view); +} + +function onViewToggled(dir) { + let view = parseInt(dom.root.dataset.view, 10); + view += dir; + if ( view < 0 ) { view = 0; } + if ( view > 2 ) { view = 2; } + toggleView(view, true); +} + +/******************************************************************************/ + +function selectorFromCandidates() { + const selectorParts = []; + let liPrevious = null; + for ( const li of qsa$('#candidateFilters li') ) { + const selector = []; + for ( const span of qsa$(li, '.on[data-part]') ) { + selector.push(span.textContent); + } + if ( selector.length !== 0 ) { + if ( liPrevious !== null ) { + if ( li.previousElementSibling === liPrevious ) { + selectorParts.unshift(' > '); + } else if ( liPrevious !== li ) { + selectorParts.unshift(' '); + } + } + liPrevious = li; + selectorParts.unshift(selector.join('')); + } + } + return selectorParts.join(''); +} + +/******************************************************************************/ + +function onSliderChanged(ev) { + updateSlider(Math.round(ev.target.valueAsNumber)); +} + +function updateSlider(i) { + if ( i === sliderPartsPos ) { return; } + sliderPartsPos = i; + dom.cl.remove('#candidateFilters [data-part]', 'on'); + const parts = sliderParts[i]; + for ( const address of parts ) { + dom.cl.add(`#candidateFilters [data-part="${address}"]`, 'on'); + } + const selector = selectorFromCandidates(); + qs$('textarea').value = selector; + highlightCandidate(); +} + +/******************************************************************************/ + +function updateElementCount(details) { + const { count, error } = details; + const span = qs$('#resultsetCount'); + if ( error ) { + span.textContent = 'Error'; + span.setAttribute('title', error); + } else { + span.textContent = count; + span.removeAttribute('title'); + } + const disabled = Boolean(count) === false ? '' : null; + dom.attr('#create', 'disabled', disabled); + updatePreview(); +} + +/******************************************************************************/ + +function onPreviewClicked() { + dom.cl.toggle(dom.root, 'preview'); + updatePreview(); +} + +function updatePreview(state) { + if ( state === undefined ) { + state = dom.cl.has(dom.root, 'preview'); + } else { + dom.cl.toggle(dom.root, 'preview', state) + } + const selector = state && validateSelector(qs$('textarea').value) || ''; + return toolOverlay.postMessage({ what: 'previewSelector', selector }); +} + +/******************************************************************************/ + +async function onCreateClicked() { + const selector = validateSelector(qs$('textarea').value); + if ( selector === undefined ) { return; } + await toolOverlay.postMessage({ what: 'terminateCustomFilters' }); + await toolOverlay.sendMessage({ + what: 'addCustomFilters', + hostname: toolOverlay.url.hostname, + selectors: [ selector ], + }); + await toolOverlay.postMessage({ what: 'startCustomFilters' }); + qs$('textarea').value = ''; + dom.cl.remove(dom.root, 'preview'); + quitPicker(); +} + +/******************************************************************************/ + +function attributeNameFromSelector(part) { + const pos = part.search(/\^?=/); + return part.slice(1, pos); +} + +/******************************************************************************/ + +function onCandidateClicked(ev) { + const target = ev.target; + if ( target.matches('[data-part]') ) { + const address = target.dataset.part; + const part = selectorPartsDB.get(parseInt(address, 10)); + if ( part.startsWith('[') ) { + if ( target.textContent === part ) { + target.textContent = `[${attributeNameFromSelector(part)}]`; + dom.cl.remove(target, 'on'); + } else if ( dom.cl.has(target, 'on') ) { + target.textContent = part; + } else { + dom.cl.add(target, 'on'); + } + } else { + dom.cl.toggle(target, 'on'); + } + } else if ( target.matches('li') ) { + if ( qs$(target, ':scope > span:not(.on)') !== null ) { + dom.cl.add(qsa$(target, ':scope > [data-part]:not(.on)'), 'on'); + } else { + dom.cl.remove(qsa$(target, ':scope > [data-part]'), 'on'); + } + } + const selector = selectorFromCandidates(); + qs$('textarea').value = selector; + highlightCandidate(); +} + +/******************************************************************************/ + +function showDialog(msg) { + pausePicker(); + + /* global */selectorPartsDB = new Map(msg.partsDB); + const { listParts } = msg; + const root = qs$('#candidateFilters'); + const ul = qs$(root, 'ul'); + while ( ul.firstChild !== null ) { + ul.firstChild.remove(); + } + for ( const parts of listParts ) { + const li = document.createElement('li'); + for ( const address of parts ) { + const span = document.createElement('span'); + const part = selectorPartsDB.get(address); + span.dataset.part = address; + if ( part.startsWith('[') ) { + span.textContent = `[${attributeNameFromSelector(part)}]`; + } else { + span.textContent = part; + } + li.append(span); + } + ul.appendChild(li); + } + + /* global */sliderParts = msg.sliderParts; + /* global */sliderPartsPos = -1; + const slider = qs$('#slider'); + const last = sliderParts.length - 1; + dom.attr(slider, 'max', last); + dom.attr(slider, 'value', last); + dom.attr(slider, 'disabled', last !== 0 ? null : ''); + slider.value = last; + updateSlider(last); +} + +/******************************************************************************/ + +function highlightCandidate() { + const selector = validateSelector(qs$('textarea').value); + if ( selector === undefined ) { + toolOverlay.postMessage({ what: 'unhighlight' }); + updateElementCount({ count: 0, error: validateSelector.error }); + return; + } + toolOverlay.postMessage({ + what: 'highlightFromSelector', + selector, + }).then(result => { + updateElementCount(result); + }); +} + +/******************************************************************************* + * + * paused: + * - select element mode disabled + * - preview mode enabled or disabled + * - dialog unminimized + * + * unpaused: + * - select element mode enabled + * - preview mode disabled + * - dialog minimized + * + * */ + +function pausePicker() { + dom.cl.add(dom.root, 'paused'); + dom.cl.remove(dom.root, 'minimized'); + toolOverlay.highlightElementUnderMouse(false); +} + +function unpausePicker() { + dom.cl.remove(dom.root, 'paused', 'preview'); + dom.cl.add(dom.root, 'minimized'); + updatePreview(false); + toolOverlay.highlightElementUnderMouse(true); +} + +/******************************************************************************/ + +function startPicker() { + toolOverlay.postMessage({ what: 'startTool' }); + + localRead('picker.view').then(value => { + if ( Boolean(value) === false ) { return; } + toggleView(value); + }); + + self.addEventListener('keydown', onKeyPressed, true); + dom.on('svg#overlay', 'click', onSvgClicked); + dom.on('svg#overlay', 'touchstart', onSvgTouch, { passive: true }); + dom.on('svg#overlay', 'touchend', onSvgTouch); + dom.on('#minimize', 'click', onMinimizeClicked); + dom.on('textarea', 'input', onFilterTextChanged); + dom.on('#quit', 'click', quitPicker); + dom.on('#slider', 'input', onSliderChanged); + dom.on('#pick', 'click', resetPicker); + dom.on('#preview', 'click', onPreviewClicked); + dom.on('#moreOrLess > span:first-of-type', 'click', ( ) => { onViewToggled(1); }); + dom.on('#moreOrLess > span:last-of-type', 'click', ( ) => { onViewToggled(-1); }); + dom.on('#create', 'click', ( ) => { onCreateClicked(); }); + dom.on('#candidateFilters ul', 'click', onCandidateClicked); + toolOverlay.highlightElementUnderMouse(true); +} + +/******************************************************************************/ + +function quitPicker() { + updatePreview(false); + toolOverlay.stop(); +} + +/******************************************************************************/ + +function resetPicker() { + toolOverlay.postMessage({ what: 'unhighlight' }); + unpausePicker(); +} + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'startTool': + startPicker(); + break; + default: + break; + } +} + +/******************************************************************************/ + +// Wait for the content script to establish communication +toolOverlay.start(onMessage); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/popup.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/popup.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/popup.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/popup.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,27 +19,23 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - import { browser, runtime, sendMessage } from './ext.js'; import { dom, qs$ } from './dom.js'; import { i18n$ } from './i18n.js'; -import { simpleStorage } from './storage.js'; +import punycode from './punycode.js'; /******************************************************************************/ const popupPanelData = {}; const currentTab = {}; -let tabHostname = ''; +const tabURL = new URL(runtime.getURL('/')); /******************************************************************************/ -function normalizedHostname(hn) { - return hn.replace(/^www\./, ''); +function renderAdminRules() { + const { disabledFeatures: forbid = [] } = popupPanelData; + if ( forbid.length === 0 ) { return; } + dom.body.dataset.forbid = forbid.join(' '); } /******************************************************************************/ @@ -60,18 +56,28 @@ } async function commitFilteringMode() { - if ( tabHostname === '' ) { return; } - const targetHostname = normalizedHostname(tabHostname); + if ( tabURL.hostname === '' ) { return; } + const targetHostname = tabURL.hostname; const modeSlider = qs$('.filteringModeSlider'); const afterLevel = parseInt(modeSlider.dataset.level, 10); const beforeLevel = parseInt(modeSlider.dataset.levelBefore, 10); if ( afterLevel > 1 ) { + if ( beforeLevel <= 1 ) { + sendMessage({ + what: 'setPendingFilteringMode', + tabId: currentTab.id, + url: tabURL.href, + hostname: targetHostname, + beforeLevel, + afterLevel, + }); + } let granted = false; try { granted = await browser.permissions.request({ origins: [ `*://*.${targetHostname}/*` ], }); - } catch(ex) { + } catch { } if ( granted !== true ) { setFilteringMode(beforeLevel); @@ -91,7 +97,14 @@ setFilteringMode(actualLevel); } if ( actualLevel !== beforeLevel && popupPanelData.autoReload ) { - browser.tabs.reload(currentTab.id); + const justReload = tabURL.href === currentTab.url; + self.setTimeout(( ) => { + if ( justReload ) { + browser.tabs.reload(currentTab.id); + } else { + browser.tabs.update(currentTab.id, { url: tabURL.href }); + } + }, 437); } } @@ -176,93 +189,104 @@ } ); -dom.on( - '.filteringModeSlider', - 'mouseenter', - '.filteringModeSlider span[data-level]', - ev => { - const span = ev.target; - const level = parseInt(span.dataset.level, 10); - dom.text( - '#filteringModeText > span:nth-of-type(2)', - i18n$(`filteringMode${level}Name`) - ); - } -); +if ( dom.cl.has(dom.html, 'mobile') === false ) { + dom.on('.filteringModeSlider', + 'mouseenter', + '.filteringModeSlider span[data-level]', + ev => { + const span = ev.target; + const level = parseInt(span.dataset.level, 10); + dom.text('#filteringModeText > span:nth-of-type(2)', + i18n$(`filteringMode${level}Name`) + ); + } + ); -dom.on( - '.filteringModeSlider', - 'mouseleave', - '.filteringModeSlider span[data-level]', - ( ) => { - dom.text('#filteringModeText > span:nth-of-type(2)', ''); - } -); + dom.on('.filteringModeSlider', + 'mouseleave', + '.filteringModeSlider span[data-level]', + ( ) => { + dom.text('#filteringModeText > span:nth-of-type(2)', ''); + } + ); +} /******************************************************************************/ -// The popup panel is made of sections. Visibility of sections can be -// toggled on/off. - -const maxNumberOfSections = 2; +dom.on('#gotoMatchedRules', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + if ( ev.button !== 0 ) { return; } + sendMessage({ + what: 'showMatchedRules', + tabId: currentTab.id, + }); +}); -const sectionBitsFromAttribute = function() { - const value = dom.body.dataset.section; - if ( value === '' ) { return 0; } - let bits = 0; - for ( const c of value.split(' ') ) { - bits |= 1 << (c.charCodeAt(0) - 97); - } - return bits; -}; +/******************************************************************************/ -const sectionBitsToAttribute = function(bits) { - if ( typeof bits !== 'number' ) { return; } - if ( isNaN(bits) ) { return; } - const value = []; - for ( let i = 0; i < maxNumberOfSections; i++ ) { - const bit = 1 << i; - if ( (bits & bit) === 0 ) { continue; } - value.push(String.fromCharCode(97 + i)); +dom.on('#gotoReport', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + let url; + try { + url = new URL(currentTab.url); + } catch { } - dom.body.dataset.section = value.join(' '); -}; + if ( url === undefined ) { return; } + const reportURL = new URL(runtime.getURL('/report.html')); + reportURL.searchParams.set('url', tabURL.href); + reportURL.searchParams.set('mode', popupPanelData.level); + sendMessage({ + what: 'gotoURL', + url: `${reportURL.pathname}${reportURL.search}`, + }); +}); -async function toggleSections(more) { - let currentBits = sectionBitsFromAttribute(); - let newBits = currentBits; - for ( let i = 0; i < maxNumberOfSections; i++ ) { - const bit = 1 << (more ? i : maxNumberOfSections - i - 1); - if ( more ) { - newBits |= bit; - } else { - newBits &= ~bit; - } - if ( newBits !== currentBits ) { break; } - } - if ( newBits === currentBits ) { return; } - sectionBitsToAttribute(newBits); - simpleStorage.setItem('popupPanelSections', newBits); -} +/******************************************************************************/ -simpleStorage.getItem('popupPanelSections').then(s => { - sectionBitsToAttribute(parseInt(s, 10) || 0); +dom.on('#gotoDashboard', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + if ( ev.button !== 0 ) { return; } + runtime.openOptionsPage(); }); -dom.on('#moreButton', 'click', ( ) => { - toggleSections(true); +/******************************************************************************/ + +dom.on('#gotoZapper', 'click', ( ) => { + if ( browser.scripting === undefined ) { return; } + browser.scripting.executeScript({ + files: [ '/js/scripting/tool-overlay.js', '/js/scripting/zapper.js' ], + target: { tabId: currentTab.id }, + }); + self.close(); }); -dom.on('#lessButton', 'click', ( ) => { - toggleSections(false); +/******************************************************************************/ + +dom.on('#gotoPicker', 'click', ( ) => { + if ( browser.scripting === undefined ) { return; } + browser.scripting.executeScript({ + files: [ + '/js/scripting/css-procedural-api.js', + '/js/scripting/tool-overlay.js', + '/js/scripting/picker.js', + ], + target: { tabId: currentTab.id }, + }); + self.close(); }); /******************************************************************************/ -dom.on('[data-i18n-title="popupTipDashboard"]', 'click', ev => { - if ( ev.isTrusted !== true ) { return; } - if ( ev.button !== 0 ) { return; } - runtime.openOptionsPage(); +dom.on('#gotoUnpicker', 'click', ( ) => { + if ( browser.scripting === undefined ) { return; } + browser.scripting.executeScript({ + files: [ + '/js/scripting/tool-overlay.js', + '/js/scripting/unpicker.js', + ], + target: { tabId: currentTab.id }, + }); + self.close(); }); /******************************************************************************/ @@ -277,51 +301,44 @@ let url; try { + const strictBlockURL = runtime.getURL('/strictblock.'); url = new URL(currentTab.url); - tabHostname = url.hostname || ''; - } catch(ex) { + if ( url.href.startsWith(strictBlockURL) ) { + url = new URL(url.hash.slice(1)); + } + tabURL.href = url.href || ''; + } catch { + return false; } if ( url !== undefined ) { const response = await sendMessage({ what: 'popupPanelData', origin: url.origin, - hostname: normalizedHostname(tabHostname), + hostname: tabURL.hostname, }); if ( response instanceof Object ) { Object.assign(popupPanelData, response); } } + renderAdminRules(); + setFilteringMode(popupPanelData.level); - dom.text('#hostname', tabHostname); + dom.text('#hostname', punycode.toUnicode(tabURL.hostname)); - const parent = qs$('#rulesetStats'); - for ( const details of popupPanelData.rulesetDetails || [] ) { - const div = dom.clone('#templates .rulesetDetails'); - dom.text(qs$(div, 'h1'), details.name); - const { rules, filters, css } = details; - let ruleCount = rules.plain + rules.regex; - if ( popupPanelData.hasOmnipotence ) { - ruleCount += rules.removeparam + rules.redirect + rules.csp; - } - let specificCount = 0; - if ( css.specific instanceof Object ) { - specificCount += css.specific.domainBased; - specificCount += css.specific.entityBased; - } - dom.text( - qs$(div, 'p'), - i18n$('perRulesetStats') - .replace('{{ruleCount}}', ruleCount.toLocaleString()) - .replace('{{filterCount}}', filters.accepted.toLocaleString()) - .replace('{{cssSpecificCount}}', specificCount.toLocaleString()) - ); - parent.append(div); - } + dom.cl.toggle('#gotoMatchedRules', 'enabled', + popupPanelData.isSideloaded === true && + popupPanelData.developerMode && + typeof currentTab.id === 'number' && + isNaN(currentTab.id) === false + ); + + const isHTTP = url.protocol === 'http:' || url.protocol === 'https:'; + dom.cl.toggle(dom.root, 'isHTTP', isHTTP); - dom.cl.remove(dom.body, 'loading'); + dom.cl.toggle('#gotoUnpicker', 'enabled', popupPanelData.hasCustomFilters); return true; } @@ -329,8 +346,10 @@ async function tryInit() { try { await init(); - } catch(ex) { + } catch { setTimeout(tryInit, 100); + } finally { + dom.cl.remove(dom.body, 'loading'); } } diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/report.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/report.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/report.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/report.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,120 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$ } from './dom.js'; +import { getTroubleshootingInfo } from './troubleshooting.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +const reportedPage = (( ) => { + const url = new URL(window.location.href); + try { + const pageURL = url.searchParams.get('url'); + if ( pageURL === null ) { return null; } + const parsedURL = new URL(pageURL); + parsedURL.username = ''; + parsedURL.password = ''; + parsedURL.hash = ''; + const select = qs$('select[name="url"]'); + dom.text(select.options[0], parsedURL.href); + if ( parsedURL.search !== '' ) { + const option = dom.create('option'); + parsedURL.search = ''; + dom.text(option, parsedURL.href); + select.append(option); + } + if ( parsedURL.pathname !== '/' ) { + const option = dom.create('option'); + parsedURL.pathname = ''; + dom.text(option, parsedURL.href); + select.append(option); + } + return { + hostname: parsedURL.hostname.replace(/^(m|mobile|www)\./, ''), + mode: url.searchParams.get('mode'), + }; + } catch { + } + return null; +})(); + +/******************************************************************************/ + +function reportSpecificFilterType() { + return qs$('select[name="type"]').value; +} + +/******************************************************************************/ + +async function reportSpecificFilterIssue() { + const githubURL = new URL( + 'https://github.com/uBlockOrigin/uAssets/issues/new?template=specific_report_from_ubol.yml' + ); + const issueType = reportSpecificFilterType(); + let title = `${reportedPage.hostname}: ${issueType}`; + if ( qs$('#isNSFW').checked ) { + title = `[nsfw] ${title}`; + } + githubURL.searchParams.set('title', title); + githubURL.searchParams.set( + 'url_address_of_the_web_page', + '`' + qs$('select[name="url"]').value + '`' + ); + githubURL.searchParams.set('category', issueType); + + const configBody = [ + '```yaml', + qs$('[data-i18n="supportS5H"] + pre').textContent, + '```', + '', + ].join('\n'); + githubURL.searchParams.set('configuration', configBody); + sendMessage({ what: 'gotoURL', url: githubURL.href }); +} + +/******************************************************************************/ + +getTroubleshootingInfo(reportedPage.mode).then(config => { + qs$('[data-i18n="supportS5H"] + pre').textContent = config; + + dom.on('[data-url]', 'click', ev => { + const elem = ev.target.closest('[data-url]'); + const url = dom.attr(elem, 'data-url'); + if ( typeof url !== 'string' || url === '' ) { return; } + sendMessage({ what: 'gotoURL', url }); + ev.preventDefault(); + }); + + if ( reportedPage !== null ) { + dom.on('[data-i18n="supportReportSpecificButton"]', 'click', ev => { + reportSpecificFilterIssue(); + ev.preventDefault(); + }); + + dom.on('[data-i18n="supportFindSpecificButton"]', 'click', ev => { + const url = new URL('https://github.com/uBlockOrigin/uAssets/issues'); + url.searchParams.set('q', `is:issue sort:updated-desc "${reportedPage.hostname}" in:title`); + sendMessage({ what: 'gotoURL', url: url.href }); + ev.preventDefault(); + }); + } +}); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,104 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { runtime, sendMessage } from './ext.js'; +import { DNREditor } from './dnr-editor.js'; +import { i18n$ } from './i18n.js'; +import { normalizeDNRRules } from './ext-compat.js'; +import { textFromRules } from './dnr-parser.js'; + +/******************************************************************************/ + +export class ReadOnlyDNREditor extends DNREditor { + async getText(hint) { + if ( hint === 'dnr.ro.dynamic' ) { + const rules = await sendMessage({ what: 'getEffectiveDynamicRules' }); + if ( Array.isArray(rules) === false ) { return; } + this.id = 'dynamic'; + this.count = rules.length; + return textFromRules(rules, { keepId: true }); + } + if ( hint === 'dnr.ro.session' ) { + const rules = await sendMessage({ what: 'getEffectiveSessionRules' }); + if ( Array.isArray(rules) === false ) { return; } + this.id = 'session'; + this.count = rules.length; + return textFromRules(rules, { keepId: true }); + } + const match = /^dnr\.ro\.(.+)$/.exec(hint); + if ( match === null ) { return; } + this.id = match[1]; + const allRulesetDetails = await sendMessage({ what: 'getRulesetDetails' }); + const rulesetDetails = allRulesetDetails.find(a => a.id === this.id); + if ( rulesetDetails === undefined ) { return; } + const manifestRulesets = runtime.getManifest().declarative_net_request.rule_resources; + const mainPathMap = new Map( + manifestRulesets.map(({ id, path }) => [ id, path ]) + ); + const realms = { + plain: 'main', + regex: 'regex', + }; + const promises = []; + for ( const [ realm, dir ] of Object.entries(realms) ) { + if ( Boolean(rulesetDetails.rules?.[realm]) === false ) { continue; } + const url = dir === 'main' + ? mainPathMap.get(this.id) + : `./rulesets/${dir}/${this.id}.json`; + promises.push( + fetch(url).then(response => + response.json() + ).then(rules => + normalizeDNRRules(rules) + ) + ); + } + const parts = await Promise.all(promises); + const allRules = []; + for ( const rules of parts ) { + for ( const rule of rules ) { + allRules.push(rule); + } + } + this.count = allRules.length; + return textFromRules(allRules, { keepId: true }); + } + + on(editor) { + if ( typeof this.count !== 'number' ) { + return editor.updateSummaryPanel(null); + } + const template = document.querySelector('template.ro-summary-panel'); + const fragment = template.content.cloneNode(true); + const root = fragment.querySelector('.summary-panel'); + root.textContent = i18n$('dnrRulesCountInfo') + .replace('{count}', (this.count || 0).toLocaleString()) + editor.updateSummaryPanel(root); + } + + off(editor) { + editor.updateSummaryPanel(null); + } + + exportToFile(text) { + return super.exportToFile(text, `${this.id}-dnr-ruleset.json`); + } +}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ruleset-manager.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ruleset-manager.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ruleset-manager.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ruleset-manager.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,87 +19,125 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ +import { + i18n, + localRead, localRemove, localWrite, + runtime, + sessionRead, sessionRemove, sessionWrite, + webextFlavor, +} from './ext.js'; + +import { + rulesetConfig, + saveRulesetConfig, +} from './config.js'; +import { ubolErr, ubolLog } from './debug.js'; -'use strict'; - -/******************************************************************************/ - -import { browser, dnr, i18n } from './ext.js'; +import { dnr } from './ext-compat.js'; import { fetchJSON } from './fetch.js'; +import { getAdminRulesets } from './admin.js'; +import { hasBroadHostPermissions } from './utils.js'; +import { rulesFromText } from './dnr-parser.js'; /******************************************************************************/ -const RULE_REALM_SIZE = 1000000; -const REGEXES_REALM_START = 1000000; -const REGEXES_REALM_END = REGEXES_REALM_START + RULE_REALM_SIZE; -const REMOVEPARAMS_REALM_START = REGEXES_REALM_END; -const REMOVEPARAMS_REALM_END = REMOVEPARAMS_REALM_START + RULE_REALM_SIZE; -const REDIRECT_REALM_START = REMOVEPARAMS_REALM_END; -const REDIRECT_REALM_END = REDIRECT_REALM_START + RULE_REALM_SIZE; -const CSP_REALM_START = REDIRECT_REALM_END; -const CSP_REALM_END = CSP_REALM_START + RULE_REALM_SIZE; +const SPECIAL_RULES_REALM = 5000000; +const USER_RULES_BASE_RULE_ID = 9000000; +const USER_RULES_PRIORITY = 1000000; const TRUSTED_DIRECTIVE_BASE_RULE_ID = 8000000; -const BLOCKING_MODES_RULE_ID = TRUSTED_DIRECTIVE_BASE_RULE_ID + 1; -const CURRENT_CONFIG_BASE_RULE_ID = 9000000; +const TRUSTED_DIRECTIVE_PRIORITY = USER_RULES_PRIORITY + 1000000; +const STRICTBLOCK_PRIORITY = 29; + +let dynamicRegexCount = 0; +let sessionRegexCount = 0; /******************************************************************************/ -let rulesetDetailsPromise; +const isStrictBlockRule = rule => { + if ( rule.priority !== STRICTBLOCK_PRIORITY ) { return false; } + if ( rule.condition?.resourceTypes === undefined ) { return false; } + if ( rule.condition.resourceTypes.length !== 1 ) { return false; } + if ( rule.condition.resourceTypes[0] !== 'main_frame' ) { return false; } + if ( rule.action.type === 'redirect' ) { + const substitution = rule.action.redirect.regexSubstitution; + return substitution !== undefined && + substitution.includes('/strictblock.'); + } + if ( rule.action.type === 'allow' ) { + return Array.isArray(rule.condition?.requestDomains); + } + return false; +}; + +/******************************************************************************/ function getRulesetDetails() { - if ( rulesetDetailsPromise !== undefined ) { - return rulesetDetailsPromise; + if ( getRulesetDetails.rulesetDetailsPromise !== undefined ) { + return getRulesetDetails.rulesetDetailsPromise; } - rulesetDetailsPromise = fetchJSON('/rulesets/ruleset-details').then(entries => { - const map = new Map( - entries.map(entry => [ entry.id, entry ]) - ); - return map; - }); - return rulesetDetailsPromise; + getRulesetDetails.rulesetDetailsPromise = + fetchJSON('/rulesets/ruleset-details').then(entries => { + const rulesMap = new Map(entries.map(entry => [ entry.id, entry ])); + return rulesMap; + }); + return getRulesetDetails.rulesetDetailsPromise; } /******************************************************************************/ -let dynamicRuleMapPromise; +async function pruneInvalidRegexRules(realm, rulesIn, rejected = []) { + const validateRegex = regex => { + return dnr.isRegexSupported({ regex, isCaseSensitive: false }).then(result => { + pruneInvalidRegexRules.validated.set(regex, result?.reason || true); + if ( result.isSupported ) { return true; } + rejected.push({ regex, reason: result?.reason }); + return false; + }); + }; -function getDynamicRules() { - if ( dynamicRuleMapPromise !== undefined ) { - return dynamicRuleMapPromise; + // Validate regex-based rules + const toCheck = []; + for ( const rule of rulesIn ) { + if ( rule.condition?.regexFilter === undefined ) { + toCheck.push(true); + continue; + } + const { regexFilter } = rule.condition; + const reason = pruneInvalidRegexRules.validated.get(regexFilter); + if ( reason !== undefined ) { + toCheck.push(reason === true); + if ( reason === true ) { continue; } + rejected.push({ regex: regexFilter, reason }); + continue; + } + toCheck.push(validateRegex(regexFilter)); } - dynamicRuleMapPromise = dnr.getDynamicRules().then(rules => { - const map = new Map( - rules.map(rule => [ rule.id, rule ]) + + // Collate results + const isValid = await Promise.all(toCheck); + + if ( rejected.length !== 0 ) { + ubolLog(`${realm} realm: rejected regexes:\n`, + rejected.map(e => `${e.regex} → ${e.reason}`).join('\n') ); - console.info(`Dynamic rule count: ${map.size}`); - console.info(`Available dynamic rule count: ${dnr.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES - map.size}`); - return map; - }); - return dynamicRuleMapPromise; + } + + return rulesIn.filter((v, i) => isValid[i]); } +pruneInvalidRegexRules.validated = new Map(); /******************************************************************************/ -async function updateRegexRules() { - const [ - rulesetDetails, - dynamicRules - ] = await Promise.all([ - getEnabledRulesetsDetails(), - dnr.getDynamicRules(), - ]); +async function updateRegexRules(currentRules, addRules, removeRuleIds) { + // Remove existing regex-related block rules + for ( const rule of currentRules ) { + if ( rule.id === 0 ) { continue; } + if ( rule.id >= SPECIAL_RULES_REALM ) { continue; } + if ( rule.condition.regexFilter === undefined ) { continue; } + removeRuleIds.push(rule.id); + } - // Avoid testing already tested regexes - const validRegexSet = new Set( - dynamicRules.filter(rule => - rule.condition?.regexFilter && true || false - ).map(rule => - rule.condition.regexFilter - ) - ); - const allRules = []; - const toCheck = []; + const rulesetDetails = await getEnabledRulesetsDetails(); // Fetch regexes for all enabled rulesets const toFetch = []; @@ -109,318 +147,269 @@ } const regexRulesets = await Promise.all(toFetch); - // Validate fetched regexes - let regexRuleId = REGEXES_REALM_START; + // Collate all regexes rules + const allRules = []; for ( const rules of regexRulesets ) { if ( Array.isArray(rules) === false ) { continue; } for ( const rule of rules ) { - rule.id = regexRuleId++; - const { - regexFilter: regex, - isUrlFilterCaseSensitive: isCaseSensitive - } = rule.condition; allRules.push(rule); - toCheck.push( - validRegexSet.has(regex) - ? { isSupported: true } - : dnr.isRegexSupported({ regex, isCaseSensitive }) - ); } } + if ( allRules.length === 0 ) { return; } - // Collate results - const results = await Promise.all(toCheck); - const newRules = []; - const rejectedRegexRules = []; - for ( let i = 0; i < allRules.length; i++ ) { - const rule = allRules[i]; - const result = results[i]; - if ( result instanceof Object && result.isSupported ) { - newRules.push(rule); - } else { - rejectedRegexRules.push(rule); - } - } - if ( rejectedRegexRules.length !== 0 ) { - console.info( - 'Rejected regexes:', - rejectedRegexRules.map(rule => rule.condition.regexFilter) - ); - } + const validRules = await pruneInvalidRegexRules('regexes', allRules); + if ( validRules.length === 0 ) { return; } + + ubolLog(`Add ${validRules.length} DNR regex rules`); + addRules.push(...validRules); +} - // Add validated regex rules to dynamic ruleset without affecting rules - // outside regex rules realm. - const dynamicRuleMap = await getDynamicRules(); - const newRuleMap = new Map(newRules.map(rule => [ rule.id, rule ])); +/******************************************************************************/ + +async function updateDynamicRules() { + const currentRules = await dnr.getDynamicRules(); const addRules = []; const removeRuleIds = []; - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REGEXES_REALM_START ) { continue; } - if ( oldRule.id >= REGEXES_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } - - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); + // Remove potentially left-over rules from previous version + for ( const rule of currentRules ) { + if ( rule.id >= SPECIAL_RULES_REALM ) { continue; } + removeRuleIds.push(rule.id); + rule.id = 0; } + await updateRegexRules(currentRules, addRules, removeRuleIds); if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } - if ( removeRuleIds.length !== 0 ) { - console.info(`Remove ${removeRuleIds.length} DNR regex rules`); + dynamicRegexCount = 0; + let ruleId = 1; + for ( const rule of addRules ) { + if ( rule?.condition.regexFilter ) { dynamicRegexCount += 1; } + rule.id = ruleId++; + } + if ( dynamicRegexCount !== 0 ) { + ubolLog(`Using ${dynamicRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} dynamic regex-based DNR rules`); + } + + const response = {}; + + try { + await dnr.updateDynamicRules({ addRules, removeRuleIds }); + if ( removeRuleIds.length !== 0 ) { + ubolLog(`Remove ${removeRuleIds.length} dynamic DNR rules`); + } + if ( addRules.length !== 0 ) { + ubolLog(`Add ${addRules.length} dynamic DNR rules`); + } + } catch(reason) { + ubolErr(`updateDynamicRules/${reason}`); + response.error = `${reason}`; } - if ( addRules.length !== 0 ) { - console.info(`Add ${addRules.length} DNR regex rules`); + + const result = await updateSessionRules(); + if ( result?.error ) { + response.error ||= result.error; } - return dnr.updateDynamicRules({ addRules, removeRuleIds }); + return response; } /******************************************************************************/ -async function updateRemoveparamRules() { - const [ - hasOmnipotence, - rulesetDetails, - dynamicRuleMap, - ] = await Promise.all([ - browser.permissions.contains({ origins: [ '' ] }), - getEnabledRulesetsDetails(), - getDynamicRules(), - ]); - - // Fetch removeparam rules for all enabled rulesets - const toFetch = []; - for ( const details of rulesetDetails ) { - if ( details.rules.removeparam === 0 ) { continue; } - toFetch.push(fetchJSON(`/rulesets/removeparam/${details.id}`)); - } - const removeparamRulesets = await Promise.all(toFetch); - - // Removeparam rules can only be enforced with omnipotence - const newRules = []; - if ( hasOmnipotence ) { - let removeparamRuleId = REMOVEPARAMS_REALM_START; - for ( const rules of removeparamRulesets ) { - if ( Array.isArray(rules) === false ) { continue; } - for ( const rule of rules ) { - rule.id = removeparamRuleId++; - newRules.push(rule); - } - } - } - - // Add removeparam rules to dynamic ruleset without affecting rules - // outside removeparam rules realm. - const newRuleMap = new Map(newRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REMOVEPARAMS_REALM_START ) { continue; } - if ( oldRule.id >= REMOVEPARAMS_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } - - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); +async function getEffectiveDynamicRules() { + const allRules = await dnr.getDynamicRules(); + const dynamicRules = []; + for ( const rule of allRules ) { + if ( rule.id >= USER_RULES_BASE_RULE_ID ) { continue; } + dynamicRules.push(rule); } + return dynamicRules; +} - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } +/******************************************************************************/ - if ( removeRuleIds.length !== 0 ) { - console.info(`Remove ${removeRuleIds.length} DNR removeparam rules`); +async function updateStrictBlockRules(currentRules, addRules, removeRuleIds) { + // Remove existing strictblock-related rules + for ( const rule of currentRules ) { + if ( isStrictBlockRule(rule) === false ) { continue; } + removeRuleIds.push(rule.id); } - if ( addRules.length !== 0 ) { - console.info(`Add ${addRules.length} DNR removeparam rules`); - } - - return dnr.updateDynamicRules({ addRules, removeRuleIds }); -} -/******************************************************************************/ + if ( rulesetConfig.strictBlockMode === false ) { return; } + + // https://github.com/uBlockOrigin/uBOL-home/issues/428#issuecomment-3172663563 + // https://bugs.webkit.org/show_bug.cgi?id=298199 + // https://developer.apple.com/forums/thread/756214 + if ( webextFlavor === 'safari' ) { return; } -async function updateRedirectRules() { const [ hasOmnipotence, rulesetDetails, - dynamicRuleMap, + permanentlyExcluded = [], + temporarilyExcluded = [], ] = await Promise.all([ - browser.permissions.contains({ origins: [ '' ] }), + hasBroadHostPermissions(), getEnabledRulesetsDetails(), - getDynamicRules(), + localRead('excludedStrictBlockHostnames'), + sessionRead('excludedStrictBlockHostnames'), ]); - // Fetch redirect rules for all enabled rulesets - const toFetch = []; - for ( const details of rulesetDetails ) { - if ( details.rules.redirect === 0 ) { continue; } - toFetch.push(fetchJSON(`/rulesets/redirect/${details.id}`)); + // Strict-block rules can only be enforced with omnipotence + if ( hasOmnipotence === false ) { + localRemove('excludedStrictBlockHostnames'); + sessionRemove('excludedStrictBlockHostnames'); + return; } - const redirectRulesets = await Promise.all(toFetch); - // Redirect rules can only be enforced with omnipotence - const newRules = []; - if ( hasOmnipotence ) { - let redirectRuleId = REDIRECT_REALM_START; - for ( const rules of redirectRulesets ) { - if ( Array.isArray(rules) === false ) { continue; } - for ( const rule of rules ) { - rule.id = redirectRuleId++; - newRules.push(rule); - } - } + // Fetch strick-block rules + const toFetch = []; + for ( const details of rulesetDetails ) { + if ( details.rules.strictblock === 0 ) { continue; } + toFetch.push(fetchJSON(`/rulesets/strictblock/${details.id}`)); } + const rulesets = await Promise.all(toFetch); - // Add redirect rules to dynamic ruleset without affecting rules - // outside redirect rules realm. - const newRuleMap = new Map(newRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REDIRECT_REALM_START ) { continue; } - if ( oldRule.id >= REDIRECT_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); + const substitution = `${runtime.getURL('/strictblock.html')}#\\0`; + const allRules = []; + for ( const rules of rulesets ) { + if ( Array.isArray(rules) === false ) { continue; } + for ( const rule of rules ) { + rule.action.redirect.regexSubstitution = substitution; + allRules.push(rule); } } - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); - } + const validRules = await pruneInvalidRegexRules('strictblock', allRules); + if ( validRules.length === 0 ) { return; } + ubolLog(`Add ${validRules.length} DNR strictblock rules`); + for ( const rule of validRules ) { + rule.priority = STRICTBLOCK_PRIORITY; + addRules.push(rule); + } + + const allExcluded = permanentlyExcluded.concat(temporarilyExcluded); + if ( allExcluded.length === 0 ) { return; } + addRules.unshift({ + action: { type: 'allow' }, + condition: { + requestDomains: allExcluded, + resourceTypes: [ 'main_frame' ], + }, + priority: STRICTBLOCK_PRIORITY, + }); + ubolLog(`Add 1 DNR session rule with ${allExcluded.length} for excluded strict-block domains`); +} - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } +async function excludeFromStrictBlock(hostname, permanent) { + if ( typeof hostname !== 'string' || hostname === '' ) { return; } + const readFn = permanent ? localRead : sessionRead; + const hostnames = new Set(await readFn('excludedStrictBlockHostnames')); + hostnames.add(hostname); + const writeFn = permanent ? localWrite : sessionWrite; + await writeFn('excludedStrictBlockHostnames', Array.from(hostnames)); + return updateSessionRules(); +} - if ( removeRuleIds.length !== 0 ) { - console.info(`Remove ${removeRuleIds.length} DNR redirect rules`); - } - if ( addRules.length !== 0 ) { - console.info(`Add ${addRules.length} DNR redirect rules`); +async function setStrictBlockMode(state, force = false) { + const newState = Boolean(state); + if ( force === false ) { + if ( newState === rulesetConfig.strictBlockMode ) { return; } + } + rulesetConfig.strictBlockMode = newState; + const promises = [ saveRulesetConfig() ]; + if ( newState === false ) { + promises.push( + localRemove('excludedStrictBlockHostnames'), + sessionRemove('excludedStrictBlockHostnames') + ); } - - return dnr.updateDynamicRules({ addRules, removeRuleIds }); + await Promise.all(promises); + return updateSessionRules(); } /******************************************************************************/ -async function updateCspRules() { - const [ - hasOmnipotence, - rulesetDetails, - dynamicRuleMap, - ] = await Promise.all([ - browser.permissions.contains({ origins: [ '' ] }), - getEnabledRulesetsDetails(), - getDynamicRules(), - ]); - - // Fetch csp rules for all enabled rulesets - const toFetch = []; - for ( const details of rulesetDetails ) { - if ( details.rules.csp === 0 ) { continue; } - toFetch.push(fetchJSON(`/rulesets/csp/${details.id}`)); - } - const cspRulesets = await Promise.all(toFetch); - - // Redirect rules can only be enforced with omnipotence - const newRules = []; - if ( hasOmnipotence ) { - let cspRuleId = CSP_REALM_START; - for ( const rules of cspRulesets ) { - if ( Array.isArray(rules) === false ) { continue; } - for ( const rule of rules ) { - rule.id = cspRuleId++; - newRules.push(rule); - } - } - } - - // Add csp rules to dynamic ruleset without affecting rules - // outside csp rules realm. - const newRuleMap = new Map(newRules.map(rule => [ rule.id, rule ])); - const addRules = []; +async function updateSessionRules() { + const addRulesUnfiltered = []; const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < CSP_REALM_START ) { continue; } - if ( oldRule.id >= CSP_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); + const currentRules = await dnr.getSessionRules(); + await updateStrictBlockRules(currentRules, addRulesUnfiltered, removeRuleIds); + if ( addRulesUnfiltered.length === 0 && removeRuleIds.length === 0 ) { return; } + const maxRegexCount = dnr.MAX_NUMBER_OF_REGEX_RULES * 0.80; + let regexCount = dynamicRegexCount; + let ruleId = 1; + for ( const rule of addRulesUnfiltered ) { + if ( rule?.condition.regexFilter ) { regexCount += 1; } + rule.id = regexCount < maxRegexCount ? ruleId++ : 0; + } + sessionRegexCount = regexCount - dynamicRegexCount; + const addRules = addRulesUnfiltered.filter(a => a.id !== 0); + const rejectedRuleCount = addRulesUnfiltered.length - addRules.length; + if ( rejectedRuleCount !== 0 ) { + ubolLog(`Too many regex-based filters, ${rejectedRuleCount} session rules dropped`); + } + if ( sessionRegexCount !== 0 ) { + ubolLog(`Using ${sessionRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} session regex-based DNR rules`); + } + const response = {}; + try { + await dnr.updateSessionRules({ addRules, removeRuleIds }); + if ( removeRuleIds.length !== 0 ) { + ubolLog(`Remove ${removeRuleIds.length} session DNR rules`); } + if ( addRules.length !== 0 ) { + ubolLog(`Add ${addRules.length} session DNR rules`); + } + } catch(reason) { + ubolErr(`updateSessionRules/${reason}`); + response.error = `${reason}`; } + return response; +} - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); - } - - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } +/******************************************************************************/ - if ( removeRuleIds.length !== 0 ) { - console.info(`Remove ${removeRuleIds.length} DNR redirect rules`); - } - if ( addRules.length !== 0 ) { - console.info(`Add ${addRules.length} DNR redirect rules`); +async function getEffectiveSessionRules() { + const allRules = await dnr.getSessionRules(); + const sessionRules = []; + for ( const rule of allRules ) { + if ( rule.id >= USER_RULES_BASE_RULE_ID ) { continue; } + sessionRules.push(rule); } - - return dnr.updateDynamicRules({ addRules, removeRuleIds }); + return sessionRules; } /******************************************************************************/ -// TODO: group all omnipotence-related rules into one realm. - -async function updateDynamicRules() { - return Promise.all([ - updateRegexRules(), - updateRemoveparamRules(), - updateRedirectRules(), - updateCspRules(), - ]); +async function filteringModesToDNR(modes) { + const noneHostnames = new Set([ ...modes.none ]); + const notNoneHostnames = new Set([ ...modes.basic, ...modes.optimal, ...modes.complete ]); + const requestDomains = []; + const excludedRequestDomains = []; + const allowEverywhere = noneHostnames.has('all-urls'); + if ( allowEverywhere ) { + excludedRequestDomains.push(...notNoneHostnames); + } else { + requestDomains.push(...noneHostnames); + } + const noneCount = allowEverywhere + ? notNoneHostnames.size + : noneHostnames.size; + return dnr.setAllowAllRules( + TRUSTED_DIRECTIVE_BASE_RULE_ID, + requestDomains.sort(), + excludedRequestDomains.sort(), + allowEverywhere, + TRUSTED_DIRECTIVE_PRIORITY + ).then(modified => { + if ( modified === false ) { return; } + ubolLog(`${allowEverywhere ? 'Enabled' : 'Disabled'} DNR filtering for ${noneCount} sites`); + }); } /******************************************************************************/ -async function defaultRulesetsFromLanguage() { - const out = [ 'default', 'cname-trackers' ]; - +export async function getDefaultRulesetsFromEnv() { const dropCountry = lang => { const pos = lang.indexOf('-'); if ( pos === -1 ) { return lang; } @@ -438,20 +427,95 @@ `\\b(${Array.from(langSet).join('|')})\\b` ); + const reMobile = /\bMobile\b/.test(navigator.userAgent) + ? /\bmobile\b/ + : null + const rulesetDetails = await getRulesetDetails(); - for ( const [ id, details ] of rulesetDetails ) { - if ( typeof details.lang !== 'string' ) { continue; } - if ( reTargetLang.test(details.lang) === false ) { continue; } - out.push(id); + const out = []; + for ( const ruleset of rulesetDetails.values() ) { + const { id, enabled } = ruleset; + if ( enabled ) { + out.push(id); + continue; + } + if ( typeof ruleset.lang === 'string' ) { + if ( reTargetLang.test(ruleset.lang) ) { + out.push(id); + continue; + } + } + if ( typeof ruleset.tags === 'string' ) { + if ( reMobile?.test(ruleset.tags) ) { + out.push(id); + continue; + } + } } + return out; } /******************************************************************************/ +async function patchDefaultRulesets() { + const [ + oldDefaultIds = [], + newDefaultIds, + staticRulesetIds, + ] = await Promise.all([ + localRead('defaultRulesetIds'), + getDefaultRulesetsFromEnv(), + getStaticRulesets().then(r => r.map(a => a.id)), + ]); + const toAdd = []; + const toRemove = []; + for ( const id of newDefaultIds ) { + if ( oldDefaultIds.includes(id) ) { continue; } + toAdd.push(id); + } + for ( const id of oldDefaultIds ) { + if ( newDefaultIds.includes(id) ) { continue; } + toRemove.push(id); + } + for ( const id of rulesetConfig.enabledRulesets ) { + if ( staticRulesetIds.includes(id) ) { continue; } + toRemove.push(id); + } + localWrite('defaultRulesetIds', newDefaultIds); + if ( toAdd.length === 0 && toRemove.length === 0 ) { return; } + const enabledRulesets = new Set(rulesetConfig.enabledRulesets); + toAdd.forEach(id => enabledRulesets.add(id)); + toRemove.forEach(id => enabledRulesets.delete(id)); + const patchedRulesets = Array.from(enabledRulesets); + ubolLog(`Patched rulesets: ${rulesetConfig.enabledRulesets} => ${patchedRulesets}`); + rulesetConfig.enabledRulesets = patchedRulesets; +} + +/******************************************************************************/ + async function enableRulesets(ids) { const afterIds = new Set(ids); - const beforeIds = new Set(await dnr.getEnabledRulesets()); + const [ + beforeIds, + adminIds, + rulesetDetails, + ] = await Promise.all([ + dnr.getEnabledRulesets().then(ids => new Set(ids)), + getAdminRulesets(), + getRulesetDetails(), + ]); + + for ( const token of adminIds ) { + const c0 = token.charAt(0); + const id = token.slice(1); + if ( c0 === '+' ) { + afterIds.add(id); + } else if ( c0 === '-' ) { + afterIds.delete(id); + } + } + const enableRulesetSet = new Set(); const disableRulesetSet = new Set(); for ( const id of afterIds ) { @@ -463,13 +527,8 @@ disableRulesetSet.add(id); } - if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { - return; - } - // Be sure the rulesets to enable/disable do exist in the current version, // otherwise the API throws. - const rulesetDetails = await getRulesetDetails(); for ( const id of enableRulesetSet ) { if ( rulesetDetails.has(id) ) { continue; } enableRulesetSet.delete(id); @@ -478,18 +537,53 @@ if ( rulesetDetails.has(id) ) { continue; } disableRulesetSet.delete(id); } + + if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { return; } + const enableRulesetIds = Array.from(enableRulesetSet); const disableRulesetIds = Array.from(disableRulesetSet); if ( enableRulesetIds.length !== 0 ) { - console.info(`Enable rulesets: ${enableRulesetIds}`); + ubolLog(`Enable rulesets: ${enableRulesetIds}`); } if ( disableRulesetIds.length !== 0 ) { - console.info(`Disable ruleset: ${disableRulesetIds}`); + ubolLog(`Disable ruleset: ${disableRulesetIds}`); + } + + const response = {}; + + await dnr.updateEnabledRulesets({ + enableRulesetIds, + disableRulesetIds, + }).catch(reason => { + ubolErr(`updateEnabledRulesets/${reason}`); + response.error = `${reason}`; + }); + + const result = await updateDynamicRules(); + if ( result?.error ) { + response.error ||= result.error; } - await dnr.updateEnabledRulesets({ enableRulesetIds, disableRulesetIds }); - - return updateDynamicRules(); + + await dnr.getEnabledRulesets().then(enabledRulesets => { + ubolLog(`Enabled rulesets: ${enabledRulesets}`); + response.enabledRulesets = enabledRulesets; + return dnr.getAvailableStaticRuleCount(); + }).then(count => { + ubolLog(`Available static rule count: ${count}`); + response.staticRuleCount = count; + }).catch(reason => { + ubolErr(`getEnabledRulesets/${reason}`); + }); + + return response; +} + +/******************************************************************************/ + +async function getStaticRulesets() { + const manifest = runtime.getManifest(); + return manifest.declarative_net_request.rule_resources; } /******************************************************************************/ @@ -513,14 +607,96 @@ /******************************************************************************/ +async function getEffectiveUserRules() { + const allRules = await dnr.getDynamicRules(); + const userRules = []; + for ( const rule of allRules ) { + if ( rule.id < USER_RULES_BASE_RULE_ID ) { continue; } + userRules.push(rule); + } + return userRules; +} + +async function updateUserRules() { + const [ + userRules, + userRulesText = '', + ] = await Promise.all([ + getEffectiveUserRules(), + localRead('userDnrRules'), + ]); + + const effectiveRulesText = rulesetConfig.developerMode + ? userRulesText + : ''; + + const parsed = rulesFromText(effectiveRulesText); + const { rules } = parsed; + const removeRuleIds = [ ...userRules.map(a => a.id) ]; + const rejectedRegexes = []; + const addRules = await pruneInvalidRegexRules('user', rules, rejectedRegexes); + const out = { added: 0, removed: 0, errors: [] }; + + if ( rejectedRegexes.length !== 0 ) { + rejectedRegexes.forEach(e => + out.errors.push(`regexFilter: ${e.regex} → ${e.reason}`) + ); + } + + if ( removeRuleIds.length === 0 && addRules.length === 0 ) { + await localRemove('userDnrRuleCount'); + return out; + } + + let ruleId = 0; + for ( const rule of addRules ) { + rule.id = USER_RULES_BASE_RULE_ID + ruleId++; + rule.priority = (rule.priority || 1) + USER_RULES_PRIORITY; + } + + // Rules are first removed separately to ensure registered rules match + // user rules text. A bad rule in user rules text would prevent the + // rules from being removed if the removal was done at the same time as + // adding rules. + try { + await dnr.updateDynamicRules({ removeRuleIds }); + await dnr.updateDynamicRules({ addRules }); + if ( removeRuleIds.length !== 0 ) { + ubolLog(`updateUserRules() / Removed ${removeRuleIds.length} dynamic DNR rules`); + } + if ( addRules.length !== 0 ) { + ubolLog(`updateUserRules() / Added ${addRules.length} DNR rules`); + } + out.added = addRules.length; + out.removed = removeRuleIds.length; + } catch(reason) { + ubolErr(`updateUserRules/${reason}`); + out.errors.push(`${reason}`); + } finally { + const userRules = await getEffectiveUserRules(); + if ( userRules.length === 0 ) { + await localRemove('userDnrRuleCount'); + } else { + await localWrite('userDnrRuleCount', addRules.length); + } + } + return out; +} + +/******************************************************************************/ + export { - BLOCKING_MODES_RULE_ID, - CURRENT_CONFIG_BASE_RULE_ID, - TRUSTED_DIRECTIVE_BASE_RULE_ID, - getRulesetDetails, - getDynamicRules, enableRulesets, - defaultRulesetsFromLanguage, + excludeFromStrictBlock, + filteringModesToDNR, + getEffectiveDynamicRules, + getEffectiveSessionRules, + getEffectiveUserRules, getEnabledRulesetsDetails, + getRulesetDetails, + patchDefaultRulesets, + setStrictBlockMode, updateDynamicRules, + updateSessionRules, + updateUserRules, }; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,409 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { + browser, + localRead, + localRemove, + localWrite, + sendMessage, +} from './ext.js'; +import { dom, qs$ } from './dom.js'; +import { i18n, i18n$ } from './i18n.js'; +import { DNREditor } from './dnr-editor.js'; +import { parseFilters } from './ubo-parser.js'; +import { textFromRules } from './dnr-parser.js'; + +/******************************************************************************/ + +export class ReadWriteDNREditor extends DNREditor { + constructor(editor) { + super(); + this.feedbackPanel = self.cm6.createViewPanel(); + editor.panels.push(this.feedbackPanel); + } + + async getText() { + return localRead('userDnrRules'); + } + + on(editor) { + localRead('userDnrRuleCount').then(userDnrRuleCount => { + this.updateSummaryPanel(editor, { userDnrRuleCount }) + }); + browser.storage.onChanged.addListener((changes, area) => { + if ( area !== 'local' ) { return; } + const { userDnrRuleCount } = changes; + if ( userDnrRuleCount instanceof Object === false ) { return; } + const { newValue } = changes.userDnrRuleCount; + this.updateSummaryPanel(editor, { userDnrRuleCount: newValue }); + }); + } + + off(editor) { + this.updateSummaryPanel(editor, null); + this.updateFeedbackPanel(editor, null); + } + + rulesFromJSON(json) { + let content = json.trim(); + if ( /^[[{]/.test(content) === false ) { + const match = /^[^[{]+/.exec(content); + if ( match === null ) { return; } + content = content.slice(match[0].length); + } + const firstChar = content.charAt(0); + const expectedLastChar = firstChar === '[' ? ']' : '}'; + if ( content.at(-1) !== expectedLastChar ) { + const re = new RegExp(`\\${expectedLastChar}[^\\${expectedLastChar}]+$`); + const match = re.exec(content); + if ( match === null ) { return; } + content = content.slice(0, match.index+1); + } + if ( content.startsWith('{') && content.endsWith('}') ) { + content = `[${content}]`; + } + try { + const rules = JSON.parse(content); + if ( Array.isArray(rules) ) { return rules; } + } + catch { + } + } + + getAutocompleteCandidates(editor, from) { + const { scope } = editor.getScopeAt(from); + switch ( scope ) { + case '': + return { + before: /^$/, + candidates: [ + { token: 'action:', after: '\n' }, + { token: 'condition:', after: '\n ' }, + { token: 'priority:', after: ' ' }, + { token: '---', after: '\n' }, + ] + }; + case 'action:': + return { + before: /^ {2}$/, + candidates: [ + { token: 'type:', after: ' ' }, + { token: 'redirect:', after: '\n ' }, + { token: 'requestHeaders:', after: '\n - header: ' }, + { token: 'responseHeaders:', after: '\n - header: ' }, + ], + }; + case 'action:type:': + return { + before: /: $/, + candidates: [ + { token: 'block', after: '\n ' }, + { token: 'redirect', after: '\n ' }, + { token: 'allow', after: '\n ' }, + { token: 'modifyHeaders', after: '\n ' }, + { token: 'upgradeScheme', after: '\n ' }, + { token: 'allowAllRequest', after: '\n ' }, + ], + }; + case 'action:redirect:': + return { + before: /^ {4}$/, + candidates: [ + { token: 'extensionPath:', after: ' ' }, + { token: 'regexSubstitution:', after: ' ' }, + { token: 'transform:', after: '\n ' }, + { token: 'url:', after: ' ' }, + ], + }; + case 'action:redirect:transform:': + return { + before: /^ {6}$/, + candidates: [ + { token: 'fragment:', after: ' ' }, + { token: 'host:', after: ' ' }, + { token: 'path:', after: ' ' }, + { token: 'port:', after: ' ' }, + { token: 'query:', after: ' ' }, + { token: 'scheme:', after: ' ' }, + { token: 'queryTransform:', after: '\n ' }, + ], + }; + case 'action:redirect:transform:queryTransform:': + return { + before: /^ {8}$/, + candidates: [ + { token: 'addOrReplaceParams:', after: '\n - ' }, + { token: 'removeParams:', after: '\n - ' }, + ], + }; + case 'action:responseHeaders:': + case 'action:requestHeaders:': + return { + before: /^ {4}- $/, + candidates: [ + { token: 'header:', after: ' ' }, + ], + }; + case 'action:responseHeaders:header:': + case 'action:requestHeaders:header:': + return { + before: /^ {6}$/, + candidates: [ + { token: 'operation:', after: ' ' }, + { token: 'value:', after: ' ' }, + ], + }; + case 'action:responseHeaders:header:operation:': + case 'action:requestHeaders:header:operation:': + return { + before: /: $/, + candidates: [ + { token: 'append', after: '\n value: ' }, + { token: 'set', after: '\n value: ' }, + { token: 'remove', after: '\n ' }, + ], + }; + case 'condition:': + return { + before: /^ {2}$/, + candidates: [ + { token: 'domainType:', after: ' ' }, + { token: 'isUrlFilterCaseSensitive:', after: ' ' }, + { token: 'regexFilter:', after: ' ' }, + { token: 'urlFilter:', after: ' ' }, + { token: 'initiatorDomains:', after: '\n - ' }, + { token: 'excludedInitiatorDomains:', after: '\n - ' }, + { token: 'requestDomains:', after: '\n - ' }, + { token: 'excludedRequestDomains:', after: '\n - ' }, + { token: 'resourceTypes:', after: '\n - ' }, + { token: 'excludedResourceTypes:', after: '\n - ' }, + { token: 'requestMethods:', after: '\n - ' }, + { token: 'excludedRequestMethods:', after: '\n - ' }, + { token: 'responseHeaders:', after: '\n - ' }, + { token: 'excludedResponseHeaders:', after: '\n - ' }, + ], + }; + case 'condition:domainType:': + return { + before: /: $/, + candidates: [ + { token: 'firstParty', after: '\n ' }, + { token: 'thirdParty', after: '\n ' }, + ], + }; + case 'condition:isUrlFilterCaseSensitive:': + return { + before: /: $/, + candidates: [ + { token: 'true', after: '\n ' }, + { token: 'false', after: '\n ' }, + ], + }; + case 'condition:requestMethods:': + case 'condition:excludedRequestMethods:': + return { + before: /^ {4}- $/, + candidates: [ + { token: 'connect', after: '\n - ' }, + { token: 'delete', after: '\n - ' }, + { token: 'get', after: '\n - ' }, + { token: 'head', after: '\n - ' }, + { token: 'options', after: '\n - ' }, + { token: 'patch', after: '\n - ' }, + { token: 'post', after: '\n - ' }, + { token: 'put', after: '\n - ' }, + { token: 'other', after: '\n ' }, + ], + }; + case 'condition:resourceTypes:': + case 'condition:excludedResourceTypes:': + return { + before: /^ {4}- $/, + candidates: [ + { token: 'main_frame', after: '\n - ' }, + { token: 'sub_frame', after: '\n - ' }, + { token: 'stylesheet', after: '\n - ' }, + { token: 'script', after: '\n - ' }, + { token: 'image', after: '\n - ' }, + { token: 'font', after: '\n - ' }, + { token: 'object', after: '\n - ' }, + { token: 'xmlhttprequest', after: '\n - ' }, + { token: 'ping', after: '\n - ' }, + { token: 'csp_report', after: '\n - ' }, + { token: 'media', after: '\n - ' }, + { token: 'websocket', after: '\n - ' }, + { token: 'webtransport', after: '\n - ' }, + { token: 'webbundle', after: '\n - ' }, + { token: 'other', after: '\n ' }, + ], + }; + } + } + + autoComplete(editor, context) { + const match = context.matchBefore(/[\w-]*/); + if ( match === undefined ) { return null; } + const result = this.getAutocompleteCandidates(editor, match.from); + if ( result === undefined ) { return null; } + if ( result.before !== undefined ) { + const { doc } = context.state; + const line = doc.lineAt(context.pos); + const before = doc.sliceString(line.from, match.from); + if ( result.before.test(before) === false ) { return null; } + } + const filtered = result.candidates.filter(e => + e.token !== match.text || e.after !== '\n' + ); + return { + from: match.from, + options: filtered.map(e => ({ label: e.token, apply: `${e.token}${e.after}` })), + validFor: /\w*/, + }; + } + + async saveEditorText(editor) { + const text = editor.getEditorText().trim(); + await (text.length !== 0 + ? localWrite('userDnrRules', text) + : localRemove('userDnrRules') + ); + const response = await sendMessage({ what: 'updateUserDnrRules' }) + if ( response instanceof Object ) { + this.updateFeedbackPanel(editor, response); + } + return true; + } + + updateSummaryPanel(editor, details) { + if ( details instanceof Object === false ) { + return editor.updateSummaryPanel(null); + } + const template = document.querySelector('template.summary-panel'); + const fragment = template.content.cloneNode(true); + const root = fragment.querySelector('.summary-panel'); + i18n.render(root); + const info = root.querySelector('.info'); + info.textContent = i18n$('dnrRulesCountInfo') + .replace('{count}', (details.userDnrRuleCount || 0).toLocaleString()) + editor.updateSummaryPanel(root); + } + + updateFeedbackPanel(editor, details) { + if ( details instanceof Object === false ) { + return this.feedbackPanel.render(editor.view, null); + } + const errors = []; + if ( Array.isArray(details.errors) ) { + details.errors.forEach(e => errors.push(e)); + } + const text = errors.join('\n'); + const config = (( ) => { + if ( text === '' ) { return null; } + const template = document.querySelector('template.feedback-panel'); + const fragment = template.content.cloneNode(true); + const root = fragment.querySelector('.feedback-panel'); + const info = root.querySelector('.info'); + info.textContent = text; + const closeFn = this.updateFeedbackPanel.bind(this, editor, null); + return { + dom: root, + mount() { + dom.on(qs$('.feedback-panel .close'), 'click', closeFn); + } + }; + })(); + this.feedbackPanel.render(editor.view, config); + } + + importFromFile(editor, json) { + const rules = this.rulesFromJSON(json); + if ( rules === undefined ) { return; } + const text = textFromRules(rules); + if ( text === undefined ) { return; } + const { doc } = editor.view.state; + const lastChars = doc.toString().trimEnd().slice(-4); + const lastLine = doc.line(doc.lines); + let from = lastLine.to; + let prepend = ''; + if ( lastLine.text !== '' ) { + prepend = '\n'; + } else { + from = lastLine.from; + } + if ( /(?:^|\n)---$/.test(lastChars) === false ) { + prepend = `${prepend}---\n`; + } + editor.view.dispatch({ changes: { from, insert: `${prepend}${text}` } }); + self.cm6.foldAll(editor.view); + editor.view.focus(); + } + + exportToFile(text) { + return super.exportToFile(text, 'my-ubol-dnr-rules.json'); + } + + importFromPaste(editor, transaction) { + const { from, to } = editor.rangeFromTransaction(transaction); + if ( from === undefined || to === undefined ) { return; } + // Paste position must match start of a line + const { newDoc } = transaction; + const lineFrom = newDoc.lineAt(from); + if ( lineFrom.from !== from ) { return; } + // Paste position must match a rule boundary + let separatorBefore = false; + if ( lineFrom.number !== 1 ) { + const lineBefore = newDoc.line(lineFrom.number-1); + if ( /^---\s*$/.test(lineBefore.text) === false ) { return; } + separatorBefore = true; + } + const pastedText = newDoc.sliceString(from, to); + let linesToPrepend; + let rules = this.rulesFromJSON(pastedText); + if ( Boolean(rules?.length) === false ) { + rules = parseFilters(pastedText); + if ( Boolean(rules?.length) === false ) { return; } + const lines = pastedText.trim().split(/\n/); + linesToPrepend = lines.slice(0, 10).map(a => `# ${a}`); + if ( lines.length > linesToPrepend.length ) { + linesToPrepend.push('# ...'); + } + } + let yamlText = textFromRules(rules); + if ( yamlText === undefined ) { return; } + if ( linesToPrepend ) { + yamlText = yamlText.replace('---\n', `---\n${linesToPrepend.join('\n')}\n`); + } + if ( separatorBefore && yamlText.startsWith('---\n') ) { + yamlText = yamlText.slice(4); + } + editor.view.dispatch({ changes: { from, to, insert: yamlText } }); + self.cm6.foldAll(editor.view); + return true; + } + + newlineAssistant = { + 'action:': ' type: ', + 'action:responseHeaders:header:': ' operation: ', + }; + + ioAccept = '.json,application/json'; +}; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-api.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-api.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-api.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-api.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,33 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(api => { + if ( typeof api === 'object' ) { return; } + self.cssAPI = { + insert(css) { + chrome.runtime.sendMessage({ + what: 'insertCSS', + css, + }).catch(( ) => { + }); + }, + }; +})(self.cssAPI); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssDeclarative() { - -/******************************************************************************/ - -const declarativeImports = self.declarativeImports || []; - -const lookupSelectors = (hn, out) => { - for ( const { argsList, hostnamesMap } of declarativeImports ) { - let argsIndices = hostnamesMap.get(hn); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - out.push(...details.a.map(json => JSON.parse(json))); - } - } -}; - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -const selectors = []; -while ( hn ) { - lookupSelectors(hn, selectors); - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -declarativeImports.length = 0; - -/******************************************************************************/ - -if ( selectors.length === 0 ) { return; } - -const cssRuleFromProcedural = details => { - const { tasks, action } = details; - let mq; - if ( tasks !== undefined ) { - if ( tasks.length > 1 ) { return; } - if ( tasks[0][0] !== 'matches-media' ) { return; } - mq = tasks[0][1]; - } - let style; - if ( Array.isArray(action) ) { - if ( action[0] !== 'style' ) { return; } - style = action[1]; - } - if ( mq === undefined && style === undefined ) { return; } - if ( mq === undefined ) { - return `${details.selector}\n{${style}}`; - } - if ( style === undefined ) { - return `@media ${mq} {\n${details.selector}\n{display:none!important;}\n}`; - } - return `@media ${mq} {\n${details.selector}\n{${style}}\n}`; -}; - -const sheetText = []; -for ( const selector of selectors ) { - const ruleText = cssRuleFromProcedural(selector); - if ( ruleText === undefined ) { continue; } - sheetText.push(ruleText); -} - -if ( sheetText.length === 0 ) { return; } - -try { - const sheet = new CSSStyleSheet(); - sheet.replace(`@layer{${sheetText.join('\n')}}`); - document.adoptedStyleSheets = [ - ...document.adoptedStyleSheets, - sheet - ]; -} catch(ex) { -} - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - /******************************************************************************/ // Important! @@ -30,9 +26,14 @@ (function uBOL_cssGeneric() { const genericSelectorMap = self.genericSelectorMap || new Map(); +self.genericSelectorMap = undefined; if ( genericSelectorMap.size === 0 ) { return; } -self.genericSelectorMap = undefined; +const genericExceptionSieve = self.genericExceptionSieve || new Set(); +self.genericExceptionSieve = undefined; + +const genericExceptionMap = self.genericExceptionMap || new Map(); +self.genericExceptionMap = undefined; /******************************************************************************/ @@ -60,7 +61,7 @@ for ( let i = 0; i < len; i += step ) { hash = (hash << 5) + hash ^ s.charCodeAt(i); } - return hash & 0xFF_FFFF; + return hash & 0xFFF; }; /******************************************************************************/ @@ -76,7 +77,15 @@ const uBOL_idFromNode = (node, out) => { const raw = node.id; if ( typeof raw !== 'string' || raw.length === 0 ) { return; } - out.push(hashFromStr(0x23 /* '#' */, raw.trim())); + const hash = hashFromStr(0x23 /* '#' */, raw.trim()); + const selectorList = genericSelectorMap.get(hash); + if ( selectorList === undefined ) { return; } + genericSelectorMap.delete(hash); + if ( genericExceptionSieve.has(hash) ) { + applyExceptions(selectorList, out); + } else { + out.push(selectorList); + } }; // https://github.com/uBlockOrigin/uBlock-issues/discussions/2076 @@ -89,11 +98,35 @@ end = s.indexOf(' ', beg); if ( end === beg ) { continue; } if ( end === -1 ) { end = len; } - out.push(hashFromStr(0x2E /* '.' */, s.slice(beg, end))); + const token = s.slice(beg, end).trimEnd(); beg = end; + if ( token.length === 0 ) { continue; } + const hash = hashFromStr(0x2E /* '.' */, token); + const selectorList = genericSelectorMap.get(hash); + if ( selectorList === undefined ) { continue; } + genericSelectorMap.delete(hash); + if ( genericExceptionSieve.has(hash) ) { + applyExceptions(selectorList, out); + } else { + out.push(selectorList); + } } }; +const applyExceptions = (selectorList, out) => { + const selectors = new Set(selectorList.split(',\n')); + self.isolatedAPI.forEachHostname(hostname => { + const exceptions = genericExceptionMap.get(hostname); + if ( exceptions === undefined ) { return; } + for ( const exception of exceptions.split('\n') ) { + selectors.delete(exception); + } + if ( selectors.size === 0 ) { return true; } + }, { hasEntities: true }); + if ( selectors.size === 0 ) { return; } + out.push(Array.from(selectors).join(',\n')); +} + /******************************************************************************/ const pendingNodes = { @@ -129,25 +162,18 @@ const uBOL_processNodes = ( ) => { const t0 = Date.now(); - const hashes = []; const nodes = []; const deadline = t0 + maxSurveyTimeSlice; for (;;) { pendingNodes.next(nodes); if ( nodes.length === 0 ) { break; } for ( const node of nodes ) { - uBOL_idFromNode(node, hashes); - uBOL_classesFromNode(node, hashes); + uBOL_idFromNode(node, styleSheetSelectors); + uBOL_classesFromNode(node, styleSheetSelectors); } nodes.length = 0; if ( performance.now() >= deadline ) { break; } } - for ( const hash of hashes ) { - const selectorList = genericSelectorMap.get(hash); - if ( selectorList === undefined ) { continue; } - styleSheetSelectors.push(selectorList); - genericSelectorMap.delete(hash); - } surveyCount += 1; if ( styleSheetSelectors.length === 0 ) { surveyMissCount += 1; @@ -162,7 +188,8 @@ if ( styleSheetTimer !== undefined ) { return; } styleSheetTimer = self.requestAnimationFrame(( ) => { styleSheetTimer = undefined; - uBOL_injectStyleSheet(); + self.cssAPI.insert(`${styleSheetSelectors.join(',')}{display:none!important;}`); + styleSheetSelectors.length = 0; }); }; @@ -187,17 +214,15 @@ /******************************************************************************/ -const uBOL_injectStyleSheet = ( ) => { - try { - const sheet = new CSSStyleSheet(); - sheet.replace(`@layer{${styleSheetSelectors.join(',')}{display:none!important;}}`); - document.adoptedStyleSheets = [ - ...document.adoptedStyleSheets, - sheet - ]; - } catch(ex) { +const stopAll = ( ) => { + if ( domChangeTimer !== undefined ) { + self.clearTimeout(domChangeTimer); + domChangeTimer = undefined; } - styleSheetSelectors.length = 0; + domMutationObserver.disconnect(); + domMutationObserver.takeRecords(); + domMutationObserver = undefined; + genericSelectorMap.clear(); }; /******************************************************************************/ @@ -224,20 +249,6 @@ /******************************************************************************/ -const stopAll = reason => { - if ( domChangeTimer !== undefined ) { - self.clearTimeout(domChangeTimer); - domChangeTimer = undefined; - } - domMutationObserver.disconnect(); - domMutationObserver.takeRecords(); - domMutationObserver = undefined; - genericSelectorMap.clear(); - console.info(`uBOL: Generic cosmetic filtering stopped because ${reason}`); -}; - -/******************************************************************************/ - })(); /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,813 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +// Important! +// Isolate from global scope +(function uBOL_cssProceduralAPI() { + +if ( self.ProceduralFiltererAPI !== undefined ) { + if ( self.ProceduralFiltererAPI instanceof Promise === false ) { return; } +} + +/******************************************************************************/ + +const nonVisualElements = { + head: true, + link: true, + meta: true, + script: true, + style: true, +}; + +const regexFromString = (s, exact = false) => { + if ( s === '' ) { return /^/; } + const match = /^\/(.+)\/([imu]*)$/.exec(s); + if ( match !== null ) { + return new RegExp(match[1], match[2] || undefined); + } + const reStr = s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return new RegExp(exact ? `^${reStr}$` : reStr); +}; + +const randomToken = ( ) => { + const n = Math.random(); + return String.fromCharCode(n * 25 + 97) + + Math.floor( + (0.25 + n * 0.75) * Number.MAX_SAFE_INTEGER + ).toString(36).slice(-8); +}; + +/******************************************************************************/ + +// 'P' stands for 'Procedural' + +class PSelectorTask { + destructor() { + } + begin() { + } + end() { + } +} + +/******************************************************************************/ + +class PSelectorVoidTask extends PSelectorTask { + constructor(filterer, task) { + super(); + console.info(`uBO: :${task[0]}() operator does not exist`); + } + transpose() { + } +} + +/******************************************************************************/ + +class PSelectorHasTextTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.needle = regexFromString(task[1]); + } + transpose(node, output) { + if ( this.needle.test(node.textContent) ) { + output.push(node); + } + } +} + +/******************************************************************************/ + +class PSelectorIfTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.pselector = new PSelector(filterer, task[1]); + } + transpose(node, output) { + if ( this.pselector.test(node) === this.target ) { + output.push(node); + } + } + target = true; +} + +class PSelectorIfNotTask extends PSelectorIfTask { + target = false; +} + +/******************************************************************************/ + +class PSelectorMatchesAttrTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.reAttr = regexFromString(task[1].attr, true); + this.reValue = regexFromString(task[1].value, true); + } + transpose(node, output) { + if ( typeof node.getAttributeNames !== 'function' ) { return; } + const attrs = node.getAttributeNames(); + for ( const attr of attrs ) { + if ( this.reAttr.test(attr) === false ) { continue; } + if ( this.reValue.test(node.getAttribute(attr)) === false ) { continue; } + output.push(node); + } + } +} + +/******************************************************************************/ + +class PSelectorMatchesCSSTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.name = task[1].name; + this.pseudo = task[1].pseudo ? `::${task[1].pseudo}` : null; + let arg0 = task[1].value, arg1; + if ( Array.isArray(arg0) ) { + arg1 = arg0[1]; arg0 = arg0[0]; + } + this.value = new RegExp(arg0, arg1); + } + transpose(node, output) { + const style = window.getComputedStyle(node, this.pseudo); + if ( style !== null && this.value.test(style[this.name]) ) { + output.push(node); + } + } +} +class PSelectorMatchesCSSAfterTask extends PSelectorMatchesCSSTask { + constructor(filterer, task) { + super(filterer, task); + this.pseudo = '::after'; + } +} + +class PSelectorMatchesCSSBeforeTask extends PSelectorMatchesCSSTask { + constructor(filterer, task) { + super(filterer, task); + this.pseudo = '::before'; + } +} + +/******************************************************************************/ + +class PSelectorMatchesMediaTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.filterer = filterer; + this.mql = window.matchMedia(task[1]); + if ( this.mql.media === 'not all' ) { return; } + this.boundHandler = this.handler.bind(this); + this.mql.addEventListener('change', this.boundHandler); + } + destructor() { + super.destructor(); + this.mql.removeEventListener('change', this.boundHandler); + } + transpose(node, output) { + if ( this.mql.matches === false ) { return; } + output.push(node); + } + handler() { + if ( this.filterer instanceof Object === false ) { return; } + this.filterer.uBOL_DOMChanged(); + } +} + +/******************************************************************************/ + +class PSelectorMatchesPathTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.needle = regexFromString( + task[1].replace(/\P{ASCII}/gu, s => encodeURIComponent(s)) + ); + } + transpose(node, output) { + if ( this.needle.test(self.location.pathname + self.location.search) ) { + output.push(node); + } + } +} + +/******************************************************************************/ + +class PSelectorMatchesPropTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.props = task[1].attr.split('.'); + this.reValue = task[1].value !== '' + ? regexFromString(task[1].value, true) + : null; + } + transpose(node, output) { + let value = node; + for ( const prop of this.props ) { + if ( value === undefined ) { return; } + if ( value === null ) { return; } + value = value[prop]; + } + if ( this.reValue === null ) { + if ( value === undefined ) { return; } + } else if ( this.reValue.test(value) === false ) { + return; + } + output.push(node); + } +} + +/******************************************************************************/ + +class PSelectorMinTextLengthTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.min = task[1]; + } + transpose(node, output) { + if ( node.textContent.length >= this.min ) { + output.push(node); + } + } +} + +/******************************************************************************/ + +class PSelectorOthersTask extends PSelectorTask { + constructor() { + super(); + this.targets = new Set(); + } + begin() { + this.targets.clear(); + } + end(output) { + const toKeep = new Set(this.targets); + const toDiscard = new Set(); + const body = document.body; + const head = document.head; + let discard = null; + for ( let keep of this.targets ) { + while ( keep !== null && keep !== body && keep !== head ) { + toKeep.add(keep); + toDiscard.delete(keep); + discard = keep.previousElementSibling; + while ( discard !== null ) { + if ( nonVisualElements[discard.localName] !== true ) { + if ( toKeep.has(discard) === false ) { + toDiscard.add(discard); + } + } + discard = discard.previousElementSibling; + } + discard = keep.nextElementSibling; + while ( discard !== null ) { + if ( nonVisualElements[discard.localName] !== true ) { + if ( toKeep.has(discard) === false ) { + toDiscard.add(discard); + } + } + discard = discard.nextElementSibling; + } + keep = keep.parentElement; + } + } + for ( discard of toDiscard ) { + output.push(discard); + } + this.targets.clear(); + } + transpose(candidate) { + for ( const target of this.targets ) { + if ( target.contains(candidate) ) { return; } + if ( candidate.contains(target) ) { + this.targets.delete(target); + } + } + this.targets.add(candidate); + } +} + +/******************************************************************************/ + +class PSelectorShadowTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.selector = task[1]; + } + transpose(node, output) { + const root = this.openOrClosedShadowRoot(node); + if ( root === null ) { return; } + const nodes = root.querySelectorAll(this.selector); + output.push(...nodes); + } + get openOrClosedShadowRoot() { + if ( PSelectorShadowTask.openOrClosedShadowRoot !== undefined ) { + return PSelectorShadowTask.openOrClosedShadowRoot; + } + if ( typeof chrome === 'object' && chrome !== null ) { + if ( chrome.dom instanceof Object ) { + if ( typeof chrome.dom.openOrClosedShadowRoot === 'function' ) { + PSelectorShadowTask.openOrClosedShadowRoot = + chrome.dom.openOrClosedShadowRoot; + return PSelectorShadowTask.openOrClosedShadowRoot; + } + } + } + PSelectorShadowTask.openOrClosedShadowRoot = node => + node.openOrClosedShadowRoot || null; + return PSelectorShadowTask.openOrClosedShadowRoot; + } +} + +/******************************************************************************/ + +// https://github.com/AdguardTeam/ExtendedCss/issues/31#issuecomment-302391277 +// Prepend `:scope ` if needed. +class PSelectorSpathTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.spath = task[1]; + this.nth = /^(?:\s*[+~]|:)/.test(this.spath); + if ( this.nth ) { return; } + if ( /^\s*>/.test(this.spath) ) { + this.spath = `:scope ${this.spath.trim()}`; + } + } + transpose(node, output) { + const nodes = this.nth + ? PSelectorSpathTask.qsa(node, this.spath) + : node.querySelectorAll(this.spath); + for ( const node of nodes ) { + output.push(node); + } + } + // Helper method for other operators. + static qsa(node, selector) { + const parent = node.parentElement; + if ( parent === null ) { return []; } + let pos = 1; + for (;;) { + node = node.previousElementSibling; + if ( node === null ) { break; } + pos += 1; + } + return parent.querySelectorAll( + `:scope > :nth-child(${pos})${selector}` + ); + } +} + +/******************************************************************************/ + +class PSelectorUpwardTask extends PSelectorTask { + constructor(filterer, task) { + super(); + const arg = task[1]; + if ( typeof arg === 'number' ) { + this.i = arg; + } else { + this.s = arg; + } + } + transpose(node, output) { + if ( this.s !== '' ) { + const parent = node.parentElement; + if ( parent === null ) { return; } + node = parent.closest(this.s); + if ( node === null ) { return; } + } else { + let nth = this.i; + for (;;) { + node = node.parentElement; + if ( node === null ) { return; } + nth -= 1; + if ( nth === 0 ) { break; } + } + } + output.push(node); + } + i = 0; + s = ''; +} + +/******************************************************************************/ + +class PSelectorWatchAttrs extends PSelectorTask { + constructor(filterer, task) { + super(); + this.filterer = filterer; + this.observer = null; + this.observed = new WeakSet(); + this.observerOptions = { + attributes: true, + subtree: true, + }; + const attrs = task[1]; + if ( Array.isArray(attrs) && attrs.length !== 0 ) { + this.observerOptions.attributeFilter = task[1]; + } + } + destructor() { + super.destructor(); + if ( this.observer ) { + this.observer.takeRecords(); + this.observer.disconnect(); + this.observer = null; + } + } + transpose(node, output) { + output.push(node); + if ( this.filterer instanceof Object === false ) { return; } + if ( this.observed.has(node) ) { return; } + if ( this.observer === null ) { + this.observer = new MutationObserver(( ) => { + this.filterer.uBOL_DOMChanged(); + }); + } + this.observer.observe(node, this.observerOptions); + this.observed.add(node); + } +} + +/******************************************************************************/ + +class PSelectorXpathTask extends PSelectorTask { + constructor(filterer, task) { + super(); + this.xpe = document.createExpression(task[1], null); + this.xpr = null; + } + transpose(node, output) { + this.xpr = this.xpe.evaluate( + node, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + this.xpr + ); + let j = this.xpr.snapshotLength; + while ( j-- ) { + const node = this.xpr.snapshotItem(j); + if ( node.nodeType === 1 ) { + output.push(node); + } + } + } +} + +/******************************************************************************/ + +class PSelector { + constructor(filterer, o) { + this.selector = o.selector; + this.tasks = []; + const tasks = []; + if ( Array.isArray(o.tasks) === false ) { return; } + for ( const task of o.tasks ) { + const ctor = PSelector.operatorToTaskMap.get(task[0]) || PSelectorVoidTask; + tasks.push(new ctor(filterer, task)); + } + this.tasks = tasks; + } + destructor() { + for ( const task of this.tasks ) { + task.destructor(); + } + } + prime(input) { + const root = input || document; + if ( this.selector === '' ) { return [ root ]; } + if ( input !== document ) { + const c0 = this.selector.charCodeAt(0); + if ( c0 === 0x2B /* + */ || c0 === 0x7E /* ~ */ ) { + return Array.from(PSelectorSpathTask.qsa(input, this.selector)); + } else if ( c0 === 0x3E /* > */ ) { + return Array.from(input.querySelectorAll(`:scope ${this.selector}`)); + } + } + return Array.from(root.querySelectorAll(this.selector)); + } + exec(input) { + let nodes = this.prime(input); + for ( const task of this.tasks ) { + if ( nodes.length === 0 ) { break; } + const transposed = []; + task.begin(); + for ( const node of nodes ) { + task.transpose(node, transposed); + } + task.end(transposed); + nodes = transposed; + } + return nodes; + } + test(input) { + const nodes = this.prime(input); + for ( const node of nodes ) { + let output = [ node ]; + for ( const task of this.tasks ) { + const transposed = []; + task.begin(); + for ( const node of output ) { + task.transpose(node, transposed); + } + task.end(transposed); + output = transposed; + if ( output.length === 0 ) { break; } + } + if ( output.length !== 0 ) { return true; } + } + return false; + } + static operatorToTaskMap = new Map([ + [ 'has', PSelectorIfTask ], + [ 'has-text', PSelectorHasTextTask ], + [ 'if', PSelectorIfTask ], + [ 'if-not', PSelectorIfNotTask ], + [ 'matches-attr', PSelectorMatchesAttrTask ], + [ 'matches-css', PSelectorMatchesCSSTask ], + [ 'matches-css-after', PSelectorMatchesCSSAfterTask ], + [ 'matches-css-before', PSelectorMatchesCSSBeforeTask ], + [ 'matches-media', PSelectorMatchesMediaTask ], + [ 'matches-path', PSelectorMatchesPathTask ], + [ 'matches-prop', PSelectorMatchesPropTask ], + [ 'min-text-length', PSelectorMinTextLengthTask ], + [ 'not', PSelectorIfNotTask ], + [ 'others', PSelectorOthersTask ], + [ 'shadow', PSelectorShadowTask ], + [ 'spath', PSelectorSpathTask ], + [ 'upward', PSelectorUpwardTask ], + [ 'watch-attr', PSelectorWatchAttrs ], + [ 'xpath', PSelectorXpathTask ], + ]); +} + +/******************************************************************************/ + +class PSelectorRoot extends PSelector { + constructor(filterer, o) { + super(filterer, o); + this.budget = 200; // I arbitrary picked a 1/5 second + this.raw = o.raw; + this.cost = 0; + this.lastAllowanceTime = 0; + this.action = o.action; + } + prime(input) { + try { + return super.prime(input); + } catch { + } + return []; + } + exec(input) { + try { + return super.exec(input); + } catch { + } + return []; + } +} + +/******************************************************************************/ + +class ProceduralFilterer { + constructor() { + this.selectors = []; + this.styleTokenMap = new Map(); + this.styledNodes = new Set(); + this.timer = undefined; + this.hideStyle = 'display:none!important;'; + } + + async reset() { + if ( this.timer ) { + self.cancelAnimationFrame(this.timer); + this.timer = undefined; + } + for ( const pselector of this.selectors.values() ) { + pselector.destructor(); + } + this.selectors.length = 0; + const promises = []; + for ( const [ style, token ] of this.styleTokenMap ) { + for ( const elem of this.styledNodes ) { + elem.removeAttribute(token); + } + const css = `[${token}]\n{${style}}\n`; + promises.push( + chrome.runtime.sendMessage({ what: 'removeCSS', css }).catch(( ) => { }) + ); + } + this.styleTokenMap.clear(); + this.styledNodes.clear(); + return Promise.all(promises); + } + + addSelectors(selectors) { + for ( const selector of selectors ) { + const pselector = new PSelectorRoot(this, selector); + this.primeProceduralSelector(pselector); + this.selectors.push(pselector); + } + } + + // This allows to perform potentially expensive initialization steps + // before the filters are ready to be applied. + primeProceduralSelector(pselector) { + if ( pselector.action === undefined ) { + this.styleTokenFromStyle(this.hideStyle); + } else if ( pselector.action[0] === 'style' ) { + this.styleTokenFromStyle(pselector.action[1]); + } + return pselector; + } + + uBOL_commit() { + if ( this.timer !== undefined ) { + self.cancelAnimationFrame(this.timer); + this.timer = undefined; + } + + // https://github.com/uBlockOrigin/uBlock-issues/issues/341 + // Be ready to unhide nodes which no longer matches any of + // the procedural selectors. + const toUnstyle = this.styledNodes; + this.styledNodes = new Set(); + + let t0 = Date.now(); + + for ( const pselector of this.selectors.values() ) { + const allowance = Math.floor((t0 - pselector.lastAllowanceTime) / 2000); + if ( allowance >= 1 ) { + pselector.budget += allowance * 50; + if ( pselector.budget > 200 ) { pselector.budget = 200; } + pselector.lastAllowanceTime = t0; + } + if ( pselector.budget <= 0 ) { continue; } + const nodes = pselector.exec(); + const t1 = Date.now(); + pselector.budget += t0 - t1; + if ( pselector.budget < -500 ) { + console.info('uBOL: disabling %s', pselector.raw); + pselector.budget = -0x7FFFFFFF; + } + t0 = t1; + if ( nodes.length === 0 ) { continue; } + this.processNodes(nodes, pselector.action); + } + + this.unprocessNodes(toUnstyle); + } + + styleTokenFromStyle(style) { + if ( style === undefined ) { return; } + let styleToken = this.styleTokenMap.get(style); + if ( styleToken !== undefined ) { return styleToken; } + styleToken = randomToken(); + this.styleTokenMap.set(style, styleToken); + self.cssAPI.insert(`[${styleToken}]\n{${style}}\n`); + return styleToken; + } + + processNodes(nodes, action) { + const op = action && action[0] || ''; + const arg = op !== '' ? action[1] : ''; + switch ( op ) { + case '': + /* fall through */ + case 'style': { + const styleToken = this.styleTokenFromStyle( + arg === '' ? this.hideStyle : arg + ); + for ( const node of nodes ) { + node.setAttribute(styleToken, ''); + this.styledNodes.add(node); + } + break; + } + case 'remove': { + for ( const node of nodes ) { + node.remove(); + node.textContent = ''; + } + break; + } + case 'remove-attr': { + const reAttr = regexFromString(arg, true); + for ( const node of nodes ) { + for ( const name of node.getAttributeNames() ) { + if ( reAttr.test(name) === false ) { continue; } + node.removeAttribute(name); + } + } + break; + } + case 'remove-class': { + const reClass = regexFromString(arg, true); + for ( const node of nodes ) { + const cl = node.classList; + for ( const name of cl.values() ) { + if ( reClass.test(name) === false ) { continue; } + cl.remove(name); + } + } + break; + } + default: + break; + } + } + + unprocessNodes(nodes) { + const tokens = Array.from(this.styleTokenMap.values()); + for ( const node of nodes ) { + if ( this.styledNodes.has(node) ) { continue; } + for ( const token of tokens ) { + node.removeAttribute(token); + } + } + } + + uBOL_DOMChanged() { + if ( this.timer !== undefined ) { return; } + this.timer = self.requestAnimationFrame(( ) => { + this.timer = undefined; + this.uBOL_commit(); + }); + } +} + +/******************************************************************************/ + +self.ProceduralFiltererAPI = class { + constructor() { + this.proceduralFilterer = null; + this.domObserver = null; + } + + async reset() { + if ( this.domObserver ) { + this.domObserver.takeRecords(); + this.domObserver.disconnect(); + this.domObserver = null; + } + if ( this.proceduralFilterer ) { + await this.proceduralFilterer.reset(); + this.proceduralFilterer = null; + } + } + + addSelectors(selectors) { + if ( this.proceduralFilterer === null ) { + this.proceduralFilterer = new ProceduralFilterer(); + } + if ( this.domObserver === null ) { + this.domObserver = new MutationObserver(mutations => { + this.onDOMChanged(mutations); + }); + this.domObserver.observe(document, { childList: true, subtree: true }); + } + this.proceduralFilterer.addSelectors(selectors); + this.proceduralFilterer.uBOL_commit(); + } + + qsa(selector) { + const o = JSON.parse(selector); + const pselector = new PSelectorRoot(null, o); + return pselector.exec(); + } + + onDOMChanged(mutations) { + for ( const mutation of mutations ) { + for ( const added of mutation.addedNodes ) { + if ( added.nodeType !== 1 ) { continue; } + return this.proceduralFilterer.uBOL_DOMChanged(); + } + for ( const removed of mutation.removedNodes ) { + if ( removed.nodeType !== 1 ) { continue; } + return this.proceduralFilterer.uBOL_DOMChanged(); + } + } + } +}; + +/******************************************************************************/ + +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,708 +19,118 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - // Important! // Isolate from global scope (function uBOL_cssProcedural() { /******************************************************************************/ -let proceduralFilterer; +const proceduralImports = self.proceduralImports || []; +self.proceduralImports = undefined; /******************************************************************************/ -const addStylesheet = text => { - try { - const sheet = new CSSStyleSheet(); - sheet.replace(`@layer{${text}}`); - document.adoptedStyleSheets = [ - ...document.adoptedStyleSheets, - sheet - ]; - } catch(ex) { - } -}; - -const nonVisualElements = { - script: true, - style: true, -}; +const selectors = []; +const exceptions = []; -const regexFromString = (s, exact = false) => { - if ( s === '' ) { return /^/; } - const match = /^\/(.+)\/([i]?)$/.exec(s); - if ( match !== null ) { - return new RegExp(match[1], match[2] || undefined); +const lookupHostname = (hostname, details, out) => { + let seqi = details.hostnamesMap.get(hostname); + if ( seqi === undefined ) { return; } + const { argsList, argsSeqs } = details; + for (;;) { + const argi = argsSeqs[seqi++]; + const done = argi > 0; + out.push(...JSON.parse(argsList[done ? argi : -argi])); + if ( done ) { break; } } - const reStr = s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - return new RegExp(exact ? `^${reStr}$` : reStr, 'i'); }; -/******************************************************************************/ - -// 'P' stands for 'Procedural' - -class PSelectorTask { - begin() { - } - end() { - } -} - -/******************************************************************************/ - -class PSelectorVoidTask extends PSelectorTask { - constructor(task) { - super(); - console.info(`uBO: :${task[0]}() operator does not exist`); - } - transpose() { - } -} - -/******************************************************************************/ - -class PSelectorHasTextTask extends PSelectorTask { - constructor(task) { - super(); - this.needle = regexFromString(task[1]); - } - transpose(node, output) { - if ( this.needle.test(node.textContent) ) { - output.push(node); - } - } -} - -/******************************************************************************/ - -class PSelectorIfTask extends PSelectorTask { - constructor(task) { - super(); - this.pselector = new PSelector(task[1]); - } - transpose(node, output) { - if ( this.pselector.test(node) === this.target ) { - output.push(node); - } - } -} -PSelectorIfTask.prototype.target = true; - -class PSelectorIfNotTask extends PSelectorIfTask { -} -PSelectorIfNotTask.prototype.target = false; - -/******************************************************************************/ - -class PSelectorMatchesAttrTask extends PSelectorTask { - constructor(task) { - super(); - this.reAttr = regexFromString(task[1].attr, true); - this.reValue = regexFromString(task[1].value, true); - } - transpose(node, output) { - const attrs = node.getAttributeNames(); - for ( const attr of attrs ) { - if ( this.reAttr.test(attr) === false ) { continue; } - if ( this.reValue.test(node.getAttribute(attr)) === false ) { continue; } - output.push(node); - } +const lookupAll = hostname => { + for ( const details of proceduralImports ) { + lookupHostname(hostname, details, selectors); + const matches = []; + lookupHostname(`~${hostname}`, details, matches); + if ( matches.length === 0 ) { continue; } + exceptions.push(...matches.map(a => JSON.stringify(a))); } -} +}; -/******************************************************************************/ +self.isolatedAPI.forEachHostname(lookupAll, { + hasEntities: proceduralImports.some(a => a.hasEntities) +}); +proceduralImports.length = 0; -class PSelectorMatchesCSSTask extends PSelectorTask { - constructor(task) { - super(); - this.name = task[1].name; - this.pseudo = task[1].pseudo ? `::${task[1].pseudo}` : null; - let arg0 = task[1].value, arg1; - if ( Array.isArray(arg0) ) { - arg1 = arg0[1]; arg0 = arg0[0]; - } - this.value = new RegExp(arg0, arg1); - } - transpose(node, output) { - const style = window.getComputedStyle(node, this.pseudo); - if ( style !== null && this.value.test(style[this.name]) ) { - output.push(node); - } - } -} -class PSelectorMatchesCSSAfterTask extends PSelectorMatchesCSSTask { - constructor(task) { - super(task); - this.pseudo = '::after'; - } -} +if ( selectors.length === 0 ) { return; } -class PSelectorMatchesCSSBeforeTask extends PSelectorMatchesCSSTask { - constructor(task) { - super(task); - this.pseudo = '::before'; +const exceptedSelectors = exceptions.length !== 0 + ? selectors.filter(a => exceptions.includes(JSON.stringify(a)) === false) + : selectors; +if ( exceptedSelectors.length === 0 ) { return; } + +const declaratives = exceptedSelectors.filter(a => a.cssable); +if ( declaratives.length !== 0 ) { + const cssRuleFromProcedural = details => { + const { tasks, action } = details; + let mq, selector; + if ( Array.isArray(tasks) ) { + if ( tasks[0][0] !== 'matches-media' ) { return; } + mq = tasks[0][1]; + if ( tasks.length > 2 ) { return; } + if ( tasks.length === 2 ) { + if ( tasks[1][0] !== 'spath' ) { return; } + selector = tasks[1][1]; + } + } + let style; + if ( Array.isArray(action) ) { + if ( action[0] !== 'style' ) { return; } + selector = selector || details.selector; + style = action[1]; + } + if ( mq === undefined && style === undefined && selector === undefined ) { return; } + if ( mq === undefined ) { + return `${selector}\n{${style}}`; + } + if ( style === undefined ) { + return `@media ${mq} {\n${selector}\n{display:none!important;}\n}`; + } + return `@media ${mq} {\n${selector}\n{${style}}\n}`; + }; + const sheetText = []; + for ( const details of declaratives ) { + const ruleText = cssRuleFromProcedural(details); + if ( ruleText === undefined ) { continue; } + sheetText.push(ruleText); + } + if ( sheetText.length !== 0 ) { + self.cssAPI.insert(sheetText.join('\n')); } } -/******************************************************************************/ - -class PSelectorMatchesMediaTask extends PSelectorTask { - constructor(task) { - super(); - this.mql = window.matchMedia(task[1]); - if ( this.mql.media === 'not all' ) { return; } - this.mql.addEventListener('change', ( ) => { - if ( proceduralFilterer instanceof Object === false ) { return; } - proceduralFilterer.onDOMChanged([ null ]); +const procedurals = exceptedSelectors.filter(a => a.cssable === undefined); +if ( procedurals.length !== 0 ) { + const addSelectors = selectors => { + if ( self.listsProceduralFiltererAPI instanceof Object === false ) { return; } + self.listsProceduralFiltererAPI.addSelectors(selectors); + }; + if ( self.ProceduralFiltererAPI === undefined ) { + self.ProceduralFiltererAPI = chrome.runtime.sendMessage({ + what: 'injectCSSProceduralAPI' + }).catch(( ) => { }); } - transpose(node, output) { - if ( this.mql.matches === false ) { return; } - output.push(node); - } -} - -/******************************************************************************/ - -class PSelectorMatchesPathTask extends PSelectorTask { - constructor(task) { - super(); - this.needle = regexFromString(task[1]); - } - transpose(node, output) { - if ( this.needle.test(self.location.pathname + self.location.search) ) { - output.push(node); - } - } -} - -/******************************************************************************/ - -class PSelectorMinTextLengthTask extends PSelectorTask { - constructor(task) { - super(); - this.min = task[1]; - } - transpose(node, output) { - if ( node.textContent.length >= this.min ) { - output.push(node); - } - } -} - -/******************************************************************************/ - -class PSelectorOthersTask extends PSelectorTask { - constructor() { - super(); - this.targets = new Set(); - } - begin() { - this.targets.clear(); - } - end(output) { - const toKeep = new Set(this.targets); - const toDiscard = new Set(); - const body = document.body; - let discard = null; - for ( let keep of this.targets ) { - while ( keep !== null && keep !== body ) { - toKeep.add(keep); - toDiscard.delete(keep); - discard = keep.previousElementSibling; - while ( discard !== null ) { - if ( - nonVisualElements[discard.localName] !== true && - toKeep.has(discard) === false - ) { - toDiscard.add(discard); - } - discard = discard.previousElementSibling; - } - discard = keep.nextElementSibling; - while ( discard !== null ) { - if ( - nonVisualElements[discard.localName] !== true && - toKeep.has(discard) === false - ) { - toDiscard.add(discard); - } - discard = discard.nextElementSibling; - } - keep = keep.parentElement; - } - } - for ( discard of toDiscard ) { - output.push(discard); - } - this.targets.clear(); - } - transpose(candidate) { - for ( const target of this.targets ) { - if ( target.contains(candidate) ) { return; } - if ( candidate.contains(target) ) { - this.targets.delete(target); - } - } - this.targets.add(candidate); - } -} - -/******************************************************************************/ - -// https://github.com/AdguardTeam/ExtendedCss/issues/31#issuecomment-302391277 -// Prepend `:scope ` if needed. -class PSelectorSpathTask extends PSelectorTask { - constructor(task) { - super(); - this.spath = task[1]; - this.nth = /^(?:\s*[+~]|:)/.test(this.spath); - if ( this.nth ) { return; } - if ( /^\s*>/.test(this.spath) ) { - this.spath = `:scope ${this.spath.trim()}`; - } - } - transpose(node, output) { - const nodes = this.nth - ? PSelectorSpathTask.qsa(node, this.spath) - : node.querySelectorAll(this.spath); - for ( const node of nodes ) { - output.push(node); - } - } - // Helper method for other operators. - static qsa(node, selector) { - const parent = node.parentElement; - if ( parent === null ) { return []; } - let pos = 1; - for (;;) { - node = node.previousElementSibling; - if ( node === null ) { break; } - pos += 1; - } - return parent.querySelectorAll( - `:scope > :nth-child(${pos})${selector}` - ); - } -} - -/******************************************************************************/ - -class PSelectorUpwardTask extends PSelectorTask { - constructor(task) { - super(); - const arg = task[1]; - if ( typeof arg === 'number' ) { - this.i = arg; - } else { - this.s = arg; - } - } - transpose(node, output) { - if ( this.s !== '' ) { - const parent = node.parentElement; - if ( parent === null ) { return; } - node = parent.closest(this.s); - if ( node === null ) { return; } - } else { - let nth = this.i; - for (;;) { - node = node.parentElement; - if ( node === null ) { return; } - nth -= 1; - if ( nth === 0 ) { break; } - } - } - output.push(node); - } -} -PSelectorUpwardTask.prototype.i = 0; -PSelectorUpwardTask.prototype.s = ''; - -/******************************************************************************/ - -class PSelectorWatchAttrs extends PSelectorTask { - constructor(task) { - super(); - this.observer = null; - this.observed = new WeakSet(); - this.observerOptions = { - attributes: true, - subtree: true, - }; - const attrs = task[1]; - if ( Array.isArray(attrs) && attrs.length !== 0 ) { - this.observerOptions.attributeFilter = task[1]; - } - } - // TODO: Is it worth trying to re-apply only the current selector? - handler() { - if ( proceduralFilterer instanceof Object ) { - proceduralFilterer.onDOMChanged([ null ]); - } - } - transpose(node, output) { - output.push(node); - if ( this.observed.has(node) ) { return; } - if ( this.observer === null ) { - this.observer = new MutationObserver(this.handler); - } - this.observer.observe(node, this.observerOptions); - this.observed.add(node); - } -} - -/******************************************************************************/ - -class PSelectorXpathTask extends PSelectorTask { - constructor(task) { - super(); - this.xpe = document.createExpression(task[1], null); - this.xpr = null; - } - transpose(node, output) { - this.xpr = this.xpe.evaluate( - node, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - this.xpr - ); - let j = this.xpr.snapshotLength; - while ( j-- ) { - const node = this.xpr.snapshotItem(j); - if ( node.nodeType === 1 ) { - output.push(node); - } - } - } -} - -/******************************************************************************/ - -class PSelector { - constructor(o) { - this.raw = o.raw; - this.selector = o.selector; - this.tasks = []; - const tasks = []; - if ( Array.isArray(o.tasks) === false ) { return; } - for ( const task of o.tasks ) { - const ctor = this.operatorToTaskMap.get(task[0]) || PSelectorVoidTask; - tasks.push(new ctor(task)); - } - this.tasks = tasks; - } - prime(input) { - const root = input || document; - if ( this.selector === '' ) { return [ root ]; } - if ( input !== document && /^ [>+~]/.test(this.selector) ) { - return Array.from(PSelectorSpathTask.qsa(input, this.selector)); - } - return Array.from(root.querySelectorAll(this.selector)); - } - exec(input) { - let nodes = this.prime(input); - for ( const task of this.tasks ) { - if ( nodes.length === 0 ) { break; } - const transposed = []; - task.begin(); - for ( const node of nodes ) { - task.transpose(node, transposed); - } - task.end(transposed); - nodes = transposed; - } - return nodes; - } - test(input) { - const nodes = this.prime(input); - for ( const node of nodes ) { - let output = [ node ]; - for ( const task of this.tasks ) { - const transposed = []; - task.begin(); - for ( const node of output ) { - task.transpose(node, transposed); - } - task.end(transposed); - output = transposed; - if ( output.length === 0 ) { break; } - } - if ( output.length !== 0 ) { return true; } - } - return false; - } -} -PSelector.prototype.operatorToTaskMap = new Map([ - [ 'has', PSelectorIfTask ], - [ 'has-text', PSelectorHasTextTask ], - [ 'if', PSelectorIfTask ], - [ 'if-not', PSelectorIfNotTask ], - [ 'matches-attr', PSelectorMatchesAttrTask ], - [ 'matches-css', PSelectorMatchesCSSTask ], - [ 'matches-css-after', PSelectorMatchesCSSAfterTask ], - [ 'matches-css-before', PSelectorMatchesCSSBeforeTask ], - [ 'matches-media', PSelectorMatchesMediaTask ], - [ 'matches-path', PSelectorMatchesPathTask ], - [ 'min-text-length', PSelectorMinTextLengthTask ], - [ 'not', PSelectorIfNotTask ], - [ 'others', PSelectorOthersTask ], - [ 'spath', PSelectorSpathTask ], - [ 'upward', PSelectorUpwardTask ], - [ 'watch-attr', PSelectorWatchAttrs ], - [ 'xpath', PSelectorXpathTask ], -]); - -/******************************************************************************/ - -class PSelectorRoot extends PSelector { - constructor(o) { - super(o); - this.budget = 200; // I arbitrary picked a 1/5 second - this.raw = o.raw; - this.cost = 0; - this.lastAllowanceTime = 0; - this.action = o.action; - } - prime(input) { - try { - return super.prime(input); - } catch (ex) { - } - return []; - } -} - -/******************************************************************************/ - -class ProceduralFilterer { - constructor(selectors) { - this.selectors = []; - this.masterToken = this.randomToken(); - this.styleTokenMap = new Map(); - this.styledNodes = new Set(); - this.timer = undefined; - this.hideStyle = 'display:none!important;'; - this.addSelectors(selectors); - // Important: commit now (do not go through onDOMChanged) to be sure - // first pass is going to happen asap. - this.uBOL_commitNow(); - } - - addSelectors() { - for ( const selector of selectors ) { - const pselector = new PSelectorRoot(selector); - this.primeProceduralSelector(pselector); - this.selectors.push(pselector); - } - this.onDOMChanged(); - } - - // This allows to perform potentially expensive initialization steps - // before the filters are ready to be applied. - primeProceduralSelector(pselector) { - if ( pselector.action === undefined ) { - this.styleTokenFromStyle(this.hideStyle); - } else if ( pselector.action[0] === 'style' ) { - this.styleTokenFromStyle(pselector.action[1]); - } - return pselector; - } - - uBOL_commitNow() { - // https://github.com/uBlockOrigin/uBlock-issues/issues/341 - // Be ready to unhide nodes which no longer matches any of - // the procedural selectors. - const toUnstyle = this.styledNodes; - this.styledNodes = new Set(); - - let t0 = Date.now(); - - for ( const pselector of this.selectors.values() ) { - const allowance = Math.floor((t0 - pselector.lastAllowanceTime) / 2000); - if ( allowance >= 1 ) { - pselector.budget += allowance * 50; - if ( pselector.budget > 200 ) { pselector.budget = 200; } - pselector.lastAllowanceTime = t0; - } - if ( pselector.budget <= 0 ) { continue; } - const nodes = pselector.exec(); - const t1 = Date.now(); - pselector.budget += t0 - t1; - if ( pselector.budget < -500 ) { - console.info('uBOL: disabling %s', pselector.raw); - pselector.budget = -0x7FFFFFFF; - } - t0 = t1; - if ( nodes.length === 0 ) { continue; } - this.processNodes(nodes, pselector.action); - } - - this.unprocessNodes(toUnstyle); - } - - styleTokenFromStyle(style) { - if ( style === undefined ) { return; } - let styleToken = this.styleTokenMap.get(style); - if ( styleToken !== undefined ) { return styleToken; } - styleToken = this.randomToken(); - this.styleTokenMap.set(style, styleToken); - addStylesheet( - `[${this.masterToken}][${styleToken}]\n{${style}}\n`, - ); - return styleToken; - } - - processNodes(nodes, action) { - const op = action && action[0] || ''; - const arg = op !== '' ? action[1] : ''; - switch ( op ) { - case '': - /* fall through */ - case 'style': { - const styleToken = this.styleTokenFromStyle( - arg === '' ? this.hideStyle : arg - ); - for ( const node of nodes ) { - node.setAttribute(this.masterToken, ''); - node.setAttribute(styleToken, ''); - this.styledNodes.add(node); - } - break; - } - case 'remove': { - for ( const node of nodes ) { - node.remove(); - node.textContent = ''; - } - break; - } - case 'remove-attr': { - const reAttr = regexFromString(arg, true); - for ( const node of nodes ) { - for ( const name of node.getAttributeNames() ) { - if ( reAttr.test(name) === false ) { continue; } - node.removeAttribute(name); - } - } - break; - } - case 'remove-class': { - const reClass = regexFromString(arg, true); - for ( const node of nodes ) { - const cl = node.classList; - for ( const name of cl.values() ) { - if ( reClass.test(name) === false ) { continue; } - cl.remove(name); - } - } - break; - } - default: - break; - } - } - - // TODO: Current assumption is one style per hit element. Could be an - // issue if an element has multiple styling and one styling is - // brought back. Possibly too rare to care about this for now. - unprocessNodes(nodes) { - for ( const node of nodes ) { - if ( this.styledNodes.has(node) ) { continue; } - node.removeAttribute(this.masterToken); - } - } - - randomToken() { - const n = Math.random(); - return String.fromCharCode(n * 25 + 97) + - Math.floor( - (0.25 + n * 0.75) * Number.MAX_SAFE_INTEGER - ).toString(36).slice(-8); - } - - onDOMChanged() { - if ( this.timer !== undefined ) { return; } - this.timer = self.requestAnimationFrame(( ) => { - this.timer = undefined; - this.uBOL_commitNow(); + if ( self.ProceduralFiltererAPI instanceof Promise ) { + self.ProceduralFiltererAPI.then(( ) => { + self.listsProceduralFiltererAPI = new self.ProceduralFiltererAPI(); + addSelectors(procedurals); }); - } -} - -/******************************************************************************/ - -const proceduralImports = self.proceduralImports || []; - -const lookupSelectors = (hn, out) => { - for ( const { argsList, hostnamesMap } of proceduralImports ) { - let argsIndices = hostnamesMap.get(hn); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - out.push(...details.a.map(json => JSON.parse(json))); - } - } -}; - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -const selectors = []; -while ( hn ) { - lookupSelectors(hn, selectors); - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); } else { - hn = '*'; + addSelectors(procedurals); } } -proceduralImports.length = 0; - -/******************************************************************************/ - -if ( selectors.length === 0 ) { return; } - -proceduralFilterer = new ProceduralFilterer(selectors); - -const observer = new MutationObserver(mutations => { - let domChanged = false; - for ( let i = 0; i < mutations.length && !domChanged; i++ ) { - const mutation = mutations[i]; - for ( const added of mutation.addedNodes ) { - if ( added.nodeType !== 1 ) { continue; } - domChanged = true; - break; - } - if ( domChanged === false ) { - for ( const removed of mutation.removedNodes ) { - if ( removed.nodeType !== 1 ) { continue; } - domChanged = true; - break; - } - } - } - if ( domChanged === false ) { return; } - proceduralFilterer.onDOMChanged(); -}); - -observer.observe(document, { - childList: true, - subtree: true, -}); - /******************************************************************************/ })(); -/******************************************************************************/ +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-specific.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-specific.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssSpecificEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const specificEntityImports = self.specificEntityImports || []; - -/******************************************************************************/ - -const lookupSelectors = (hn, entity, out) => { - for ( const { argsList, entitiesMap } of specificEntityImports ) { - let argsIndices = entitiesMap.get(entity); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - out.push(details.a); - } - } -}; - -let hn = ''; -try { hn = document.location.hostname; } catch(ex) { } -const selectors = []; -const hnparts = hn.split('.'); -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - lookupSelectors( - hnparts.slice(i).join('.'), - hnparts.slice(i,j).join('.'), - selectors - ); - } -} - -self.specificEntityImports = undefined; - -if ( selectors.length === 0 ) { return; } - -try { - const sheet = new CSSStyleSheet(); - sheet.replace(`@layer{${selectors.join(',')}{display:none!important;}}`); - document.adoptedStyleSheets = [ - ...document.adoptedStyleSheets, - sheet - ]; -} catch(ex) { -} - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,74 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +// Important! +// Isolate from global scope +(function uBOL_cssSpecific() { + +/******************************************************************************/ + +const specificImports = self.specificImports || []; +self.specificImports = undefined; + +/******************************************************************************/ + +const selectors = []; +const exceptions = []; + +const lookupHostname = (hostname, details, out) => { + let seqi = details.hostnamesMap.get(hostname); + if ( seqi === undefined ) { return; } + const { argsList, argsSeqs } = details; + for (;;) { + const argi = argsSeqs[seqi++]; + const done = argi > 0; + out.push(...argsList[done ? argi : -argi].split('\n')); + if ( done ) { break; } + } +}; + +const lookupAll = hostname => { + for ( const details of specificImports ) { + lookupHostname(hostname, details, selectors); + lookupHostname(`~${hostname}`, details, exceptions); + } +}; + +self.isolatedAPI.forEachHostname(lookupAll, { + hasEntities: specificImports.some(a => a.hasEntities) +}); + +specificImports.length = 0; + +if ( selectors.length === 0 ) { return; } + +const exceptedSelectors = exceptions.length !== 0 + ? selectors.filter(a => exceptions.includes(a) === false) + : selectors; +if ( exceptedSelectors.length === 0 ) { return; } + +self.cssAPI.insert(`${exceptedSelectors.join(',')}{display:none!important;}`); + +/******************************************************************************/ + +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,45 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(function uBOL_cssUserTerminate() { + +/******************************************************************************/ + +const plainSelectors = self.customFilters?.plainSelectors; +if ( plainSelectors ) { + chrome.runtime.sendMessage({ + what: 'removeCSS', + css: `${plainSelectors.join(',\n')}{display:none!important;}`, + }).catch(( ) => { + }); +} + +if ( self.customProceduralFiltererAPI instanceof Object ) { + self.customProceduralFiltererAPI.reset(); +} + +self.customFilters = undefined; + +/******************************************************************************/ + +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-user.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/css-user.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,48 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(async function uBOL_cssUser() { + +/******************************************************************************/ + +const docURL = new URL(document.baseURI); +const details = await chrome.runtime.sendMessage({ + what: 'injectCustomFilters', + hostname: docURL.hostname, +}).catch(( ) => { +}); + +if ( details?.proceduralSelectors?.length ) { + if ( self.ProceduralFiltererAPI ) { + self.customProceduralFiltererAPI = new self.ProceduralFiltererAPI(); + self.customProceduralFiltererAPI.addSelectors( + details.proceduralSelectors.map(a => JSON.parse(a)) + ); + } +} + +self.customFilters = details; + +/******************************************************************************/ + +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,80 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock/ + +*/ + +/******************************************************************************/ + +(api => { + if ( typeof api === 'object' ) { return; } + + const isolatedAPI = self.isolatedAPI = {}; + + const hostnameStack = (( ) => { + const docloc = document.location; + const origins = [ docloc.origin ]; + if ( docloc.ancestorOrigins ) { + origins.push(...docloc.ancestorOrigins); + } + return origins.map((origin, i) => { + const beg = origin.lastIndexOf('://'); + if ( beg === -1 ) { return; } + const hn1 = origin.slice(beg+3) + const end = hn1.indexOf(':'); + const hn2 = end === -1 ? hn1 : hn1.slice(0, end); + return { hnparts: hn2.split('.'), i }; + }).filter(a => a !== undefined); + })(); + + const forEachHostname = (entry, callback, details) => { + const hnparts = entry.hnparts; + const hnpartslen = hnparts.length; + if ( hnpartslen === 0 ) { return; } + for ( let i = 0; i < hnpartslen; i++ ) { + const r = callback(`${hnparts.slice(i).join('.')}`, details); + if ( r !== undefined ) { return r; } + } + if ( details?.hasEntities !== true ) { return; } + const n = hnpartslen - 1; + for ( let i = 0; i < n; i++ ) { + for ( let j = n; j > i; j-- ) { + const r = callback(`${hnparts.slice(i,j).join('.')}.*`, details); + if ( r !== undefined ) { return r; } + } + } + }; + + isolatedAPI.forEachHostname = (callback, details) => { + if ( hostnameStack.length === 0 ) { return; } + return forEachHostname(hostnameStack[0], callback, details); + }; + + isolatedAPI.forEachHostnameAncestors = (callback, details) => { + for ( const entry of hostnameStack ) { + if ( entry.i === 0 ) { continue; } + const r = forEachHostname(entry, callback, details); + if ( r !== undefined ) { return r; } + } + }; +})(self.isolatedAPI); + +/******************************************************************************/ + +void 0; \ No newline at end of file diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/picker.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/picker.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/picker.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/picker.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,303 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(async ( ) => { + +/******************************************************************************/ + +const ubolOverlay = self.ubolOverlay; +if ( ubolOverlay === undefined ) { return; } +if ( ubolOverlay.file === '/picker-ui.html' ) { return; } + +/******************************************************************************/ + +function attributeNameFromPart(part) { + const pos = part.search(/\^?=/); + return part.slice(1, pos); +} + +function selectorFromAddresses(partsDB, addresses) { + const selector = []; + let majorLast = -1; + for ( const address of addresses ) { + const major = address >>> 12; + if ( majorLast !== -1 ) { + const delta = majorLast - major; + if ( delta > 1 ) { + selector.push(' '); + } else if ( delta === 1 ) { + selector.push(' > '); + } + } + majorLast = major; + const part = partsDB.get(address); + selector.push( + (address & 0xF) === 3 + ? `[${attributeNameFromPart(part)}]` + : part + ); + } + return selector.join(''); +} + +/******************************************************************************* + * + * Selector part address: + * 0b00000000_00000000_0000 + * | | | + * | | +-- 4-bit: Descriptor + * | +------- 8-bit: Part index + * +---------------- 8-bit: List index + * Descriptor: + * - 0: tag name + * - 1: id + * - 2: class + * - 3: attribute + * - 4: :nth-of-type + * List index: 0 is deepest + * + * Selector part addresses are used to reference parts in associated database. + * + * */ + +function candidatesAtPoint(x, y) { + // We need at least one element. + let elem = null; + if ( typeof x === 'number' ) { + elem = ubolOverlay.elementFromPoint(x, y); + } else if ( x instanceof HTMLElement ) { + elem = x; + x = undefined; + } + + const partsDB = new Map(); + const listParts = []; + while ( elem && elem !== document.body ) { + const tagName = elem.localName; + const addressMajor = listParts.length << 12; + partsDB.set(addressMajor, CSS.escape(tagName)); + const parts = [ addressMajor ]; + // Id + if ( typeof elem.id === 'string' && elem.id !== '' ) { + const address = addressMajor | parts.length << 4 | 1; + partsDB.set(address, `#${CSS.escape(elem.id)}`); + parts.push(address); + } + // Classes + for ( const name of elem.classList.values() ) { + const address = addressMajor | parts.length << 4 | 2; + partsDB.set(address, `.${CSS.escape(name)}`); + parts.push(address); + } + // Attributes + for ( const name of elem.getAttributeNames() ) { + if ( name === 'id' || name === 'class' ) { continue; } + if ( excludedAttributeExpansion.includes(name) ) { + const address = addressMajor | parts.length << 4 | 3; + partsDB.set(address, `[${CSS.escape(name)}]`); + parts.push(address); + continue; + } + let value = elem.getAttribute(name); + const pos = value.search(/[\n\r]/); + if ( pos !== -1 ) { + value = value.slice(0, pos); + } + const address = addressMajor | parts.length << 4 | 3; + partsDB.set(address, `[${CSS.escape(name)}="${value}"]`); + parts.push(address); + } + // https://github.com/chrisaljoudi/uBlock/issues/637 + // If the selector is still ambiguous at this point, further narrow + // using `:nth-of-type`. + const parentNode = elem.parentNode; + if ( ubolOverlay.qsa(parentNode, `:scope > ${selectorFromAddresses(partsDB, parts)}`).length > 1 ) { + let i = 1; + while ( elem.previousSibling !== null ) { + elem = elem.previousSibling; + if ( typeof elem.localName !== 'string' ) { continue; } + if ( elem.localName !== tagName ) { continue; } + i++; + } + const address = addressMajor | parts.length << 4 | 4; + partsDB.set(address, `:nth-of-type(${i})`); + parts.push(address); + } + listParts.push(parts); + elem = elem.parentElement; + } + if ( listParts.length === 0 ) { return; } + + const sliderCandidates = []; + for ( let i = 0, n = listParts.length; i < n; i++ ) { + sliderCandidates.push(listParts[i]); + for ( let j = i + 1; j < n; j++ ) { + sliderCandidates.push([ + ...listParts[j], + ...sliderCandidates.at(-1), + ]); + } + } + const sliderMap = new Map(); + for ( const candidates of sliderCandidates ) { + if ( candidates.some(a => (a & 0xF) === 1) ) { + const selectorPath = candidates.filter(a => (a & 0xF) === 1); + sliderMap.set(JSON.stringify(selectorPath), 0); + } else if ( candidates.some(a => (a & 0xF) === 4) ) { + const selectorPath = candidates.filter(a => { + return a &= 0xF, a === 0 || a === 4; + }); + sliderMap.set(JSON.stringify(selectorPath), 0); + } + if ( candidates.some(a => (a & 0xF) === 2) ) { + const selectorPath = candidates.filter(a => { + return a &= 0xF, a === 0 || a === 2; + }); + sliderMap.set(JSON.stringify(selectorPath), 0); + } + const selectorPath = candidates.filter(a => { + return a &= 0xF, a === 0 || a === 3; + }); + sliderMap.set(JSON.stringify(selectorPath), 0); + } + sliderMap.delete('[]'); + const elemToIdMap = new Map(); + const resultSetMap = new Map(); + let elemId = 1; + for ( const json of sliderMap.keys() ) { + const addresses = JSON.parse(json); + const selector = selectorFromAddresses(partsDB, addresses); + if ( excludedSelectors.includes(selector) ) { continue; } + const elems = ubolOverlay.qsa(document, selector); + if ( elems.length === 0 ) { continue; } + const resultSet = []; + for ( const elem of elems ) { + if ( elemToIdMap.has(elem) === false ) { + elemToIdMap.set(elem, elemId++); + } + resultSet.push(elemToIdMap.get(elem)); + } + const resultSetKey = JSON.stringify(resultSet.sort()); + const current = resultSetMap.get(resultSetKey); + if ( current ) { + if ( current.length < addresses.length ) { continue; } + if ( current.length === addresses.length ) { + if ( addresses.some(a => (a & 0xF) === 2) === false ) { + if ( current.some(a => (a & 0xF) === 2) ) { continue; } + } + } + } + resultSetMap.set(resultSetKey, addresses); + } + const sliderParts = Array.from(resultSetMap).toSorted((a, b) => { + let amajor = a[1].at(-1) >>> 12; + let bmajor = b[1].at(-1) >>> 12; + if ( amajor !== bmajor ) { return bmajor - amajor; } + amajor = a[1].at(0) >>> 12; + bmajor = b[1].at(0) >>> 12; + if ( amajor !== bmajor ) { return bmajor - amajor; } + if ( a[0].length !== b[0].length ) { + return b[0].length - a[0].length; + } + return b[1].length - a[1].length; + }).map(a => a[1]); + return { + partsDB: Array.from(partsDB), + listParts, + sliderParts, + }; +} + +const excludedAttributeExpansion = [ + 'sizes', + 'srcset', +]; +const excludedSelectors = [ + 'div', + 'span', +]; + +/******************************************************************************/ + +async function previewSelector(selector) { + if ( selector === previewedSelector ) { return; } + if ( previewedSelector !== '' ) { + if ( previewedSelector.startsWith('{') ) { + if ( self.pickerProceduralFilteringAPI ) { + await self.pickerProceduralFilteringAPI.reset(); + } + } + if ( previewedCSS !== '' ) { + await ubolOverlay.sendMessage({ what: 'removeCSS', css: previewedCSS }); + previewedCSS = ''; + } + } + previewedSelector = selector || ''; + if ( selector === '' ) { return; } + if ( selector.startsWith('{') ) { + if ( self.ProceduralFiltererAPI === undefined ) { return; } + if ( self.pickerProceduralFilteringAPI === undefined ) { + self.pickerProceduralFilteringAPI = new self.ProceduralFiltererAPI(); + } + self.pickerProceduralFilteringAPI.addSelectors([ JSON.parse(selector) ]); + return; + } + previewedCSS = `${selector}{display:none!important;}`; + await ubolOverlay.sendMessage({ what: 'insertCSS', css: previewedCSS }); +} + +let previewedSelector = ''; +let previewedCSS = ''; + +/******************************************************************************/ + +const previewProceduralFiltererAPI = new self.ProceduralFiltererAPI(); + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'quitTool': + previewProceduralFiltererAPI.reset(); + break; + case 'startCustomFilters': + return ubolOverlay.sendMessage({ what: 'startCustomFilters' }); + case 'terminateCustomFilters': + return ubolOverlay.sendMessage({ what: 'terminateCustomFilters' }); + case 'candidatesAtPoint': + return candidatesAtPoint(msg.mx, msg.my, msg.broad); + case 'previewSelector': + return previewSelector(msg.selector); + default: + break; + } +} + +/******************************************************************************/ + +await ubolOverlay.install('/picker-ui.html', onMessage); + +/******************************************************************************/ + +})(); + + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,367 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(function uBOLOverlay() { + +/******************************************************************************/ + +if ( self.ubolOverlay ) { + self.ubolOverlay.stop(); + self.ubolOverlay = undefined; +} + +self.ubolOverlay = { + file: '', + webext: typeof browser === 'object' ? browser : chrome, + url: new URL(document.baseURI), + port: null, + highlightedElements: [], + secretAttr: (( ) => { + let secret = String.fromCharCode((Math.random() * 26) + 97); + do { + secret += (Math.floor(Math.random() * 2147483647) + 2147483647) + .toString(36) + .slice(2); + } while ( secret.length < 8 ); + return secret; + })(), + + start() { + const cssStyle = [ + 'background: transparent', + 'border: 0', + 'border-radius: 0', + 'box-shadow: none', + 'color-scheme: light dark', + 'display: block', + 'filter: none', + 'height: 100vh', + ' height: 100svh', + 'left: 0', + 'margin: 0', + 'max-height: none', + 'max-width: none', + 'min-height: unset', + 'min-width: unset', + 'opacity: 1', + 'outline: 0', + 'padding: 0', + 'pointer-events: auto', + 'position: fixed', + 'top: 0', + 'transform: none', + 'visibility: hidden', + 'width: 100%', + 'z-index: 2147483647', + '' + ].join(' !important;\n'); + this.pickerCSS = [ + `:root > [${this.secretAttr}] { ${cssStyle} }`, + `:root > [${this.secretAttr}-loaded] { visibility: visible !important; }`, + `:root > [${this.secretAttr}-click] { pointer-events: none !important; }`, + ].join('\n'); + this.sendMessage({ what: 'insertCSS', css: this.pickerCSS }); + self.addEventListener('scroll', this.onViewportChanged, { passive: true }); + self.addEventListener('resize', this.onViewportChanged, { passive: true }); + self.addEventListener('keydown', this.onKeyPressed, true); + }, + + stop() { + if ( this.pickerCSS ) { + this.sendMessage({ what: 'removeCSS', css: this.pickerCSS }); + this.pickerCSS = undefined; + } + self.removeEventListener('scroll', this.onViewportChanged, { passive: true }); + self.removeEventListener('resize', this.onViewportChanged, { passive: true }); + self.removeEventListener('keydown', this.onKeyPressed, true); + if ( this.frame ) { + this.frame.remove(); + this.frame = null; + } + if ( this.port ) { + this.port.close(); + this.port.onmessage = null; + this.port.onmessageerror = null; + this.port = null; + } + this.onmessage = null; + self.ubolOverlay = undefined; + }, + + onViewportChanged() { + self.ubolOverlay.highlightUpdate(); + }, + + onKeyPressed(ev) { + if ( ev.key !== 'Escape' && ev.which !== 27 ) { return; } + ev.stopPropagation(); + ev.preventDefault(); + if ( self.ubolOverlay.onmessage ) { + self.ubolOverlay.onmessage({ what: 'quitTool' }); + } + }, + + sendMessage(msg) { + try { + return this.webext.runtime.sendMessage(msg).catch(( ) => { }); + } catch { + } + }, + + onMessage(wrapped) { + // Response to script-initiated message? + if ( typeof wrapped?.fromScriptId === 'number' ) { + const resolve = this.pendingMessages.get(wrapped.fromScriptId); + if ( resolve ) { + this.pendingMessages.delete(wrapped.fromScriptId); + resolve(wrapped.msg); + } + return; + } + const onmessage = this.onmessage; + const msg = wrapped.msg || wrapped; + let response; + switch ( msg.what ) { + case 'startTool': + this.start(); + break; + case 'quitTool': + this.stop(); + break; + case 'highlightElementAtPoint': + this.highlightElementAtPoint(msg.mx, msg.my); + break; + case 'highlightFromSelector': { + const { elems, error } = this.elementsFromSelector(msg.selector); + this.highlightElements(elems); + if ( msg.scrollTo && elems.length !== 0 ) { + elems[0].scrollIntoView({ block: 'nearest', inline: 'nearest' }); + } + response = { count: elems.length, error }; + break; + } + case 'unhighlight': + this.unhighlight(); + break; + } + response = onmessage && onmessage(msg) || response; + // Send response if this is frame-initiated message + if ( wrapped?.fromFrameId && this.port ) { + const { fromFrameId } = wrapped; + if ( response instanceof Promise ) { + response.then(response => { + if ( this.port === null ) { return; } + this.port.postMessage({ fromFrameId, msg: response }); + }); + } else { + this.port.postMessage({ fromFrameId, msg: response }); + } + } + }, + postMessage(msg) { + if ( this.port === null ) { return; } + const wrapped = { + fromScriptId: this.messageId++, + msg, + }; + return new Promise(resolve => { + this.pendingMessages.set(wrapped.fromScriptId, resolve); + this.port.postMessage(wrapped); + }); + }, + messageId: 1, + pendingMessages: new Map(), + + getElementBoundingClientRect(elem) { + let rect = typeof elem.getBoundingClientRect === 'function' + ? elem.getBoundingClientRect() + : { height: 0, left: 0, top: 0, width: 0 }; + + // https://github.com/gorhill/uBlock/issues/1024 + // Try not returning an empty bounding rect. + if ( rect.width !== 0 && rect.height !== 0 ) { + return rect; + } + if ( elem.shadowRoot instanceof DocumentFragment ) { + return this.getElementBoundingClientRect(elem.shadowRoot); + } + let left = rect.left, + right = left + rect.width, + top = rect.top, + bottom = top + rect.height; + for ( const child of elem.children ) { + rect = this.getElementBoundingClientRect(child); + if ( rect.width === 0 || rect.height === 0 ) { continue; } + if ( rect.left < left ) { left = rect.left; } + if ( rect.right > right ) { right = rect.right; } + if ( rect.top < top ) { top = rect.top; } + if ( rect.bottom > bottom ) { bottom = rect.bottom; } + } + return { + left, right, + top, bottom, + width: right - left, + height: bottom - top, + }; + }, + + highlightUpdate() { + const ow = self.innerWidth; + const oh = self.innerHeight; + const islands = []; + for ( const elem of this.highlightedElements ) { + const rect = this.getElementBoundingClientRect(elem); + // Ignore offscreen areas + if ( rect.left > ow ) { continue; } + if ( rect.top > oh ) { continue; } + if ( rect.left + rect.width < 0 ) { continue; } + if ( rect.top + rect.height < 0 ) { continue; } + islands.push( + `M${rect.left} ${rect.top}h${rect.width}v${rect.height}h-${rect.width}z` + ); + } + this.port.postMessage({ + what: 'svgPaths', + ocean: `M0 0h${ow}v${oh}h-${ow}z`, + islands: islands.join(''), + }); + }, + + highlightElements(iter = []) { + this.highlightedElements = + Array.from(iter).filter(a => + a instanceof Element && a !== this.frame + ); + this.highlightUpdate(); + }, + + qsa(node, selector) { + if ( node === null ) { return []; } + if ( selector.startsWith('{') ) { + if ( this.proceduralFiltererAPI === undefined ) { + if ( self.ProceduralFiltererAPI === undefined ) { return []; } + this.proceduralFiltererAPI = new self.ProceduralFiltererAPI(); + } + return this.proceduralFiltererAPI.qsa(selector); + } + selector = selector.replace(/::[^:]+$/, ''); + try { + const elems = node.querySelectorAll(selector); + this.qsa.error = undefined; + return elems; + } catch (reason) { + this.qsa.error = `${reason}`; + } + return []; + }, + + elementFromPoint(x, y) { + if ( x !== undefined ) { + this.lastX = x; this.lastY = y; + } else if ( this.lastX !== undefined ) { + x = this.lastX; y = this.lastY; + } else { + return null; + } + const magicAttr = `${this.secretAttr}-click`; + this.frame.setAttribute(magicAttr, ''); + let elem = document.elementFromPoint(x, y); + if ( elem === document.body || elem === document.documentElement ) { + elem = null; + } + // https://github.com/uBlockOrigin/uBlock-issues/issues/380 + this.frame.removeAttribute(magicAttr); + return elem; + }, + + elementsFromSelector(selector) { + const elems = this.qsa(document, selector); + return { elems, error: this.qsa.error }; + }, + + highlightElementAtPoint(x, y) { + const elem = self.ubolOverlay.elementFromPoint(x, y); + this.highlightElements([ elem ]); + }, + + unhighlight() { + this.highlightElements([]); + }, + + async install(file, onmessage) { + this.file = file; + const dynamicURL = new URL(this.webext.runtime.getURL(file)); + return new Promise(resolve => { + const frame = document.createElement('iframe'); + const secretAttr = this.secretAttr; + frame.setAttribute(secretAttr, ''); + const onLoad = ( ) => { + frame.onload = null; + frame.setAttribute(`${secretAttr}-loaded`, ''); + const channel = new MessageChannel(); + const port = channel.port1; + port.onmessage = ev => { + self.ubolOverlay && + self.ubolOverlay.onMessage(ev.data || {}) + }; + port.onmessageerror = ( ) => { + self.ubolOverlay && + self.ubolOverlay.onMessage({ what: 'quitTool' }) + }; + const realURL = new URL(dynamicURL); + realURL.hostname = + self.ubolOverlay.webext.i18n.getMessage('@@extension_id'); + frame.contentWindow.postMessage( + { + what: 'startOverlay', + url: document.baseURI, + width: self.innerWidth, + height: self.innerHeight, + }, + realURL.origin, + [ channel.port2 ] + ); + frame.contentWindow.focus(); + self.ubolOverlay.onmessage = onmessage; + self.ubolOverlay.port = port; + self.ubolOverlay.frame = frame; + resolve(true); + }; + if ( dynamicURL.protocol !== 'safari-web-extension:' ) { + frame.onload = ( ) => { + frame.onload = onLoad; + frame.contentWindow.location = dynamicURL.href; + }; + } else { + frame.onload = onLoad; + frame.setAttribute('src', dynamicURL.href); + } + document.documentElement.append(frame); + }); + }, +}; + +/******************************************************************************/ + +})(); + + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,27 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(function uBOL_toggleToolbarIcon() { + chrome.runtime.sendMessage({ + what: 'toggleToolbarIcon', + }).catch(( ) => { + }); +})(); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,57 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(async ( ) => { + +/******************************************************************************/ + +const ubolOverlay = self.ubolOverlay; +if ( ubolOverlay === undefined ) { return; } +if ( ubolOverlay.file === '/unpicker-ui.html' ) { return; } + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'startCustomFilters': + return ubolOverlay.sendMessage({ what: 'startCustomFilters' }); + case 'terminateCustomFilters': + return ubolOverlay.sendMessage({ what: 'terminateCustomFilters' }); + case 'removeCustomFilters': + return ubolOverlay.sendMessage({ what: 'removeCustomFilters', + hostname: ubolOverlay.url.hostname, + selectors: [ msg.selector ], + }); + default: + break; + } +} + +/******************************************************************************/ + +await ubolOverlay.install('/unpicker-ui.html', onMessage); + +/******************************************************************************/ + +})(); + + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/zapper.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/zapper.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting/zapper.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/zapper.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,138 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(async ( ) => { + +/******************************************************************************/ + +const ubolOverlay = self.ubolOverlay; +if ( ubolOverlay === undefined ) { return; } +if ( ubolOverlay.file === '/zapper-ui.html' ) { return; } + +/******************************************************************************/ + +// https://www.reddit.com/r/uBlockOrigin/comments/bktxtb/scrolling_doesnt_work/emn901o +// Override 'fixed' position property on body element if present. + +// With touch-driven devices, first highlight the element and remove only +// when tapping again the highlighted area. + +function zapElementAtPoint(mx, my, options) { + if ( options.highlight ) { + const elem = ubolOverlay.elementFromPoint(mx, my); + if ( elem ) { + ubolOverlay.highlightElements([ elem ]); + } + return; + } + + let elemToRemove = ubolOverlay.highlightedElements?.[0] ?? null; + if ( elemToRemove === null && mx !== undefined ) { + elemToRemove = ubolOverlay.elementFromPoint(mx, my); + } + + if ( elemToRemove instanceof Element === false ) { return; } + + const getStyleValue = (elem, prop) => { + const style = window.getComputedStyle(elem); + return style ? style[prop] : ''; + }; + + // Heuristic to detect scroll-locking: remove such lock when detected. + let maybeScrollLocked = elemToRemove.shadowRoot instanceof DocumentFragment; + if ( maybeScrollLocked === false ) { + let elem = elemToRemove; + do { + maybeScrollLocked = + parseInt(getStyleValue(elem, 'zIndex'), 10) >= 1000 || + getStyleValue(elem, 'position') === 'fixed'; + elem = elem.parentElement; + } while ( elem !== null && maybeScrollLocked === false ); + } + if ( maybeScrollLocked ) { + const doc = document; + if ( getStyleValue(doc.body, 'overflowY') === 'hidden' ) { + doc.body.style.setProperty('overflow', 'auto', 'important'); + } + if ( getStyleValue(doc.body, 'position') === 'fixed' ) { + doc.body.style.setProperty('position', 'initial', 'important'); + } + if ( getStyleValue(doc.documentElement, 'position') === 'fixed' ) { + doc.documentElement.style.setProperty('position', 'initial', 'important'); + } + if ( getStyleValue(doc.documentElement, 'overflowY') === 'hidden' ) { + doc.documentElement.style.setProperty('overflow', 'auto', 'important'); + } + } + elemToRemove.remove(); + ubolOverlay.highlightElementAtPoint(mx, my); +} + +/******************************************************************************/ + +function onKeyPressed(ev) { + if ( ev.key !== 'Delete' && ev.key !== 'Backspace' ) { return; } + ev.stopPropagation(); + ev.preventDefault(); + zapElementAtPoint(); +} + +/******************************************************************************/ + +function startZapper() { + self.addEventListener('keydown', onKeyPressed, true); +} + +function quitZapper() { + self.removeEventListener('keydown', onKeyPressed, true); +} + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'startTool': + startZapper(); + break; + case 'quitTool': + quitZapper(); + break; + case 'zapElementAtPoint': + zapElementAtPoint(msg.mx, msg.my, msg.options); + if ( msg.options.highlight !== true && msg.options.stay !== true ) { + quitZapper(); + } + break; + default: + break; + } +} + +/******************************************************************************/ + +await ubolOverlay.install('/zapper-ui.html', onMessage); + +/******************************************************************************/ + +})(); + + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting-manager.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting-manager.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/scripting-manager.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting-manager.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,57 +19,21 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; +import * as ut from './utils.js'; -/******************************************************************************/ +import { browser, localRemove } from './ext.js'; +import { ubolErr, ubolLog } from './debug.js'; -import { browser } from './ext.js'; import { fetchJSON } from './fetch.js'; -import { getFilteringModeDetails } from './mode-manager.js'; import { getEnabledRulesetsDetails } from './ruleset-manager.js'; - -import * as ut from './utils.js'; +import { getFilteringModeDetails } from './mode-manager.js'; +import { registerCustomFilters } from './filter-manager.js'; +import { registerToolbarIconToggler } from './action.js'; /******************************************************************************/ const resourceDetailPromises = new Map(); -function getSpecificDetails() { - let promise = resourceDetailPromises.get('specific'); - if ( promise !== undefined ) { return promise; } - promise = fetchJSON('/rulesets/specific-details').then(entries => { - const out = new Map(); - for ( const entry of entries ) { - out.set(entry[0], new Map(entry[1])); - } - return out; - }); - resourceDetailPromises.set('specific', promise); - return promise; -} - -function getDeclarativeDetails() { - let promise = resourceDetailPromises.get('declarative'); - if ( promise !== undefined ) { return promise; } - promise = fetchJSON('/rulesets/declarative-details').then( - entries => new Map(entries) - ); - resourceDetailPromises.set('declarative', promise); - return promise; -} - -function getProceduralDetails() { - let promise = resourceDetailPromises.get('procedural'); - if ( promise !== undefined ) { return promise; } - promise = fetchJSON('/rulesets/procedural-details').then( - entries => new Map(entries) - ); - resourceDetailPromises.set('procedural', promise); - return promise; -} - function getScriptletDetails() { let promise = resourceDetailPromises.get('scriptlet'); if ( promise !== undefined ) { return promise; } @@ -92,15 +56,13 @@ /******************************************************************************/ -// Important: We need to sort the arrays for fast comparison -const arrayEq = (a = [], b = [], sort = true) => { - const alen = a.length; - if ( alen !== b.length ) { return false; } - if ( sort ) { a.sort(); b.sort(); } - for ( let i = 0; i < alen; i++ ) { - if ( a[i] !== b[i] ) { return false; } +const normalizeMatches = matches => { + if ( matches.length <= 1 ) { return; } + if ( matches.includes('') === false ) { + if ( matches.includes('*://*/*') === false ) { return; } } - return true; + matches.length = 0; + matches.push(''); }; /******************************************************************************/ @@ -111,7 +73,12 @@ const normalizeRegisteredContentScripts = registered => { for ( const entry of registered ) { - const { js } = entry; + const { css = [], js = [] } = entry; + for ( let i = 0; i < css.length; i++ ) { + const path = css[i]; + if ( path.startsWith('/') ) { continue; } + css[i] = `/${path}`; + } for ( let i = 0; i < js.length; i++ ) { const path = js[i]; if ( path.startsWith('/') ) { continue; } @@ -123,38 +90,43 @@ /******************************************************************************/ -function registerGeneric(context, genericDetails) { +function registerHighGeneric(context, genericDetails) { const { before, filteringModeDetails, rulesetsDetails } = context; const excludeHostnames = []; - const js = []; + const includeHostnames = []; + const css = []; for ( const details of rulesetsDetails ) { const hostnames = genericDetails.get(details.id); - if ( hostnames !== undefined ) { - excludeHostnames.push(...hostnames); + if ( hostnames ) { + if ( hostnames.unhide ) { + excludeHostnames.push(...hostnames.unhide); + } + if ( hostnames.hide ) { + includeHostnames.push(...hostnames.hide); + } } - if ( details.css.generic instanceof Object === false ) { continue; } - if ( details.css.generic.count === 0 ) { continue; } - js.push(`/rulesets/scripting/generic/${details.id}.js`); + const count = details.css?.generichigh || 0; + if ( count === 0 ) { continue; } + css.push(`/rulesets/scripting/generichigh/${details.id}.css`); } - if ( js.length === 0 ) { return; } - - js.push('/js/scripting/css-generic.js'); + if ( css.length === 0 ) { return; } + const { none, basic, optimal, complete } = filteringModeDetails; const matches = []; const excludeMatches = []; - if ( filteringModeDetails.extendedGeneric.has('all-urls') ) { - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.none)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.network)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.extendedSpecific)); + if ( complete.has('all-urls') ) { + excludeMatches.push(...ut.matchesFromHostnames(none)); + excludeMatches.push(...ut.matchesFromHostnames(basic)); + excludeMatches.push(...ut.matchesFromHostnames(optimal)); excludeMatches.push(...ut.matchesFromHostnames(excludeHostnames)); matches.push(''); } else { matches.push( ...ut.matchesFromHostnames( ut.subtractHostnameIters( - Array.from(filteringModeDetails.extendedGeneric), + Array.from(complete), excludeHostnames ) ) @@ -163,190 +135,283 @@ if ( matches.length === 0 ) { return; } - const registered = before.get('css-generic'); - before.delete('css-generic'); // Important! + const registered = before.get('css-generichigh'); + before.delete('css-generichigh'); // Important! + + // https://github.com/w3c/webextensions/issues/414#issuecomment-1623992885 + // Once supported, add: + // cssOrigin: 'USER', + const directive = { + id: 'css-generichigh', + css, + matches, + allFrames: true, + runAt: 'document_end', + }; + if ( excludeMatches.length !== 0 ) { + directive.excludeMatches = excludeMatches; + } // register if ( registered === undefined ) { - context.toAdd.push({ - id: 'css-generic', - js, - matches, - excludeMatches, - runAt: 'document_idle', - }); + context.toAdd.push(directive); return; } // update - const directive = { id: 'css-generic' }; - if ( arrayEq(registered.js, js, false) === false ) { - directive.js = js; - } - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.js || directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); + if ( + ut.strArrayEq(registered.css, css, false) === false || + ut.strArrayEq(registered.matches, matches) === false || + ut.strArrayEq(registered.excludeMatches, excludeMatches) === false + ) { + context.toRemove.push('css-generichigh'); + context.toAdd.push(directive); } } /******************************************************************************/ -function registerProcedural(context, proceduralDetails) { +function registerGeneric(context, genericDetails) { const { before, filteringModeDetails, rulesetsDetails } = context; + const excludedByFilter = []; + const includedByFilter = []; const js = []; - const hostnameMatches = new Set(); for ( const details of rulesetsDetails ) { - if ( details.css.procedural === 0 ) { continue; } - js.push(`/rulesets/scripting/procedural/${details.id}.js`); - if ( proceduralDetails.has(details.id) ) { - for ( const hn of proceduralDetails.get(details.id) ) { - hostnameMatches.add(hn); + const hostnames = genericDetails.get(details.id); + if ( hostnames ) { + if ( hostnames.unhide ) { + excludedByFilter.push(...hostnames.unhide); + } + if ( hostnames.hide ) { + includedByFilter.push(...hostnames.hide); } } + const count = details.css?.generic || 0; + if ( count === 0 ) { continue; } + js.push(`/rulesets/scripting/generic/${details.id}.js`); } if ( js.length === 0 ) { return; } - js.push('/js/scripting/css-procedural.js'); + js.unshift('/js/scripting/css-api.js', '/js/scripting/isolated-api.js'); + js.push('/js/scripting/css-generic.js'); - const { - none, - network, - extendedSpecific, - extendedGeneric, - } = filteringModeDetails; + const { none, basic, optimal, complete } = filteringModeDetails; + const includedByMode = [ ...complete ]; + const excludedByMode = [ ...none, ...basic, ...optimal ]; - const matches = []; - const excludeMatches = []; - if ( extendedSpecific.has('all-urls') || extendedGeneric.has('all-urls') ) { - excludeMatches.push(...ut.matchesFromHostnames(none)); - excludeMatches.push(...ut.matchesFromHostnames(network)); - matches.push(...ut.matchesFromHostnames(hostnameMatches)); - } else if ( extendedSpecific.size !== 0 || extendedGeneric.size !== 0 ) { - matches.push( + if ( complete.has('all-urls') === false ) { + const matches = [ ...ut.matchesFromHostnames( - ut.intersectHostnameIters( - [ ...extendedSpecific, ...extendedGeneric ], - hostnameMatches - ) - ) - ); + ut.subtractHostnameIters(includedByMode, excludedByFilter) + ), + ...ut.matchesFromHostnames( + ut.intersectHostnameIters(includedByMode, includedByFilter) + ), + ]; + if ( matches.length === 0 ) { return; } + const registered = before.get('css-generic-some'); + before.delete('css-generic-some'); // Important! + const directive = { + id: 'css-generic-some', + js, + allFrames: true, + matches, + runAt: 'document_idle', + }; + if ( registered === undefined ) { // register + context.toAdd.push(directive); + } else if ( // update + ut.strArrayEq(registered.js, js, false) === false || + ut.strArrayEq(registered.matches, directive.matches) === false + ) { + context.toRemove.push('css-generic-some'); + context.toAdd.push(directive); + } + return; } + const excludeMatches = [ + ...ut.matchesFromHostnames(excludedByMode), + ...ut.matchesFromHostnames(excludedByFilter), + ]; + const registeredAll = before.get('css-generic-all'); + before.delete('css-generic-all'); // Important! + const directiveAll = { + id: 'css-generic-all', + js, + allFrames: true, + matches: [ '' ], + runAt: 'document_idle', + }; + if ( excludeMatches.length !== 0 ) { + directiveAll.excludeMatches = excludeMatches; + } + + if ( registeredAll === undefined ) { // register + context.toAdd.push(directiveAll); + } else if ( // update + ut.strArrayEq(registeredAll.js, js, false) === false || + ut.strArrayEq(registeredAll.excludeMatches, directiveAll.excludeMatches) === false + ) { + context.toRemove.push('css-generic-all'); + context.toAdd.push(directiveAll); + } + const matches = [ + ...ut.matchesFromHostnames( + ut.subtractHostnameIters(includedByFilter, excludedByMode) + ), + ]; if ( matches.length === 0 ) { return; } + const registeredSome = before.get('css-generic-some'); + before.delete('css-generic-some'); // Important! + const directiveSome = { + id: 'css-generic-some', + js, + allFrames: true, + matches, + runAt: 'document_idle', + }; + if ( registeredSome === undefined ) { // register + context.toAdd.push(directiveSome); + } else if ( // update + ut.strArrayEq(registeredSome.js, js, false) === false || + ut.strArrayEq(registeredSome.matches, directiveSome.matches) === false + ) { + context.toRemove.push('css-generic-some'); + context.toAdd.push(directiveSome); + } +} + +/******************************************************************************/ + +function registerProcedural(context) { + const { before, filteringModeDetails, rulesetsDetails } = context; + + const js = []; + for ( const rulesetDetails of rulesetsDetails ) { + const count = rulesetDetails.css?.procedural || 0; + if ( count === 0 ) { continue; } + js.push(`/rulesets/scripting/procedural/${rulesetDetails.id}.js`); + } + if ( js.length === 0 ) { return; } + + const { none, basic, optimal, complete } = filteringModeDetails; + const matches = [ + ...ut.matchesFromHostnames(optimal), + ...ut.matchesFromHostnames(complete), + ]; + if ( matches.length === 0 ) { return; } + + normalizeMatches(matches); + + js.unshift('/js/scripting/css-api.js', '/js/scripting/isolated-api.js'); + js.push('/js/scripting/css-procedural.js'); + + const excludeMatches = []; + if ( none.has('all-urls') === false && basic.has('all-urls') === false ) { + const toExclude = [ + ...ut.matchesFromHostnames(none), + ...ut.matchesFromHostnames(basic), + ]; + for ( const hn of toExclude ) { + excludeMatches.push(hn); + } + } const registered = before.get('css-procedural'); before.delete('css-procedural'); // Important! + const directive = { + id: 'css-procedural', + js, + matches, + allFrames: true, + runAt: 'document_start', + }; + if ( excludeMatches.length !== 0 ) { + directive.excludeMatches = excludeMatches; + } + // register if ( registered === undefined ) { - context.toAdd.push({ - id: 'css-procedural', - js, - allFrames: true, - matches, - excludeMatches, - runAt: 'document_end', - }); + context.toAdd.push(directive); return; } // update - const directive = { id: 'css-procedural' }; - if ( arrayEq(registered.js, js, false) === false ) { - directive.js = js; - } - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.js || directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); + if ( + ut.strArrayEq(registered.js, js, false) === false || + ut.strArrayEq(registered.matches, matches) === false || + ut.strArrayEq(registered.excludeMatches, excludeMatches) === false + ) { + context.toRemove.push('css-procedural'); + context.toAdd.push(directive); } } /******************************************************************************/ -function registerDeclarative(context, declarativeDetails) { +function registerSpecific(context) { const { before, filteringModeDetails, rulesetsDetails } = context; const js = []; - const hostnameMatches = []; - for ( const details of rulesetsDetails ) { - if ( details.css.declarative === 0 ) { continue; } - js.push(`/rulesets/scripting/declarative/${details.id}.js`); - if ( declarativeDetails.has(details.id) ) { - hostnameMatches.push(...declarativeDetails.get(details.id)); - } + for ( const rulesetDetails of rulesetsDetails ) { + const count = rulesetDetails.css?.specific || 0; + if ( count === 0 ) { continue; } + js.push(`/rulesets/scripting/specific/${rulesetDetails.id}.js`); } - if ( js.length === 0 ) { return; } - js.push('/js/scripting/css-declarative.js'); + const { none, basic, optimal, complete } = filteringModeDetails; + const matches = [ + ...ut.matchesFromHostnames(optimal), + ...ut.matchesFromHostnames(complete), + ]; + if ( matches.length === 0 ) { return; } - const { - none, - network, - extendedSpecific, - extendedGeneric, - } = filteringModeDetails; + normalizeMatches(matches); + + js.unshift('/js/scripting/css-api.js', '/js/scripting/isolated-api.js'); + js.push('/js/scripting/css-specific.js'); - const matches = []; const excludeMatches = []; - if ( extendedSpecific.has('all-urls') || extendedGeneric.has('all-urls') ) { + if ( none.has('all-urls') === false ) { excludeMatches.push(...ut.matchesFromHostnames(none)); - excludeMatches.push(...ut.matchesFromHostnames(network)); - matches.push(...ut.matchesFromHostnames(hostnameMatches)); - } else if ( extendedSpecific.size !== 0 || extendedGeneric.size !== 0 ) { - matches.push( - ...ut.matchesFromHostnames( - ut.intersectHostnameIters( - [ ...extendedSpecific, ...extendedGeneric ], - hostnameMatches - ) - ) - ); + } + if ( basic.has('all-urls') === false ) { + excludeMatches.push(...ut.matchesFromHostnames(basic)); } - if ( matches.length === 0 ) { return; } + const registered = before.get('css-specific'); + before.delete('css-specific'); // Important! - const registered = before.get('css-declarative'); - before.delete('css-declarative'); // Important! + const directive = { + id: 'css-specific', + js, + matches, + allFrames: true, + runAt: 'document_start', + }; + if ( excludeMatches.length !== 0 ) { + directive.excludeMatches = excludeMatches; + } // register if ( registered === undefined ) { - context.toAdd.push({ - id: 'css-declarative', - js, - allFrames: true, - matches, - excludeMatches, - runAt: 'document_start', - }); + context.toAdd.push(directive); return; } // update - const directive = { id: 'css-declarative' }; - if ( arrayEq(registered.js, js, false) === false ) { - directive.js = js; - } - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.js || directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); + if ( + ut.strArrayEq(registered.js, js, false) === false || + ut.strArrayEq(registered.matches, matches) === false || + ut.strArrayEq(registered.excludeMatches, excludeMatches) === false + ) { + context.toRemove.push('css-specific'); + context.toAdd.push(directive); } } @@ -356,367 +421,104 @@ const { before, filteringModeDetails, rulesetsDetails } = context; const hasBroadHostPermission = - filteringModeDetails.extendedSpecific.has('all-urls') || - filteringModeDetails.extendedGeneric.has('all-urls'); + filteringModeDetails.optimal.has('all-urls') || + filteringModeDetails.complete.has('all-urls'); const permissionRevokedMatches = [ ...ut.matchesFromHostnames(filteringModeDetails.none), - ...ut.matchesFromHostnames(filteringModeDetails.network), + ...ut.matchesFromHostnames(filteringModeDetails.basic), ]; const permissionGrantedHostnames = [ - ...filteringModeDetails.extendedSpecific, - ...filteringModeDetails.extendedGeneric, + ...filteringModeDetails.optimal, + ...filteringModeDetails.complete, ]; for ( const rulesetId of rulesetsDetails.map(v => v.id) ) { const scriptletList = scriptletDetails.get(rulesetId); if ( scriptletList === undefined ) { continue; } - for ( const [ token, scriptletHostnames ] of scriptletList ) { + for ( const [ token, details ] of scriptletList ) { const id = `${rulesetId}.${token}`; const registered = before.get(id); const matches = []; const excludeMatches = []; + let targetHostnames = []; if ( hasBroadHostPermission ) { excludeMatches.push(...permissionRevokedMatches); - matches.push(...ut.matchesFromHostnames(scriptletHostnames)); + if ( details.hostnames.length > 100 ) { + targetHostnames = [ '*' ]; + } else { + targetHostnames = details.hostnames; + } } else if ( permissionGrantedHostnames.length !== 0 ) { - matches.push( - ...ut.matchesFromHostnames( - ut.intersectHostnameIters( - permissionGrantedHostnames, - scriptletHostnames - ) - ) - ); + if ( details.hostnames.includes('*') ) { + targetHostnames = permissionGrantedHostnames; + } else { + targetHostnames = ut.intersectHostnameIters( + details.hostnames, + permissionGrantedHostnames + ); + } } - if ( matches.length === 0 ) { continue; } + if ( targetHostnames.length === 0 ) { continue; } + matches.push(...ut.matchesFromHostnames(targetHostnames)); + normalizeMatches(matches); before.delete(id); // Important! + const directive = { + id, + js: [ `/rulesets/scripting/scriptlet/${id}.js` ], + matches, + allFrames: true, + matchOriginAsFallback: true, + runAt: 'document_start', + world: details.world, + }; + if ( excludeMatches.length !== 0 ) { + directive.excludeMatches = excludeMatches; + } + // register if ( registered === undefined ) { - context.toAdd.push({ - id, - js: [ `/rulesets/scripting/scriptlet/${id}.js` ], - allFrames: true, - matches, - excludeMatches, - runAt: 'document_start', - world: 'MAIN', - }); + context.toAdd.push(directive); continue; } // update - const directive = { id }; - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); - } - } - } -} - -/******************************************************************************/ - -function registerScriptletEntity(context) { - const { before, filteringModeDetails, rulesetsDetails } = context; - - const js = []; - for ( const details of rulesetsDetails ) { - const { scriptlets } = details; - if ( scriptlets instanceof Object === false ) { continue; } - if ( Array.isArray(scriptlets.entityBasedTokens) === false ) { continue; } - if ( scriptlets.entityBasedTokens.length === 0 ) { continue; } - for ( const token of scriptlets.entityBasedTokens ) { - js.push(`/rulesets/scripting/scriptlet-entity/${details.id}.${token}.js`); - } - } - - if ( js.length === 0 ) { return; } - - const matches = []; - const excludeMatches = []; - if ( filteringModeDetails.extendedGeneric.has('all-urls') ) { - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.none)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.network)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.extendedSpecific)); - matches.push(''); - } else { - matches.push( - ...ut.matchesFromHostnames(filteringModeDetails.extendedGeneric) - ); - } - - if ( matches.length === 0 ) { return; } - - const registered = before.get('scriptlet.entity'); - before.delete('scriptlet.entity'); // Important! - - // register - if ( registered === undefined ) { - context.toAdd.push({ - id: 'scriptlet.entity', - js, - allFrames: true, - matches, - excludeMatches, - runAt: 'document_start', - world: 'MAIN', - }); - return; - } - - // update - const directive = { id: 'scriptlet.entity' }; - if ( arrayEq(registered.js, js, false) === false ) { - directive.js = js; - } - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.js || directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); - } -} - -/******************************************************************************/ - -function registerSpecific(context, specificDetails) { - const { filteringModeDetails } = context; - - let toRegisterMap; - if ( - filteringModeDetails.extendedSpecific.has('all-urls') || - filteringModeDetails.extendedGeneric.has('all-urls') - ) { - toRegisterMap = registerSpecificAll(context, specificDetails); - } else { - toRegisterMap = registerSpecificSome(context, specificDetails); - } - - for ( const [ fname, hostnames ] of toRegisterMap ) { - toRegisterableScript(context, fname, hostnames); - } -} - -function registerSpecificSome(context, specificDetails) { - const { filteringModeDetails, rulesetsDetails } = context; - const toRegisterMap = new Map(); - - const targetHostnames = [ - ...filteringModeDetails.extendedSpecific, - ...filteringModeDetails.extendedGeneric, - ]; - - const checkMatches = (hostnamesToFidsMap, hn) => { - let fids = hostnamesToFidsMap.get(hn); - if ( fids === undefined ) { return; } - if ( typeof fids === 'number' ) { fids = [ fids ]; } - for ( const fid of fids ) { - const fname = ut.fnameFromFileId(fid); - let existing = toRegisterMap.get(fname); - if ( existing ) { - if ( existing[0] === '*' ) { continue; } - existing.push(hn); - } else { - toRegisterMap.set(fname, existing = [ hn ]); - } - if ( hn !== '*' ) { continue; } - existing.length = 0; - existing.push('*'); - break; - } - }; - - for ( const rulesetDetails of rulesetsDetails ) { - const hostnamesToFidsMap = specificDetails.get(rulesetDetails.id); - if ( hostnamesToFidsMap === undefined ) { continue; } - for ( let hn of targetHostnames ) { - while ( hn ) { - checkMatches(hostnamesToFidsMap, hn); - hn = ut.toBroaderHostname(hn); + if ( + ut.strArrayEq(registered.matches, matches) === false || + ut.strArrayEq(registered.excludeMatches, excludeMatches) === false + ) { + context.toRemove.push(id); + context.toAdd.push(directive); } } } - - return toRegisterMap; -} - -function registerSpecificAll(context, specificDetails) { - const { filteringModeDetails, rulesetsDetails } = context; - const toRegisterMap = new Map(); - - const excludeSet = new Set([ - ...filteringModeDetails.network, - ...filteringModeDetails.none, - ]); - - for ( const rulesetDetails of rulesetsDetails ) { - const hostnamesToFidsMap = specificDetails.get(rulesetDetails.id); - if ( hostnamesToFidsMap === undefined ) { continue; } - for ( let [ hn, fids ] of hostnamesToFidsMap ) { - if ( excludeSet.has(hn) ) { continue; } - if ( ut.isDescendantHostnameOfIter(hn, excludeSet) ) { continue; } - if ( typeof fids === 'number' ) { fids = [ fids ]; } - for ( const fid of fids ) { - const fname = ut.fnameFromFileId(fid); - let existing = toRegisterMap.get(fname); - if ( existing ) { - if ( existing[0] === '*' ) { continue; } - existing.push(hn); - } else { - toRegisterMap.set(fname, existing = [ hn ]); - } - if ( hn !== '*' ) { continue; } - existing.length = 0; - existing.push('*'); - break; - } - } - } - - return toRegisterMap; -} - -const toRegisterableScript = (context, fname, hostnames) => { - if ( context.before.has(fname) ) { - return toUpdatableScript(context, fname, hostnames); - } - const matches = hostnames - ? ut.matchesFromHostnames(hostnames) - : [ '' ]; - const excludeMatches = matches.length === 1 && matches[0] === '' - ? ut.matchesFromHostnames(context.filteringModeDetails.none) - : []; - const directive = { - id: fname, - allFrames: true, - matches, - excludeMatches, - js: [ `/rulesets/scripting/specific/${fname.slice(-1)}/${fname.slice(0,-1)}.js` ], - runAt: 'document_start', - }; - context.toAdd.push(directive); -}; - -const toUpdatableScript = (context, fname, hostnames) => { - const registered = context.before.get(fname); - context.before.delete(fname); // Important! - const directive = { id: fname }; - const matches = hostnames - ? ut.matchesFromHostnames(hostnames) - : [ '' ]; - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - const excludeMatches = matches.length === 1 && matches[0] === '' - ? ut.matchesFromHostnames(context.filteringModeDetails.none) - : []; - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); - } -}; - -/******************************************************************************/ - -function registerSpecificEntity(context) { - const { before, filteringModeDetails, rulesetsDetails } = context; - - const js = []; - for ( const details of rulesetsDetails ) { - if ( details.css.specific instanceof Object === false ) { continue; } - if ( details.css.specific.entityBased === 0 ) { continue; } - js.push(`/rulesets/scripting/specific-entity/${details.id}.js`); - } - - if ( js.length === 0 ) { return; } - - const matches = []; - const excludeMatches = []; - if ( filteringModeDetails.extendedGeneric.has('all-urls') ) { - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.none)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.network)); - excludeMatches.push(...ut.matchesFromHostnames(filteringModeDetails.extendedSpecific)); - matches.push(''); - } else { - matches.push( - ...ut.matchesFromHostnames(filteringModeDetails.extendedGeneric) - ); - } - - if ( matches.length === 0 ) { return; } - - js.push('/js/scripting/css-specific.entity.js'); - - const registered = before.get('css-specific.entity'); - before.delete('css-specific.entity'); // Important! - - // register - if ( registered === undefined ) { - context.toAdd.push({ - id: 'css-specific.entity', - js, - allFrames: true, - matches, - excludeMatches, - runAt: 'document_start', - }); - return; - } - - // update - const directive = { id: 'css-specific.entity' }; - if ( arrayEq(registered.js, js, false) === false ) { - directive.js = js; - } - if ( arrayEq(registered.matches, matches) === false ) { - directive.matches = matches; - } - if ( arrayEq(registered.excludeMatches, excludeMatches) === false ) { - directive.excludeMatches = excludeMatches; - } - if ( directive.js || directive.matches || directive.excludeMatches ) { - context.toUpdate.push(directive); - } } /******************************************************************************/ -async function registerInjectables(origins) { - void origins; +// Issue: Safari appears to completely ignore excludeMatches +// https://github.com/radiolondra/ExcludeMatches-Test +async function registerInjectables() { if ( browser.scripting === undefined ) { return false; } + if ( registerInjectables.barrier ) { return true; } + registerInjectables.barrier = true; + const [ filteringModeDetails, rulesetsDetails, - declarativeDetails, - proceduralDetails, scriptletDetails, - specificDetails, genericDetails, registered, ] = await Promise.all([ getFilteringModeDetails(), getEnabledRulesetsDetails(), - getDeclarativeDetails(), - getProceduralDetails(), getScriptletDetails(), - getSpecificDetails(), getGenericDetails(), browser.scripting.getRegisteredContentScripts(), ]); @@ -725,51 +527,50 @@ entry => [ entry.id, entry ] ) ); - const toAdd = [], toUpdate = [], toRemove = []; - const promises = []; + const toAdd = [], toRemove = []; const context = { filteringModeDetails, rulesetsDetails, before, toAdd, - toUpdate, toRemove, }; - registerDeclarative(context, declarativeDetails); - registerProcedural(context, proceduralDetails); - registerScriptlet(context, scriptletDetails); - registerScriptletEntity(context); - registerSpecific(context, specificDetails); - registerSpecificEntity(context); - registerGeneric(context, genericDetails); + await Promise.all([ + registerProcedural(context), + registerScriptlet(context, scriptletDetails), + registerSpecific(context), + registerGeneric(context, genericDetails), + registerHighGeneric(context, genericDetails), + registerCustomFilters(context), + registerToolbarIconToggler(context), + ]); toRemove.push(...Array.from(before.keys())); if ( toRemove.length !== 0 ) { - console.info(`Unregistered ${toRemove} content (css/js)`); - promises.push( - browser.scripting.unregisterContentScripts({ ids: toRemove }) - .catch(reason => { console.info(reason); }) - ); + ubolLog(`Unregistered ${toRemove} content (css/js)`); + try { + await browser.scripting.unregisterContentScripts({ ids: toRemove }); + localRemove('$scripting.unregisterContentScripts'); + } catch(reason) { + ubolErr(`unregisterContentScripts/${reason}`); + } } + if ( toAdd.length !== 0 ) { - console.info(`Registered ${toAdd.map(v => v.id)} content (css/js)`); - promises.push( - browser.scripting.registerContentScripts(toAdd) - .catch(reason => { console.info(reason); }) - ); - } - if ( toUpdate.length !== 0 ) { - console.info(`Updated ${toUpdate.map(v => v.id)} content (css/js)`); - promises.push( - browser.scripting.updateContentScripts(toUpdate) - .catch(reason => { console.info(reason); }) - ); + ubolLog(`Registered ${toAdd.map(v => v.id)} content (css/js)`); + try { + await browser.scripting.registerContentScripts(toAdd); + localRemove('$scripting.registerContentScripts'); + } catch(reason) { + ubolErr(`registerContentScripts/${reason}`); + } } - if ( promises.length === 0 ) { return; } - return Promise.all(promises); + registerInjectables.barrier = false; + + return true; } /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/settings.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/settings.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/settings.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/settings.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,248 +19,107 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - import { browser, sendMessage } from './ext.js'; -import { i18n$ } from './i18n.js'; -import { dom, qs$, qsa$ } from './dom.js'; -import { simpleStorage } from './storage.js'; +import { dom, qs$ } from './dom.js'; +import { hashFromIterable } from './dashboard.js'; +import { renderFilterLists } from './filter-lists.js'; /******************************************************************************/ -const rulesetMap = new Map(); let cachedRulesetData = {}; -let hideUnusedSet = new Set([ 'regions' ]); /******************************************************************************/ -function renderNumber(value) { - return value.toLocaleString(); -} - -/******************************************************************************/ - -function rulesetStats(rulesetId) { - const hasOmnipotence = cachedRulesetData.defaultFilteringMode > 1; - const rulesetDetails = rulesetMap.get(rulesetId); - if ( rulesetDetails === undefined ) { return; } - const { rules, filters } = rulesetDetails; - let ruleCount = rules.plain + rules.regex; - if ( hasOmnipotence ) { - ruleCount += rules.removeparam + rules.redirect + rules.csp; +function renderAdminRules() { + const { disabledFeatures: forbid = [] } = cachedRulesetData; + if ( forbid.length === 0 ) { return; } + dom.body.dataset.forbid = forbid.join(' '); + if ( forbid.includes('dashboard') ) { + dom.body.dataset.pane = 'about'; } - const filterCount = filters.accepted; - return { ruleCount, filterCount }; } /******************************************************************************/ -function renderFilterLists(soft = false) { - const { enabledRulesets, rulesetDetails } = cachedRulesetData; - const listGroupTemplate = qs$('#templates .groupEntry'); - const listEntryTemplate = qs$('#templates .listEntry'); - const listStatsTemplate = i18n$('perRulesetStats'); - const groupNames = new Map([ [ 'user', '' ] ]); - - const liFromListEntry = function(ruleset, li, hideUnused) { - if ( !li ) { - li = dom.clone(listEntryTemplate); - } - const on = enabledRulesets.includes(ruleset.id); - dom.cl.toggle(li, 'checked', on); - if ( dom.attr(li, 'data-listkey') !== ruleset.id ) { - dom.attr(li, 'data-listkey', ruleset.id); - qs$(li, 'input[type="checkbox"]').checked = on; - dom.text(qs$(li, '.listname'), ruleset.name || ruleset.id); - dom.cl.remove(li, 'toRemove'); - if ( ruleset.homeURL ) { - dom.cl.add(li, 'support'); - dom.attr(qs$(li, 'a.support'), 'href', ruleset.homeURL); - } else { - dom.cl.remove(li, 'support'); - } - if ( ruleset.instructionURL ) { - dom.cl.add(li, 'mustread'); - dom.attr(qs$(li, 'a.mustread'), 'href', ruleset.instructionURL); - } else { - dom.cl.remove(li, 'mustread'); - } - dom.cl.toggle(li, 'isDefault', ruleset.isDefault === true); - dom.cl.toggle(li, 'unused', hideUnused && !on); - } - // https://github.com/gorhill/uBlock/issues/1429 - if ( soft !== true ) { - qs$(li, 'input[type="checkbox"]').checked = on; - } - const stats = rulesetStats(ruleset.id); - li.title = listStatsTemplate - .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) - .replace('{{filterCount}}', renderNumber(stats.filterCount)); - dom.attr( - qs$(li, '.input.checkbox'), - 'disabled', - stats.ruleCount === 0 ? '' : null - ); - dom.cl.remove(li, 'discard'); - return li; - }; +function renderWidgets() { + if ( cachedRulesetData.firstRun ) { + dom.cl.add(dom.body, 'firstRun'); + } - const listEntryCountFromGroup = function(groupRulesets) { - if ( Array.isArray(groupRulesets) === false ) { return ''; } - let count = 0, - total = 0; - for ( const ruleset of groupRulesets ) { - if ( enabledRulesets.includes(ruleset.id) ) { - count += 1; - } - total += 1; - } - return total !== 0 ? - `(${count.toLocaleString()}/${total.toLocaleString()})` : - ''; - }; + renderDefaultMode(); - const liFromListGroup = function(groupKey, groupRulesets) { - let liGroup = qs$(`#lists > .groupEntry[data-groupkey="${groupKey}"]`); - if ( liGroup === null ) { - liGroup = dom.clone(listGroupTemplate); - let groupName = groupNames.get(groupKey); - if ( groupName === undefined ) { - groupName = i18n$('3pGroup' + groupKey.charAt(0).toUpperCase() + groupKey.slice(1)); - groupNames.set(groupKey, groupName); - } - if ( groupName !== '' ) { - dom.text(qs$(liGroup, '.geName'), groupName); - } - } - if ( qs$(liGroup, '.geName:empty') === null ) { - dom.text( - qs$(liGroup, '.geCount'), - listEntryCountFromGroup(groupRulesets) - ); - } - const hideUnused = mustHideUnusedLists(groupKey); - dom.cl.toggle(liGroup, 'hideUnused', hideUnused); - const ulGroup = qs$(liGroup, '.listEntries'); - if ( !groupRulesets ) { return liGroup; } - groupRulesets.sort(function(a, b) { - return (a.name || '').localeCompare(b.name || ''); - }); - for ( let i = 0; i < groupRulesets.length; i++ ) { - const liEntry = liFromListEntry( - groupRulesets[i], - ulGroup.children[i], - hideUnused - ); - if ( liEntry.parentElement === null ) { - ulGroup.appendChild(liEntry); - } - } - return liGroup; - }; + qs$('#autoReload input[type="checkbox"]').checked = cachedRulesetData.autoReload; - // Incremental rendering: this will allow us to easily discard unused - // DOM list entries. - dom.cl.add('#lists .listEntries .listEntry[data-listkey]', 'discard'); - - // Visually split the filter lists in three groups - const ulLists = qs$('#lists'); - const groups = new Map([ - [ - 'default', - rulesetDetails.filter(ruleset => - ruleset.id === 'default' - ), - ], - [ - 'misc', - rulesetDetails.filter(ruleset => - ruleset.id !== 'default' && typeof ruleset.lang !== 'string' - ), - ], - [ - 'regions', - rulesetDetails.filter(ruleset => - typeof ruleset.lang === 'string' - ), - ], - ]); - - dom.cl.toggle(dom.body, 'hideUnused', mustHideUnusedLists('*')); - - for ( const [ groupKey, groupRulesets ] of groups ) { - const liGroup = liFromListGroup(groupKey, groupRulesets); - dom.attr(liGroup, 'data-groupkey', groupKey); - if ( liGroup.parentElement === null ) { - ulLists.appendChild(liGroup); + { + const input = qs$('#showBlockedCount input[type="checkbox"]'); + if ( cachedRulesetData.canShowBlockedCount ) { + input.checked = cachedRulesetData.showBlockedCount; + } else { + input.checked = false; + dom.attr(input, 'disabled', ''); } } - dom.remove('#lists .listEntries .listEntry.discard'); + { + const input = qs$('#strictBlockMode input[type="checkbox"]'); + const canStrictBlock = cachedRulesetData.hasOmnipotence; + input.checked = canStrictBlock && cachedRulesetData.strictBlockMode; + dom.attr(input, 'disabled', canStrictBlock ? null : ''); + } - renderWidgets(); + { + const state = Boolean(cachedRulesetData.developerMode) && + cachedRulesetData.disabledFeatures?.includes('develop') !== true; + dom.body.dataset.develop = `${state}`; + dom.prop('#developerMode input[type="checkbox"]', 'checked', state); + } } /******************************************************************************/ -const renderWidgets = function() { - if ( cachedRulesetData.firstRun ) { - dom.cl.add(dom.body, 'firstRun'); - } - +function renderDefaultMode() { const defaultLevel = cachedRulesetData.defaultFilteringMode; - qs$(`.filteringModeCard input[type="radio"][value="${defaultLevel}"]`).checked = true; - - qs$('#autoReload input[type="checkbox"').checked = cachedRulesetData.autoReload; - - // Compute total counts - let filterCount = 0; - let ruleCount = 0; - for ( const liEntry of qsa$('#lists .listEntry[data-listkey]') ) { - if ( qs$(liEntry, 'input[type="checkbox"]:checked') === null ) { continue; } - const stats = rulesetStats(liEntry.dataset.listkey); - if ( stats === undefined ) { continue; } - ruleCount += stats.ruleCount; - filterCount += stats.filterCount; - } - dom.text('#listsOfBlockedHostsPrompt', i18n$('perRulesetStats') - .replace('{{ruleCount}}', ruleCount.toLocaleString()) - .replace('{{filterCount}}', filterCount.toLocaleString()) - ); -}; + if ( defaultLevel !== 0 ) { + qs$(`.filteringModeCard input[type="radio"][value="${defaultLevel}"]`).checked = true; + } else { + dom.prop('.filteringModeCard input[type="radio"]', 'checked', false); + } +} /******************************************************************************/ async function onFilteringModeChange(ev) { const input = ev.target; const newLevel = parseInt(input.value, 10); - let granted = false; switch ( newLevel ) { - case 1: { // Revoke broad permissions - granted = await browser.permissions.remove({ - origins: [ '' ] + case 1: { + const actualLevel = await sendMessage({ + what: 'setDefaultFilteringMode', + level: newLevel, }); + cachedRulesetData.defaultFilteringMode = actualLevel; break; } case 2: - case 3: { // Request broad permissions - granted = await browser.permissions.request({ - origins: [ '' ] + case 3: { + const granted = await browser.permissions.request({ + origins: [ '' ], }); + if ( granted ) { + const actualLevel = await sendMessage({ + what: 'setDefaultFilteringMode', + level: newLevel, + }); + cachedRulesetData.defaultFilteringMode = actualLevel; + cachedRulesetData.hasOmnipotence = true; + } break; } default: break; } - if ( granted ) { - const actualLevel = await sendMessage({ - what: 'setDefaultFilteringMode', - level: newLevel, - }); - cachedRulesetData.defaultFilteringMode = actualLevel; - } - renderFilterLists(true); + renderFilterLists(cachedRulesetData); renderWidgets(); } @@ -273,95 +132,155 @@ /******************************************************************************/ -dom.on('#autoReload input[type="checkbox"', 'change', ev => { +async function backupSettings() { + const api = await import('./backup-restore.js'); + const data = await api.backupToObject(cachedRulesetData); + if ( data instanceof Object === false ) { return; } + const json = JSON.stringify(data, null, 2) + '\n'; + const a = document.createElement('a'); + a.href = `data:text/plain;charset=utf-8,${encodeURIComponent(json)}`; + dom.attr(a, 'download', 'my-ubol-settings.json'); + dom.attr(a, 'type', 'application/json'); + a.click(); +} + +async function restoreSettings() { + const input = qs$('section[data-pane="settings"] input[type="file"]'); + input.onchange = ev => { + input.onchange = null; + const file = ev.target.files[0]; + if ( file === undefined || file.name === '' ) { return; } + const fr = new FileReader(); + fr.onload = ( ) => { + fr.onload = null; + if ( typeof fr.result !== 'string' ) { return; } + let data; + try { + data = JSON.parse(fr.result); + } catch { + } + if ( data instanceof Object === false ) { return; } + import('./backup-restore.js').then(api => { + api.restoreFromObject(data); + }); + }; + fr.readAsText(file); + }; + // Reset to empty string, this will ensure a change event is properly + // triggered if the user pick a file, even if it's the same as the last + // one picked. + input.value = ''; + input.click(); +} + +/******************************************************************************/ + +dom.on('#autoReload input[type="checkbox"]', 'change', ev => { sendMessage({ what: 'setAutoReload', state: ev.target.checked, }); }); -/******************************************************************************/ - -async function applyEnabledRulesets() { - const enabledRulesets = []; - for ( const liEntry of qsa$('#lists .listEntry[data-listkey]') ) { - if ( qs$(liEntry, 'input[type="checkbox"]:checked') === null ) { continue; } - enabledRulesets.push(liEntry.dataset.listkey); - } +dom.on('#showBlockedCount input[type="checkbox"]', 'change', ev => { + sendMessage({ + what: 'setShowBlockedCount', + state: ev.target.checked, + }); +}); - await sendMessage({ - what: 'applyRulesets', - enabledRulesets, +dom.on('#strictBlockMode input[type="checkbox"]', 'change', ev => { + sendMessage({ + what: 'setStrictBlockMode', + state: ev.target.checked, }); +}); - renderWidgets(); -} +dom.on('#developerMode input[type="checkbox"]', 'change', ev => { + const state = ev.target.checked; + sendMessage({ what: 'setDeveloperMode', state }); + dom.body.dataset.develop = `${state}`; +}); -dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ( ) => { - applyEnabledRulesets(); +dom.on('section[data-pane="settings"] [data-i18n="backupButton"]', 'click', ( ) => { + backupSettings(); }); -/******************************************************************************/ +dom.on('section[data-pane="settings"] [data-i18n="restoreButton"]', 'click', ( ) => { + restoreSettings(); +}); -// Collapsing of unused lists. +/******************************************************************************/ -function mustHideUnusedLists(which) { - const hideAll = hideUnusedSet.has('*'); - if ( which === '*' ) { return hideAll; } - return hideUnusedSet.has(which) !== hideAll; +function listen() { + const bc = new self.BroadcastChannel('uBOL'); + bc.onmessage = listen.onmessage; } -function toggleHideUnusedLists(which) { - const doesHideAll = hideUnusedSet.has('*'); - let groupSelector; - let mustHide; - if ( which === '*' ) { - mustHide = doesHideAll === false; - groupSelector = ''; - hideUnusedSet.clear(); - if ( mustHide ) { - hideUnusedSet.add(which); +listen.onmessage = ev => { + const message = ev.data; + if ( message instanceof Object === false ) { return; } + const local = cachedRulesetData; + let render = false; + + if ( message.hasOmnipotence !== undefined ) { + if ( message.hasOmnipotence !== local.hasOmnipotence ) { + local.hasOmnipotence = message.hasOmnipotence; + render = true; } - dom.cl.toggle(dom.body, 'hideUnused', mustHide); - dom.cl.toggle('.groupEntry[data-groupkey]', 'hideUnused', mustHide); - } else { - const doesHide = hideUnusedSet.has(which); - if ( doesHide ) { - hideUnusedSet.delete(which); - } else { - hideUnusedSet.add(which); + } + + if ( message.defaultFilteringMode !== undefined ) { + if ( message.defaultFilteringMode !== local.defaultFilteringMode ) { + local.defaultFilteringMode = message.defaultFilteringMode; + render = true; } - mustHide = doesHide === doesHideAll; - groupSelector = `.groupEntry[data-groupkey="${which}"]`; - dom.cl.toggle(groupSelector, 'hideUnused', mustHide); - } - - for ( const elem of qsa$(`#lists ${groupSelector} .listEntry[data-listkey] input[type="checkbox"]:not(:checked)`) ) { - dom.cl.toggle( - elem.closest('.listEntry[data-listkey]'), - 'unused', - mustHide - ); - } - - simpleStorage.setItem( - 'hideUnusedFilterLists', - Array.from(hideUnusedSet) - ); -} + } -dom.on('#lists', 'click', '.groupEntry[data-groupkey] > .geDetails', ev => { - toggleHideUnusedLists( - dom.attr(ev.target.closest('[data-groupkey]'), 'data-groupkey') - ); -}); + if ( message.autoReload !== undefined ) { + if ( message.autoReload !== local.autoReload ) { + local.autoReload = message.autoReload; + render = true; + } + } -// Initialize from saved state. -simpleStorage.getItem('hideUnusedFilterLists').then(value => { - if ( Array.isArray(value) ) { - hideUnusedSet = new Set(value); + if ( message.showBlockedCount !== undefined ) { + if ( message.showBlockedCount !== local.showBlockedCount ) { + local.showBlockedCount = message.showBlockedCount; + render = true; + } } -}); + + if ( message.strictBlockMode !== undefined ) { + if ( message.strictBlockMode !== local.strictBlockMode ) { + local.strictBlockMode = message.strictBlockMode; + render = true; + } + } + + if ( message.developerMode !== undefined ) { + if ( message.developerMode !== local.developerMode ) { + local.developerMode = message.developerMode; + render = true; + } + } + + if ( message.adminRulesets !== undefined ) { + if ( hashFromIterable(message.adminRulesets) !== hashFromIterable(local.adminRulesets) ) { + local.adminRulesets = message.adminRulesets; + render = true; + } + } + + if ( message.enabledRulesets !== undefined ) { + local.enabledRulesets = message.enabledRulesets; + render = true; + } + + if ( render === false ) { return; } + renderFilterLists(cachedRulesetData); + renderWidgets(); +}; /******************************************************************************/ @@ -370,14 +289,18 @@ }).then(data => { if ( !data ) { return; } cachedRulesetData = data; - rulesetMap.clear(); - cachedRulesetData.rulesetDetails.forEach(rule => rulesetMap.set(rule.id, rule)); try { - renderFilterLists(); - } catch(ex) { + renderAdminRules(); + renderFilterLists(cachedRulesetData); + renderWidgets(); + } catch(reason) { + console.error(reason); + } finally { + dom.cl.remove(dom.body, 'loading'); } + listen(); }).catch(reason => { - console.trace(reason); + console.error(reason); }); /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/storage.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/storage.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/storage.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/storage.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2022-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -export class simpleStorage { - static getItem(k) { - try { - return Promise.resolve(JSON.parse(self.localStorage.getItem(k))); - } - catch(ex) { - } - return Promise.resolve(null); - } - static setItem(k, v) { - try { - self.localStorage.setItem(k, JSON.stringify(v)); - } - catch(ex) { - } - } -} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/strictblock.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/strictblock.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/strictblock.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/strictblock.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,295 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$ } from './dom.js'; +import { fetchJSON } from './fetch.js'; +import { getEnabledRulesetsDetails } from './ruleset-manager.js'; +import { i18n$ } from './i18n.js'; +import { sendMessage } from './ext.js'; +import { urlSkip } from './urlskip.js'; + +/******************************************************************************/ + +const rulesetDetailsPromise = getEnabledRulesetsDetails(); + +/******************************************************************************/ + +function urlToFragment(raw) { + try { + const fragment = new DocumentFragment(); + const url = new URL(raw); + const hn = url.hostname; + const i = raw.indexOf(hn); + const b = document.createElement('b'); + b.append(hn); + fragment.append(raw.slice(0,i), b, raw.slice(i+hn.length)); + return fragment; + } catch { + } + return raw; +} + +/******************************************************************************/ + +const toURL = new URL('about:blank'); +const toFinalURL = new URL('about:blank'); + +try { + toURL.href = self.location.hash.slice(1); + toFinalURL.href = toURL.href; +} catch { +} + +dom.clear('#theURL > p > span:first-of-type'); +qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); + +/******************************************************************************/ + +async function proceed() { + const permanent = qs$('#disableWarning').checked; + // Do not exclude current hostname from strict-block ruleset if a urlskip + // directive to another site is in effect. + // TODO: what if the urlskip directive leads to a different subdomain on + // same site? + if ( toFinalURL.hostname !== toURL.hostname && permanent !== true ) { + return window.location.replace(toFinalURL.href); + } + await sendMessage({ + what: 'excludeFromStrictBlock', + hostname: toURL.hostname, + permanent, + }); + window.location.replace(toURL.href); +} + +/******************************************************************************/ + +function fragmentFromTemplate(template, placeholder, text, details) { + const fragment = new DocumentFragment(); + const pos = template.indexOf(placeholder); + if ( pos === -1 ) { + fragment.append(template); + return fragment; + } + const elem = document.createElement(details.tag); + const { attributes } = details; + if ( attributes ) { + for ( let i = 0; i < attributes.length; i+= 2 ) { + elem.setAttribute(attributes[i+0], attributes[i+1]); + } + } + elem.append(text); + fragment.append( + template.slice(0, pos), + elem, + template.slice(pos + placeholder.length) + ); + return fragment; +} + +/******************************************************************************/ + +// https://github.com/gorhill/uBlock/issues/691 +// Parse URL to extract as much useful information as possible. This is +// useful to assist the user in deciding whether to navigate to the web page. +(( ) => { + const reURL = /^https?:\/\//; + + const liFromParam = function(name, value) { + if ( value === '' ) { + value = name; + name = ''; + } + const li = dom.create('li'); + let span = dom.create('span'); + dom.text(span, name); + li.appendChild(span); + if ( name !== '' && value !== '' ) { + li.appendChild(document.createTextNode(' = ')); + } + span = dom.create('span'); + if ( reURL.test(value) ) { + const a = dom.create('a'); + dom.attr(a, 'href', value); + dom.text(a, value); + span.appendChild(a); + } else { + dom.text(span, value); + } + li.appendChild(span); + return li; + }; + + // https://github.com/uBlockOrigin/uBlock-issues/issues/1649 + // Limit recursion. + const renderParams = function(parentNode, rawURL, depth = 0) { + let url; + try { + url = new URL(rawURL); + } catch { + return false; + } + + const search = url.search.slice(1); + if ( search === '' ) { return false; } + + url.search = ''; + const li = liFromParam(i18n$('strictblockNoParamsPrompt'), url.href); + parentNode.appendChild(li); + + const params = new self.URLSearchParams(search); + for ( const [ name, value ] of params ) { + const li = liFromParam(name, value); + if ( depth < 2 && reURL.test(value) ) { + const ul = dom.create('ul'); + renderParams(ul, value, depth + 1); + li.appendChild(ul); + } + parentNode.appendChild(li); + } + + return true; + }; + + if ( renderParams(qs$('#parsed'), toURL.href) === false ) { return; } + + dom.cl.remove('#toggleParse', 'hidden'); + + dom.on('#toggleParse', 'click', ( ) => { + dom.cl.toggle('#theURL', 'collapsed'); + }); +})(); + +/******************************************************************************/ + +// Find which list caused the blocking. +(async ( ) => { + const rulesetDetails = await rulesetDetailsPromise; + let iList = -1; + const searchInList = async i => { + if ( iList !== -1 ) { return; } + const rules = await fetchJSON(`/rulesets/strictblock/${rulesetDetails[i].id}`); + if ( iList !== -1 ) { return; } + const toHref = toURL.href; + for ( const rule of rules ) { + const { regexFilter, requestDomains } = rule.condition; + let matchesDomain = requestDomains === undefined; + if ( requestDomains ) { + let hn = toURL.hostname; + for (;;) { + if ( requestDomains.includes(hn) ) { + matchesDomain = true; + break; + } + const pos = hn.indexOf('.'); + if ( pos === -1 ) { break; } + hn = hn.slice(pos+1); + } + if ( matchesDomain === false ) { continue; } + } + const re = new RegExp(regexFilter); + const matchesRegex = re.test(toHref); + if ( matchesDomain && matchesRegex ) { + iList = i; + } + } + }; + const toFetch = []; + for ( let i = 0; i < rulesetDetails.length; i++ ) { + if ( rulesetDetails[i].rules.strictblock === 0 ) { continue; } + toFetch.push(searchInList(i)); + } + if ( toFetch.length === 0 ) { return; } + await Promise.all(toFetch); + if ( iList === -1 ) { return; } + const fragment = fragmentFromTemplate( + i18n$('strictblockReasonSentence1'), + '{{listname}}', rulesetDetails[iList].name, + { tag: 'q' } + ); + qs$('#reason').append(fragment); + dom.attr('#reason', 'hidden', null); +})(); + +/******************************************************************************/ + +// Offer to skip redirection whenever possible +(async ( ) => { + const rulesetDetails = await rulesetDetailsPromise; + const toFetch = []; + for ( const details of rulesetDetails ) { + if ( details.rules.urlskip === 0 ) { continue; } + toFetch.push(fetchJSON(`/rulesets/urlskip/${details.id}`)); + } + if ( toFetch.length === 0 ) { return; } + const urlskipLists = await Promise.all(toFetch); + const toHn = toURL.hostname; + const matchesHn = hn => { + if ( toHn.endsWith(hn) === false ) { return false; } + if ( hn.length === toHn.length ) { return true; } + return toHn.charAt(toHn.length - hn.length - 1) === '.'; + }; + for ( const urlskips of urlskipLists ) { + for ( const urlskip of urlskips ) { + const re = new RegExp(urlskip.re, urlskip.c ? undefined : 'i'); + if ( re.test(toURL.href) === false ) { continue; } + if ( urlskip.hostnames ) { + if ( urlskip.hostnames.some(hn => matchesHn(hn)) === false ) { + continue; + } + } + const finalURL = urlSkip(toURL.href, false, urlskip.steps); + if ( finalURL === undefined ) { continue; } + toFinalURL.href = finalURL; + const fragment = fragmentFromTemplate( + i18n$('strictblockRedirectSentence1'), + '{{url}}', urlToFragment(finalURL), + { tag: 'a', attributes: [ 'href', finalURL, 'class', 'code' ] } + ); + qs$('#urlskip').append(fragment); + dom.attr('#urlskip', 'hidden', null); + return; + } + } +})(); + +/******************************************************************************/ + +// https://www.reddit.com/r/uBlockOrigin/comments/breeux/ +if ( window.history.length > 1 ) { + dom.on('#back', 'click', ( ) => { window.history.back(); }); + qs$('#bye').style.display = 'none'; +} else { + dom.on('#bye', 'click', ( ) => { window.close(); }); + qs$('#back').style.display = 'none'; +} + +dom.on('#disableWarning', 'change', ev => { + const checked = ev.target.checked; + dom.cl.toggle('[data-i18n="strictblockBack"]', 'disabled', checked); + dom.cl.toggle('[data-i18n="strictblockClose"]', 'disabled', checked); +}); + +dom.on('#proceed', 'click', ( ) => { proceed(); }); + +dom.cl.remove(dom.body, 'loading'); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/theme.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/theme.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/theme.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/theme.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,17 +19,22 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - import { dom } from './dom.js'; /******************************************************************************/ -const mql = self.matchMedia('(prefers-color-scheme: dark)'); -const theme = mql instanceof Object && mql.matches === true - ? 'dark' - : 'light'; -dom.cl.toggle(dom.html, 'dark', theme === 'dark'); -dom.cl.toggle(dom.html, 'light', theme !== 'dark'); +{ + const mql = self.matchMedia('(prefers-color-scheme: dark)'); + const theme = mql instanceof Object && mql.matches === true + ? 'dark' + : 'light'; + dom.cl.toggle(dom.html, 'dark', theme === 'dark'); + dom.cl.toggle(dom.html, 'light', theme !== 'dark'); +} + +{ + const mql = self.matchMedia('(hover: hover)'); + const isTouchScreen = mql.matches !== true; + dom.cl.toggle(dom.html, 'mobile', isTouchScreen); + dom.cl.toggle(dom.html, 'desktop', isTouchScreen === false); +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,237 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$ } from './dom.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +export const toolOverlay = { + url: new URL('about:blank'), + svgRoot: qs$('svg#overlay'), + svgOcean: qs$('svg#overlay > path'), + svgIslands: qs$('svg#overlay > path + path'), + emptyPath: 'M0 0', + port: null, + + start(onmessage) { + this.onmessage = onmessage; + globalThis.addEventListener('message', ev => { + const msg = ev.data || {}; + if ( msg.what !== 'startOverlay' ) { return; } + if ( Array.isArray(ev.ports) === false ) { return; } + if ( ev.ports.length === 0 ) { return; } + toolOverlay.port = ev.ports[0]; + toolOverlay.port.onmessage = ev => { + this.onMessage(ev.data || {}); + }; + toolOverlay.port.onmessageerror = ( ) => { + this.onmessage({ what: 'stopTool' }); + }; + this.moveable = qs$('aside:has(#move)'); + if ( this.moveable !== null ) { + dom.on('aside #move', 'pointerdown', ev => { this.mover(ev); }); + dom.on('aside #move', 'touchstart', this.eatTouchEvent); + } + this.onMessage({ what: 'startTool', + url: msg.url, + width: msg.width, + height: msg.height, + }); + dom.cl.remove(dom.body, 'loading'); + }, { once: true }); + }, + + stop() { + this.highlightElementUnderMouse(false); + if ( this.port ) { + this.port.postMessage({ what: 'quitTool' }); + this.port.onmessage = null; + this.port.onmessageerror = null; + this.port = null; + } + }, + + onMessage(wrapped) { + // Response to frame-initiated message? + if ( typeof wrapped?.fromFrameId === 'number' ) { + const resolve = this.pendingMessages.get(wrapped.fromFrameId); + if ( resolve ) { + this.pendingMessages.delete(wrapped.fromFrameId); + resolve(wrapped.msg); + } + return; + } + const msg = wrapped.msg || wrapped; + switch ( msg.what ) { + case 'startTool': { + this.url.href = msg.url; + const ow = msg.width; + const oh = msg.height; + this.svgOcean.setAttribute('d', `M0 0h${ow}v${oh}h-${ow}z`); + break; + } + case 'svgPaths': + this.svgOcean.setAttribute('d', msg.ocean + msg.islands); + this.svgIslands.setAttribute('d', msg.islands || this.emptyPath); + break; + default: + break; + } + const response = this.onmessage && this.onmessage(msg) || undefined; + // Send response if this is script-initiated message + if ( wrapped?.fromScriptId && this.port ) { + const { fromScriptId } = wrapped; + if ( response instanceof Promise ) { + response.then(response => { + if ( this.port === null ) { return; } + this.port.postMessage({ fromScriptId, msg: response }); + }); + } else { + this.port.postMessage({ fromScriptId, msg: response }); + } + } + }, + postMessage(msg) { + if ( this.port === null ) { return; } + const wrapped = { + fromFrameId: this.messageId++, + msg, + }; + return new Promise(resolve => { + this.pendingMessages.set(wrapped.fromFrameId, resolve); + this.port.postMessage(wrapped); + }); + }, + messageId: 1, + pendingMessages: new Map(), + + sendMessage(msg) { + return sendMessage(msg); + }, + + highlightElementUnderMouse(state) { + if ( dom.cl.has(dom.root, 'mobile') ) { return; } + if ( state === this.mstrackerOn ) { return; } + this.mstrackerOn = state; + if ( this.mstrackerOn ) { + dom.on(document, 'mousemove', this.onHover, { passive: true }); + return; + } + dom.off(document, 'mousemove', this.onHover, { passive: true }); + if ( this.mstrackerTimer === undefined ) { return; } + self.cancelAnimationFrame(this.mstrackerTimer); + this.mstrackerTimer = undefined; + }, + onTimer() { + toolOverlay.mstrackerTimer = undefined; + if ( toolOverlay.port === null ) { return; } + toolOverlay.port.postMessage({ + what: 'highlightElementAtPoint', + mx: toolOverlay.mstrackerX, + my: toolOverlay.mstrackerY, + }); + }, + onHover(ev) { + toolOverlay.mstrackerX = ev.clientX; + toolOverlay.mstrackerY = ev.clientY; + if ( toolOverlay.mstrackerTimer !== undefined ) { return; } + toolOverlay.mstrackerTimer = + self.requestAnimationFrame(toolOverlay.onTimer); + }, + mstrackerOn: false, + mstrackerX: 0, mstrackerY: 0, + mstrackerTimer: undefined, + + mover(ev) { + const target = ev.target; + if ( target.matches('#move') === false ) { return; } + if ( dom.cl.has(this.moveable, 'moving') ) { return; } + target.setPointerCapture(ev.pointerId); + this.moverX0 = ev.pageX; + this.moverY0 = ev.pageY; + const rect = this.moveable.getBoundingClientRect(); + this.moverCX0 = rect.x + rect.width / 2; + this.moverCY0 = rect.y + rect.height / 2; + dom.cl.add(this.moveable, 'moving'); + self.addEventListener('pointermove', this.moverMoveAsync, { + passive: true, + capture: true, + }); + self.addEventListener('pointerup', this.moverStop, { capture: true, once: true }); + ev.stopPropagation(); + ev.preventDefault(); + }, + moverMove() { + this.moverTimer = undefined; + const cx1 = this.moverCX0 + this.moverX1 - this.moverX0; + const cy1 = this.moverCY0 + this.moverY1 - this.moverY0; + const rootW = dom.root.clientWidth; + const rootH = dom.root.clientHeight; + const moveableW = this.moveable.clientWidth; + const moveableH = this.moveable.clientHeight; + if ( cx1 < rootW / 2 ) { + this.moveable.style.setProperty('left', `${Math.max(cx1-moveableW/2,2)}px`); + this.moveable.style.removeProperty('right'); + } else { + this.moveable.style.removeProperty('left'); + this.moveable.style.setProperty('right', `${Math.max(rootW-cx1-moveableW/2,2)}px`); + } + if ( cy1 < rootH / 2 ) { + this.moveable.style.setProperty('top', `${Math.max(cy1-moveableH/2,2)}px`); + this.moveable.style.removeProperty('bottom'); + } else { + this.moveable.style.removeProperty('top'); + this.moveable.style.setProperty('bottom', `${Math.max(rootH-cy1-moveableH/2,2)}px`); + } + }, + moverMoveAsync(ev) { + toolOverlay.moverX1 = ev.pageX; + toolOverlay.moverY1 = ev.pageY; + if ( toolOverlay.moverTimer !== undefined ) { return; } + toolOverlay.moverTimer = self.requestAnimationFrame(( ) => { + toolOverlay.moverMove(); + }); + }, + moverStop(ev) { + if ( dom.cl.has(toolOverlay.moveable, 'moving') === false ) { return; } + dom.cl.remove(toolOverlay.moveable, 'moving'); + self.removeEventListener('pointermove', toolOverlay.moverMoveAsync, { + passive: true, + capture: true, + }); + ev.target.releasePointerCapture(ev.pointerId); + ev.stopPropagation(); + ev.preventDefault(); + }, + eatTouchEvent(ev) { + if ( ev.target !== qs$('aside #move') ) { return; } + ev.stopPropagation(); + ev.preventDefault(); + }, + moveable: null, + moverX0: 0, moverY0: 0, + moverX1: 0, moverY1: 0, + moverCX0: 0, moverCY0: 0, + moverTimer: undefined, +}; + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/troubleshooting.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/troubleshooting.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/troubleshooting.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/troubleshooting.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,130 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { runtime, sendMessage } from './ext.js'; + +/******************************************************************************/ + +function renderData(data, depth = 0) { + const indent = ' '.repeat(depth); + if ( Array.isArray(data) ) { + const out = []; + for ( const value of data ) { + out.push(renderData(value, depth)); + } + return out.join('\n'); + } + if ( typeof data !== 'object' || data === null ) { + return `${indent}${data}`; + } + const out = []; + for ( const [ name, value ] of Object.entries(data) ) { + if ( typeof value === 'object' && value !== null ) { + out.push(`${indent}${name}:`); + out.push(renderData(value, depth + 1)); + continue; + } + out.push(`${indent}${name}: ${value}`); + } + return out.join('\n'); +} + +/******************************************************************************/ + +export async function getTroubleshootingInfo(siteMode) { + const manifest = runtime.getManifest(); + const [ + platformInfo, + defaultConfig, + enabledRulesets, + defaultMode, + userRules, + consoleOutput, + hasOmnipotence, + ] = await Promise.all([ + runtime.getPlatformInfo(), + sendMessage({ what: 'getDefaultConfig' }), + sendMessage({ what: 'getEnabledRulesets' }), + sendMessage({ what: 'getDefaultFilteringMode' }), + sendMessage({ what: 'getEffectiveUserRules' }), + sendMessage({ what: 'getConsoleOutput' }), + sendMessage({ what: 'hasBroadHostPermissions' }), + ]); + const browser = (( ) => { + const extURL = runtime.getURL(''); + let agent = '', version = '?'; + if ( extURL.startsWith('moz-extension:') ) { + agent = 'Firefox'; + const match = /\bFirefox\/(\d+\.\d+)\b/.exec(navigator.userAgent); + version = match && match[1] || '?'; + } else if ( extURL.startsWith('safari-web-extension:') ) { + agent = 'Safari'; + const match = /\bVersion\/(\d+\.\d+)\b/.exec(navigator.userAgent); + version = match && match[1] || '?'; + } else if ( /\bEdg\/\b/.test(navigator.userAgent) ) { + agent = 'Edge'; + const match = /\bEdg\/(\d+)\b/.exec(navigator.userAgent); + version = match && match[1] || '?'; + } else { + agent = 'Chrome'; + const match = /\bChrome\/(\d+)\b/.exec(navigator.userAgent); + version = match && match[1] || '?'; + } + if ( /\bMobile\b/.test(navigator.userAgent) ) { + agent += ' Mobile'; + } + agent += ` ${version} (${platformInfo.os})` + return agent; + })(); + const modes = [ 'no filtering', 'basic', 'optimal', 'complete' ]; + const filtering = {}; + if ( siteMode ) { + filtering.site = `${modes[siteMode]}` + } + filtering.default = `${modes[defaultMode]}`; + const config = { + name: manifest.name, + version: manifest.version, + browser, + filtering, + permission: hasOmnipotence ? 'all' : 'ask', + }; + if ( userRules.length !== 0 ) { + config['user rules'] = userRules.length; + } + const defaultRulesets = defaultConfig.rulesets; + for ( let i = 0; i < enabledRulesets.length; i++ ) { + const id = enabledRulesets[i]; + if ( defaultRulesets.includes(id) ) { continue; } + enabledRulesets[i] = `+${id}`; + } + for ( const id of defaultRulesets ) { + if ( enabledRulesets.includes(id) ) { continue; } + enabledRulesets.push(`-${id}`); + } + config.rulesets = enabledRulesets.sort(); + if ( consoleOutput.length !== 0 ) { + config.console = siteMode + ? consoleOutput.slice(-8) + : consoleOutput; + } + return renderData(config); +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ubo-parser.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ubo-parser.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/ubo-parser.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ubo-parser.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,581 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import * as sfp from './static-filtering-parser.js'; +import punycode from './punycode.js'; +import redirectResourceMap from './redirect-resources.js'; + +/******************************************************************************/ + +const validResourceTypes = [ + 'main_frame', + 'sub_frame', + 'stylesheet', + 'script', + 'image', + 'font', + 'object', + 'xmlhttprequest', + 'ping', + 'csp_report', + 'media', + 'websocket', + 'webtransport', + 'webbundle', + 'other', +]; + +/******************************************************************************/ + +const validRedirectResources = (( ) => { + const out = new Map(); + for ( const [ name, resource ] of redirectResourceMap ) { + out.set(name, name); + if ( resource.alias === undefined ) { continue; } + if ( typeof resource.alias === 'string' ) { + out.set(resource.alias, name); + continue; + } + if ( Array.isArray(resource.alias) ) { + for ( const alias of resource.alias ) { + out.set(alias, name); + } + } + } + return out; +})(); + +const isNotEntity = hn => hn.endsWith('.*') === false; + +/******************************************************************************/ + +function toSuperDomain(hn) { + const pos = hn.indexOf('.'); + if ( pos === -1 ) { return; } + return hn.slice(pos+1); +} + +/******************************************************************************/ + +function parseHostnameList(iter) { + const out = { + included: { + good: [], + bad: [], + }, + excluded: { + good: [], + bad: [], + }, + }; + for ( let { hn, not, bad } of iter ) { + bad ||= hn.includes('/') || hn.includes('*'); + const hnAscii = bad === false && hn.startsWith('xn--') + ? punycode.toASCII(hn) + : hn; + const destination = not ? out.excluded : out.included; + if ( bad ) { + destination.bad.push(hnAscii); + } else { + destination.good.push(hnAscii); + } + } + return out; +} + +/******************************************************************************/ + +function ownerFromPropertyPath(root, path) { + let owner = root; + let prop = path; + for (;;) { + if ( owner instanceof Object === false ) { break; } + const pos = prop.indexOf('.'); + if ( pos === -1 ) { break; } + owner = owner[prop.slice(0, pos)]; + prop = prop.slice(pos+1) + } + return { owner: owner ?? undefined, prop }; +} + +/******************************************************************************/ + +function mergeArrays(rules, propertyPath) { + const out = []; + const distinctRules = new Map(); + for ( const rule of rules ) { + const { id } = rule; + const { owner, prop } = ownerFromPropertyPath(rule, propertyPath); + if ( owner === undefined || Array.isArray(owner[prop]) === false ) { + out.push(rule); + continue; + } + const collection = owner[prop] || []; + owner[prop] = undefined; + rule.id = undefined; + const hash = JSON.stringify(rule); + const details = distinctRules.get(hash) || + { id, collection: new Set() }; + if ( details.collection.size === 0 ) { + distinctRules.set(hash, details); + } + for ( const hn of collection ) { + details.collection.add(hn); + } + } + for ( const [ hash, { id, collection } ] of distinctRules ) { + const rule = JSON.parse(hash); + if ( id ) { + rule.id = id; + } + if ( collection.size !== 0 ) { + const { owner, prop } = ownerFromPropertyPath(rule, propertyPath); + owner[prop] = Array.from(collection).sort(); + } + out.push(rule); + } + return out; +} + +/******************************************************************************/ + +function minimizeRuleset(rules) { + rules = mergeArrays(rules, 'condition.requestDomains'); + rules = mergeArrays(rules, 'condition.excludedRequestDomains'); + rules = mergeArrays(rules, 'condition.initiatorDomains'); + rules = mergeArrays(rules, 'condition.excludedInitiatorDomains'); + rules = mergeArrays(rules, 'condition.resourceTypes'); + rules = mergeArrays(rules, 'condition.excludedRequestMethods'); + rules = mergeArrays(rules, 'condition.requestMethods'); + rules = mergeArrays(rules, 'condition.excludedResourceTypes'); + rules = mergeArrays(rules, 'action.redirect.transform.queryTransform.removeParams'); + return rules; +} + +/******************************************************************************/ + +function minimizeRules(rules) { + const hostnameListProp = [ + 'requestDomains', + 'excludedRequestDomains', + 'initiatorDomains', + 'excludedInitiatorDomains', + ]; + for ( const rule of rules ) { + for ( const prop of hostnameListProp ) { + const hostnames = rule.condition[prop]; + if ( hostnames === undefined ) { continue; } + if ( hostnames.length === 1 ) { continue; } + const hnSet = new Set(hostnames); + for ( let hn of hnSet ) { + for (;;) { + const hnup = toSuperDomain(hn); + if ( hnup === undefined ) { break; } + if ( hnSet.has(hnup) ) { hnSet.delete(hn); } + hn = hnup; + } + } + if ( hnSet.size === hostnames.length ) { continue; } + rule.condition[prop] = Array.from(hnSet).sort(); + } + } + return rules; +} + +/******************************************************************************/ + +function dropEntities(rule, prop) { + const { condition } = rule; + if ( condition[prop] === undefined ) { return; } + const sanitized = condition[prop].filter(a => isNotEntity(a)); + if ( sanitized.length === condition[prop].length ) { return; } + if ( sanitized.length === 0 ) { return 0; } + condition.requestDomains = sanitized; +} + +/******************************************************************************/ + +function validateRules(rules) { + const out = []; + for ( const rule of rules ) { + const { condition } = rule; + // "Only one of resourceTypes and excludedResourceTypes should be specified" + if ( condition.resourceTypes ) { + if ( condition.excludedResourceTypes ) { continue; } + } + // "Only one of requestMethods and excludedRequestMethods should be specified" + if ( condition.requestMethods ) { + if ( condition.excludedRequestMethods ) { continue; } + } + // Drop entity-based hostnames + if ( dropEntities(rule, 'requestDomains') === 0 ) { continue; } + if ( dropEntities(rule, 'excludedRequestDomains') === 0 ) { continue; } + if ( dropEntities(rule, 'initiatorDomains') === 0 ) { continue; } + if ( dropEntities(rule, 'excludedInitiatorDomains') === 0 ) { continue; } + // regexSubstitution requires regexFilter + if ( rule.action?.redirect?.regexSubstitution ) { + if ( rule.condition.regexFilter === undefined ) { continue; } + } + out.push(rule); + } + return out; +} + +/******************************************************************************/ + +export function parseNetworkFilter(parser) { + if ( parser.isNetworkFilter() === false ) { return; } + if ( parser.hasError() ) { return; } + + const rule = { + action: { type: 'block' }, + condition: { }, + }; + if ( parser.isException() ) { + rule.action.type = 'allow'; + } + + let pattern = parser.getNetPattern(); + if ( parser.isHostnamePattern() ) { + rule.condition.requestDomains = [ pattern ]; + } else if ( parser.isPlainPattern() || parser.isGenericPattern() ) { + if ( parser.isLeftHnAnchored() ) { + pattern = `||${pattern}`; + } else if ( parser.isLeftAnchored() ) { + pattern = `|${pattern}`; + } + if ( parser.isRightAnchored() ) { + pattern = `${pattern}|`; + } + rule.condition.urlFilter = pattern; + } else if ( parser.isRegexPattern() ) { + rule.condition.regexFilter = pattern; + } else if ( parser.isAnyPattern() === false ) { + rule.condition.urlFilter = pattern; + } + + const defaultResourceTypes = new Set(); + let defaultUrlFilter = ''; + + const initiatorDomains = new Set(); + const excludedInitiatorDomains = new Set(); + const requestDomains = new Set(); + const excludedRequestDomains = new Set(); + const requestMethods = new Set(); + const excludedRequestMethods = new Set(); + const resourceTypes = new Set(); + const excludedResourceTypes = new Set(); + + const processResourceType = (resourceType, nodeType) => { + const not = parser.isNegatedOption(nodeType) + if ( validResourceTypes.includes(resourceType) === false ) { + if ( not ) { return; } + } + if ( not ) { + excludedResourceTypes.add(resourceType); + } else { + resourceTypes.add(resourceType); + } + }; + + let priority = 0; + + for ( const type of parser.getNodeTypes() ) { + switch ( type ) { + case sfp.NODE_TYPE_NET_OPTION_NAME_1P: + rule.condition.domainType = parser.isNegatedOption(type) + ? 'thirdParty' + : 'firstParty'; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT1P: + case sfp.NODE_TYPE_NET_OPTION_NAME_STRICT3P: + case sfp.NODE_TYPE_NET_OPTION_NAME_BADFILTER: + case sfp.NODE_TYPE_NET_OPTION_NAME_CNAME: + case sfp.NODE_TYPE_NET_OPTION_NAME_EHIDE: + case sfp.NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK: + case sfp.NODE_TYPE_NET_OPTION_NAME_GHIDE: + case sfp.NODE_TYPE_NET_OPTION_NAME_IPADDRESS: + case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: + case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE: + case sfp.NODE_TYPE_NET_OPTION_NAME_SHIDE: + case sfp.NODE_TYPE_NET_OPTION_NAME_URLSKIP: + return; + case sfp.NODE_TYPE_NET_OPTION_NAME_INLINEFONT: + case sfp.NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT: + case sfp.NODE_TYPE_NET_OPTION_NAME_POPUNDER: + case sfp.NODE_TYPE_NET_OPTION_NAME_POPUP: + case sfp.NODE_TYPE_NET_OPTION_NAME_WEBRTC: + processResourceType('', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_3P: + rule.condition.domainType = parser.isNegatedOption(type) + ? 'firstParty' + : 'thirdParty'; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_ALL: + validResourceTypes.forEach(a => resourceTypes.add(a)); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_CSP: + if ( rule.action.responseHeaders ) { return; } + rule.action.type = 'modifyHeaders'; + rule.action.responseHeaders = [ { + header: 'content-security-policy', + operation: 'append', + value: parser.getNetOptionValue(type), + } ]; + defaultResourceTypes.add('main_frame'); + defaultResourceTypes.add('sub_frame'); + defaultResourceTypes.add('object'); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_CSS: + processResourceType('stylesheet', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: { + const { included, excluded } = parseHostnameList( + parser.getNetFilterDenyallowOptionIterator() + ); + if ( excluded.good.length !== 0 || excluded.bad.length !== 0 ) { return; } + if ( included.bad.length !== 0 ) { return; } + if ( included.good.length === 0 ) { return; } + for ( const hn of included.good ) { + excludedRequestDomains.add(hn); + } + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_DOC: + processResourceType('main_frame', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_FONT: + processResourceType('font', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_FRAME: + processResourceType('sub_frame', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: { + const { included, excluded } = parseHostnameList( + parser.getNetFilterFromOptionIterator() + ); + if ( included.good.length === 0 ) { + if ( included.bad.length !== 0 ) { return; } + } + if ( excluded.bad.length !== 0 ) { return; } + for ( const hn of included.good ) { + initiatorDomains.add(hn); + } + for ( const hn of excluded.good ) { + excludedInitiatorDomains.add(hn); + } + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: { + const details = sfp.parseHeaderValue(parser.getNetOptionValue(type)); + const headerInfo = { + header: details.name, + }; + if ( details.value !== '' ) { + if ( details.isRegex ) { return; } + headerInfo.values = [ details.value ]; + } + rule.condition.responseHeaders = [ headerInfo ]; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_IMAGE: + processResourceType('image', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_IMPORTANT: + priority += 30; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_MATCHCASE: + rule.condition.isUrlFilterCaseSensitive = true; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_MEDIA: + processResourceType('media', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: { + const value = parser.getNetOptionValue(type); + for ( const method of value.toLowerCase().split('|') ) { + const not = method.charCodeAt(0) === 0x7E /* '~' */; + if ( not ) { + excludedRequestMethods.add(method.slice(1)); + } else { + requestMethods.add(method); + } + } + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_OBJECT: + processResourceType('object', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_OTHER: + processResourceType('other', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: + if ( rule.action.responseHeaders ) { return; } + rule.action.type = 'modifyHeaders'; + rule.action.responseHeaders = [ { + header: 'permissions-policy', + operation: 'append', + value: parser.getNetOptionValue(type), + } ]; + defaultResourceTypes.add('main_frame'); + defaultResourceTypes.add('sub_frame'); + defaultResourceTypes.add('object'); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_PING: + processResourceType('ping', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_REASON: + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: { + if ( rule.action.type !== 'block' ) { return; } + let value = parser.getNetOptionValue(type); + const match = /:(\d+)$/.exec(value); + if ( match ) { + const subpriority = parseInt(match[1], 10); + priority += Math.min(subpriority, 8); + value = value.slice(0, match.index); + } + if ( validRedirectResources.has(value) === false ) { return; } + rule.action.type = 'redirect'; + rule.action.redirect = { + extensionPath: `/web_accessible_resources/${validRedirectResources.get(value)}`, + }; + priority += 11; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: { + const details = sfp.parseQueryPruneValue(parser.getNetOptionValue(type)); + if ( details.bad ) { return; } + if ( details.not ) { return; } + if ( details.re ) { return; } + const removeParams = []; + if ( details.name ) { + removeParams.push(details.name); + } + rule.action.type = 'redirect'; + rule.action.redirect = { + transform: { queryTransform: { removeParams } } + }; + defaultResourceTypes.add('main_frame'); + defaultResourceTypes.add('sub_frame'); + defaultResourceTypes.add('xmlhttprequest'); + defaultUrlFilter = '?'; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_SCRIPT: + processResourceType('script', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_TO: { + const { included, excluded } = parseHostnameList( + parser.getNetFilterToOptionIterator() + ); + if ( included.good.length === 0 ) { + if ( included.bad.length !== 0 ) { return; } + } + if ( excluded.bad.length !== 0 ) { return; } + for ( const hn of included.good ) { + requestDomains.add(hn); + } + for ( const hn of excluded.good ) { + excludedRequestDomains.add(hn); + } + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: { + const parsed = sfp.parseReplaceByRegexValue(parser.getNetOptionValue(type)); + if ( parsed === undefined ) { return; } + if ( parsed.re ) { return; } + rule.action.type = 'redirect'; + rule.action.redirect = { + regexSubstitution: parsed.replacement.replace(/\$(\d+)/g, '\\$1'), + }; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_XHR: + processResourceType('xmlhttprequest', type); + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_WEBSOCKET: + processResourceType('websocket', type); + break; + default: + break; + } + } + if ( pattern === '*' && defaultUrlFilter !== '' ) { + rule.condition.urlFilter = defaultUrlFilter; + } + if ( initiatorDomains.size !== 0 ) { + rule.condition.initiatorDomains = Array.from(initiatorDomains).sort(); + } + if ( excludedInitiatorDomains.size !== 0 ) { + rule.condition.excludedInitiatorDomains = Array.from(excludedInitiatorDomains).sort(); + } + if ( requestDomains.size !== 0 ) { + rule.condition.requestDomains = Array.from(requestDomains).sort(); + } + if ( excludedRequestDomains.size !== 0 ) { + rule.condition.excludedRequestDomains = Array.from(excludedRequestDomains).sort(); + } + if ( requestMethods.size !== 0 ) { + rule.condition.requestMethods = Array.from(requestMethods).sort(); + } + if ( excludedRequestMethods.size !== 0 ) { + rule.condition.excludedRequestMethods = Array.from(excludedRequestMethods).sort(); + } + if ( resourceTypes.size === 0 && excludedResourceTypes.size === 0 ) { + defaultResourceTypes.forEach(a => resourceTypes.add(a)); + } + if ( resourceTypes.size !== 0 ) { + const types = Array.from(resourceTypes).filter(a => a !== '').sort(); + if ( types.length === 0 ) { return; } + rule.condition.resourceTypes = types; + } + if ( excludedResourceTypes.size !== 0 ) { + if ( resourceTypes.size !== 0 ) { return; } + rule.condition.excludedResourceTypes = Array.from(excludedResourceTypes).sort(); + } + if ( priority !== 0 ) { + rule.priority = priority; + } + return rule; +} + +/******************************************************************************/ + +export function parseFilters(text) { + if ( text.startsWith('---') ) { return; } + if ( text.endsWith('---') ) { return; } + const lines = text.split(/\n/); + if ( lines.some(a => a.startsWith(' ')) ) { return; } + let rules = []; + const parser = new sfp.AstFilterParser({ trustedSource: true }); + for ( const line of lines ) { + parser.parse(line); + if ( parser.isNetworkFilter() === false ) { continue; } + const rule = parseNetworkFilter(parser); + if ( rule === undefined ) { continue; } + rules.push(rule); + } + rules = minimizeRuleset(rules); + rules = minimizeRules(rules); + rules = validateRules(rules); + return rules; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/unpicker-ui.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/unpicker-ui.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/unpicker-ui.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/unpicker-ui.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,171 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom, qs$, qsa$ } from './dom.js'; +import { faIconsInit } from './fa-icons.js'; +import { toolOverlay } from './tool-overlay-ui.js'; + +/******************************************************************************/ + +function onMinimizeClicked() { + dom.cl.toggle(dom.root, 'minimized'); +} + +/******************************************************************************/ + +function highlight() { + const selectors = []; + for ( const selectorElem of qsa$('#customFilters .customFilter.on') ) { + selectors.push(selectorElem.dataset.selector); + } + if ( selectors.length !== 0 ) { + toolOverlay.postMessage({ + what: 'highlightFromSelector', + selector: selectors.join(','), + scrollTo: true, + }); + } else { + toolOverlay.postMessage({ what: 'unhighlight' }); + } +} + +/******************************************************************************/ + +function onFilterClicked(ev) { + const target = ev.target; + const filterElem = target.closest('.customFilter'); + if ( filterElem === null ) { return; } + const selectorElem = qs$(filterElem, ':scope > span.selector'); + if ( target === selectorElem ) { + if ( dom.cl.has(filterElem, 'on') ) { + dom.cl.remove(filterElem, 'on'); + } else { + dom.cl.remove('.customFilter.on', 'on'); + dom.cl.add(filterElem, 'on'); + } + highlight(); + return; + } + const selector = filterElem.dataset.selector; + const trashElem = qs$(filterElem, ':scope > span.remove'); + if ( target === trashElem ) { + dom.cl.add(filterElem, 'removed'); + dom.cl.remove(filterElem, 'on'); + toolOverlay.sendMessage({ what: 'removeCustomFilters', + hostname: toolOverlay.url.hostname, + selectors: [ selector ], + }).then(( ) => { + autoSelectFilter(); + }); + return; + } + const undoElem = qs$(filterElem, ':scope > span.undo'); + if ( target === undoElem ) { + dom.cl.remove(filterElem, 'removed'); + toolOverlay.sendMessage({ what: 'addCustomFilters', + hostname: toolOverlay.url.hostname, + selectors: [ selector ], + }).then(( ) => { + dom.cl.remove('.customFilter.on', 'on'); + dom.cl.add(filterElem, 'on'); + highlight(); + }); + return; + } +} + +/******************************************************************************/ + +function autoSelectFilter() { + let filterElem = qs$('.customFilter.on'); + if ( filterElem !== null ) { return; } + filterElem = qs$('.customFilter:not(.removed)'); + if ( filterElem !== null ) { + dom.cl.add(filterElem, 'on'); + } + highlight(); +} + +/******************************************************************************/ + +function populateFilters(selectors) { + const container = qs$('#customFilters'); + dom.clear(container); + const rowTemplate = qs$('template#customFilterRow'); + for ( const selector of selectors ) { + const fragment = rowTemplate.content.cloneNode(true); + const row = qs$(fragment, '.customFilter'); + row.dataset.selector = selector; + let text = selector; + if ( selector.startsWith('{') ) { + const o = JSON.parse(selector); + text = o.raw; + } + qs$(row, '.selector').textContent = text; + container.append(fragment); + } + faIconsInit(container); + autoSelectFilter(); +} + +/******************************************************************************/ + +async function startUnpicker() { + const selectors = await toolOverlay.sendMessage({ + what: 'customFiltersFromHostname', + hostname: toolOverlay.url.hostname, + }) + if ( selectors.length === 0 ) { + return quitUnpicker(); + } + await toolOverlay.postMessage({ what: 'terminateCustomFilters' }); + await toolOverlay.postMessage({ what: 'startTool' }); + populateFilters(selectors); + dom.on('#minimize', 'click', onMinimizeClicked); + dom.on('#customFilters', 'click', onFilterClicked); + dom.on('#quit', 'click', quitUnpicker); +} + +/******************************************************************************/ + +async function quitUnpicker() { + await toolOverlay.postMessage({ what: 'startCustomFilters' }); + toolOverlay.stop(); +} + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'startTool': + startUnpicker(); + break; + default: + break; + } +} + +/******************************************************************************/ + +// Wait for the content script to establish communication +toolOverlay.start(onMessage); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/utils.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/utils.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/utils.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/utils.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,16 +19,17 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; +import { + browser, + runtime, +} from './ext.js'; /******************************************************************************/ function parsedURLromOrigin(origin) { try { return new URL(origin); - } catch(ex) { + } catch { } } @@ -51,6 +52,13 @@ return hna.charCodeAt(hna.length - hnb.length - 1) === 0x2E /* '.' */; }; +/** + * Returns whether a hostname is part of a collection, or is descendant of an + * item in the collection. + * @param hna - the hostname representing the needle. + * @param iterb - an iterable representing the haystack of hostnames. + */ + const isDescendantHostnameOfIter = (hna, iterb) => { const setb = iterb instanceof Set ? iterb : new Set(iterb); if ( setb.has('all-urls') || setb.has('*') ) { return true; } @@ -64,6 +72,13 @@ return false; }; +/** + * Returns all hostnames in the first collection which are equal or descendant + * of hostnames in the second collection. + * @param itera - an iterable which hostnames must be filtered out. + * @param iterb - an iterable which hostnames must be matched. + */ + const intersectHostnameIters = (itera, iterb) => { const setb = iterb instanceof Set ? iterb : new Set(iterb); if ( setb.has('all-urls') || setb.has('*') ) { return Array.from(itera); } @@ -90,15 +105,13 @@ /******************************************************************************/ +const matchFromHostname = hn => + hn === '*' || hn === 'all-urls' ? '' : `*://*.${hn}/*`; + const matchesFromHostnames = hostnames => { const out = []; for ( const hn of hostnames ) { - if ( hn === '*' || hn === 'all-urls' ) { - out.length = 0; - out.push(''); - break; - } - out.push(`*://*.${hn}/*`); + out.push(matchFromHostname(hn)); } return out; }; @@ -106,11 +119,11 @@ const hostnamesFromMatches = origins => { const out = []; for ( const origin of origins ) { - if ( origin === '' ) { + if ( origin === '' || origin === '*://*/*' ) { out.push('all-urls'); continue; } - const match = /^\*:\/\/(?:\*\.)?([^\/]+)\/\*/.exec(origin); + const match = /^\*:\/\/(?:\*\.)?([^/]+)\/\*/.exec(origin); if ( match === null ) { continue; } out.push(match[1]); } @@ -119,23 +132,95 @@ /******************************************************************************/ -const fnameFromFileId = fid => - fid.toString(32).padStart(7, '0'); +const broadcastMessage = message => { + const bc = new self.BroadcastChannel('uBOL'); + bc.postMessage(message); +}; + +/******************************************************************************/ + +// https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/manifest.json/host_permissions#requested_permissions_and_user_prompts +// "Users can grant or revoke host permissions on an ad hoc basis. Therefore, +// most browsers treat host_permissions as optional." + +async function hasBroadHostPermissions() { + return browser.permissions.getAll().then(permissions => + permissions.origins.includes('') || + permissions.origins.includes('*://*/*') + ).catch(( ) => false); +} + +/******************************************************************************/ + +async function gotoURL(url, type) { + const pageURL = new URL(url, runtime.getURL('/')); + const tabs = await browser.tabs.query({ + url: pageURL.href, + windowType: type !== 'popup' ? 'normal' : 'popup' + }); + + if ( Array.isArray(tabs) && tabs.length !== 0 ) { + const { windowId, id } = tabs[0]; + return Promise.all([ + browser.windows.update(windowId, { focused: true }), + browser.tabs.update(id, { active: true }), + ]); + } + + if ( type === 'popup' ) { + return browser.windows.create({ + type: 'popup', + url: pageURL.href, + }); + } + + return browser.tabs.create({ + active: true, + url: pageURL.href, + }); +} + +/******************************************************************************/ + +// Important: We need to sort the arrays for fast comparison +const strArrayEq = (a = [], b = [], sort = true) => { + const alen = a.length; + if ( alen !== b.length ) { return false; } + if ( sort ) { a.sort(); b.sort(); } + for ( let i = 0; i < alen; i++ ) { + if ( a[i] !== b[i] ) { return false; } + } + return true; +}; + +/******************************************************************************/ + +// The goal is just to be able to find out whether a specific version is older +// than another one. -const fidFromFileName = fname => - parseInt(fname, 32); +export function intFromVersion(version) { + const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(version); + if ( match === null ) { return 0; } + const year = parseInt(match[1], 10); + const monthday = parseInt(match[2], 10); + const min = parseInt(match[3], 10); + return (year - 2022) * (1232 * 2400) + monthday * 2400 + min; +} /******************************************************************************/ export { + broadcastMessage, parsedURLromOrigin, toBroaderHostname, isDescendantHostname, isDescendantHostnameOfIter, intersectHostnameIters, subtractHostnameIters, + matchFromHostname, matchesFromHostnames, hostnamesFromMatches, - fnameFromFileId, - fidFromFileName, + hasBroadHostPermissions, + gotoURL, + strArrayEq, }; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/zapper-ui.js ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/zapper-ui.js --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/js/zapper-ui.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/zapper-ui.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,133 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { dom } from './dom.js'; +import { toolOverlay } from './tool-overlay-ui.js'; + +/******************************************************************************/ + +function onSvgClicked(ev) { + // If zap mode, highlight element under mouse, this makes the zapper usable + // on touch screens. + toolOverlay.postMessage({ + what: 'zapElementAtPoint', + mx: ev.clientX, + my: ev.clientY, + options: { + stay: true, + highlight: dom.cl.has(dom.root, 'mobile') && + ev.target !== toolOverlay.svgIslands, + }, + }); +} + +/******************************************************************************/ + +const onSvgTouch = (( ) => { + let startX = 0, startY = 0; + let t0 = 0; + return ev => { + if ( ev.type === 'touchstart' ) { + startX = ev.touches[0].screenX; + startY = ev.touches[0].screenY; + t0 = ev.timeStamp; + return; + } + if ( startX === undefined ) { return; } + const stopX = ev.changedTouches[0].screenX; + const stopY = ev.changedTouches[0].screenY; + const distance = Math.sqrt( + Math.pow(stopX - startX, 2) + + Math.pow(stopY - startY, 2) + ); + // Interpret touch events as a tap if: + // - Swipe is not valid; and + // - The time between start and stop was less than 200ms. + const duration = ev.timeStamp - t0; + if ( distance >= 32 || duration >= 200 ) { return; } + onSvgClicked({ + type: 'touch', + target: ev.target, + clientX: ev.changedTouches[0].pageX, + clientY: ev.changedTouches[0].pageY, + }); + ev.preventDefault(); + }; +})(); + +/******************************************************************************/ + +function onKeyPressed(ev) { + // Delete + if ( ev.key === 'Delete' || ev.key === 'Backspace' ) { + toolOverlay.postMessage({ + what: 'zapElementAtPoint', + options: { stay: true }, + }); + return; + } + // Esc + if ( ev.key === 'Escape' || ev.which === 27 ) { + quitZapper(); + return; + } +} + +/******************************************************************************/ + +function startZapper() { + toolOverlay.postMessage({ what: 'startTool' }); + self.addEventListener('keydown', onKeyPressed, true); + dom.on('svg#overlay', 'click', onSvgClicked); + dom.on('svg#overlay', 'touchstart', onSvgTouch, { passive: true }); + dom.on('svg#overlay', 'touchend', onSvgTouch); + dom.on('#quit', 'click', quitZapper ); + dom.on('#pick', 'click', resetZapper ); + toolOverlay.highlightElementUnderMouse(true); +} + +function quitZapper() { + self.removeEventListener('keydown', onKeyPressed, true); + toolOverlay.stop(); +} + +function resetZapper() { + toolOverlay.postMessage({ what: 'unhighlight' }); +} + +/******************************************************************************/ + +function onMessage(msg) { + switch ( msg.what ) { + case 'startTool': + startZapper(); + break; + default: + break; + } +} + +/******************************************************************************/ + +// Wait for the content script to establish communication +toolOverlay.start(onMessage); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/lib/codemirror/README.md ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/README.md --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/lib/codemirror/README.md 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/README.md 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,9 @@ +Steps to build `cm6.bundle.ubol.min.js` -- command line from repo root: + +- `git submodule init platform/mv3/extension/lib/codemirror/codemirror-ubol` +- `cd platform/mv3/extension/lib/codemirror/codemirror-ubol/` + - We are now in a customized repo forked from +- `npm install` +- `npm run build` +- `cm6.bundle.ubol.min.js` should be in `dist` directory +- This is the origin of the `cm6.bundle.ubol.min.js` in the current directory diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2018-2021 by Marijn Haverbeke and others + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/managed_storage.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/managed_storage.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/managed_storage.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/managed_storage.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,40 @@ +{ + "$schema": "http://json-schema.org/draft-03/schema#", + "type": "object", + "properties": { + "defaultFiltering": { + "title": "The default filtering mode", + "description": "Can be one of \"none\", \"basic\", \"optimal\", \"complete\".", + "type": "string" + }, + "disabledFeatures": { + "title": "User interface features to disable", + "description": "A list of tokens, each of which correspond to a user interface feature to disable.", + "type": "array", + "items": { "type": "string" } + }, + "disableFirstRunPage": { + "title": "Disable first run page", + "type": "boolean" + }, + "noFiltering": { + "title": "List of domains for which no filtering should occur", + "type": "array", + "items": { "type": "string" } + }, + "rulesets": { + "title": "Rulesets to add/remove", + "description": "Prefix a ruleset id with '+' to add, or '-' to remove. Use '-*' to disable all non-default lists.", + "type": "array", + "items": { "type": "string" } + }, + "showBlockedCount": { + "title": "Enable/disable toolbar icon count badge", + "type": "boolean" + }, + "strictBlockMode": { + "title": "Enable/disable strict blocking", + "type": "boolean" + } + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/manifest.json ublock-origin-1.67.0+dfsg/platform/mv3/extension/manifest.json --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/manifest.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/manifest.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -{ - "action": { - "default_icon": { - "16": "img/icon_16.png", - "32": "img/icon_32.png", - "64": "img/icon_64.png" - }, - "default_popup": "popup.html" - }, - "author": "Raymond Hill", - "background": { - "service_worker": "/js/background.js", - "type": "module" - }, - "declarative_net_request": { - "rule_resources": [ - ] - }, - "default_locale": "en", - "description": "__MSG_extShortDesc__", - "icons": { - "16": "img/icon_16.png", - "32": "img/icon_32.png", - "64": "img/icon_64.png", - "128": "img/icon_128.png" - }, - "manifest_version": 3, - "minimum_chrome_version": "105.0", - "name": "__MSG_extName__", - "options_page": "dashboard.html", - "optional_host_permissions": [ - "" - ], - "permissions": [ - "activeTab", - "declarativeNetRequest", - "scripting" - ], - "short_name": "uBO Lite", - "version": "0.1", - "web_accessible_resources": [] -} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/matched-rules.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/matched-rules.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/matched-rules.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/matched-rules.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + + +Matched rules + + + + + + + + + + +
    +
    + + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/picker-ui.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/picker-ui.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/picker-ui.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/picker-ui.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,56 @@ + + + + + + +uBO Lite Zapper + + + + + + + + + + + + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/popup.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/popup.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/popup.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/popup.html 2025-10-25 19:32:51.000000000 +0000 @@ -4,17 +4,19 @@ + - + - + +
    -
    _
    +
    ­
    @@ -23,36 +25,37 @@
    -
    ­
    - -
    - - - - - cogs -
    -
    -
    -
    +

    _
    -
    - - _angle-up +
    + + + bolt + _ + + + eye-slash + _ - - angle-up_ + + eye-open + _ + + + comment-alt + _
    -
    - -
    -

    + +
    + list-altShow matched rules + cogs +
    - + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/report.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/report.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/report.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/report.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,69 @@ + + + + + + +uBO Lite — Report + + + + + + + + + + + +
    + +

    +

    +
    +
    +

    + +
    +
    +
    +

    +
    + +

    +

    +
    + +

    +

    + +

    + +
    +
    +
    +
    +
    
    +    
    +
    + +
    + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/settings.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/settings.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/settings.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/settings.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ - - - - - -uBlock Origin Lite — Filter lists - - - - - - - - - - -
    -

    -

    -
    - -
    -

    -

    -
    - - - -
    -
    - -
    -

    -

    -

    -
    - -
    -

    Filter lists

    -
    -

    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    - - - - - - - - - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/strictblock.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/strictblock.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/strictblock.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/strictblock.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + +
    + + +
    +

    + +
    + + + + + +
    + +
    + +
    + + + +
    +
    + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/unpicker-ui.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/unpicker-ui.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/unpicker-ui.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/unpicker-ui.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,40 @@ + + + + + + +uBO Lite Zapper + + + + + + + + + + + + + + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/extension/zapper-ui.html ublock-origin-1.67.0+dfsg/platform/mv3/extension/zapper-ui.html --- ublock-origin-1.46.0+dfsg/platform/mv3/extension/zapper-ui.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/extension/zapper-ui.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,32 @@ + + + + + + +uBO Lite Zapper + + + + + + + + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/firefox/manifest.json ublock-origin-1.67.0+dfsg/platform/mv3/firefox/manifest.json --- ublock-origin-1.46.0+dfsg/platform/mv3/firefox/manifest.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/firefox/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,96 @@ +{ + "action": { + "default_area": "navbar", + "default_icon": { + "16": "img/icon_16.png", + "32": "img/icon_32.png", + "64": "img/icon_64.png" + }, + "default_popup": "popup.html" + }, + "author": "Raymond Hill", + "background": { + "scripts": [ "/js/background.js" ], + "type": "module" + }, + "browser_specific_settings": { + "gecko": { + "id": "uBOLiteRedux@raymondhill.net", + "strict_min_version": "128.0" + }, + "gecko_android": { + "strict_min_version": "128.0" + } + }, + "commands": { + "enter-zapper-mode": { + "description": "__MSG_zapperTipEnter__" + }, + "enter-picker-mode": { + "description": "__MSG_pickerTipEnter__" + } + }, + "declarative_net_request": { + "rule_resources": [ + ] + }, + "default_locale": "en", + "description": "__MSG_extShortDesc__", + "icons": { + "16": "img/icon_16.png", + "32": "img/icon_32.png", + "64": "img/icon_64.png", + "128": "img/icon_128.png" + }, + "manifest_version": 3, + "name": "uBO Lite", + "options_ui": { + "open_in_tab": true, + "page": "dashboard.html" + }, + "host_permissions": [ + "" + ], + "permissions": [ + "activeTab", + "declarativeNetRequest", + "scripting", + "storage" + ], + "short_name": "uBO Lite", + "version": "1.0", + "web_accessible_resources": [ + { + "resources": [ + "/strictblock.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "/zapper-ui.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "/picker-ui.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "/unpicker-ui.html" + ], + "matches": [ + "" + ] + } + ] +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/firefox/patch-ruleset.js ublock-origin-1.67.0+dfsg/platform/mv3/firefox/patch-ruleset.js --- ublock-origin-1.46.0+dfsg/platform/mv3/firefox/patch-ruleset.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/firefox/patch-ruleset.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,30 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +export function patchRuleset(ruleset) { + const out = []; + for ( const rule of ruleset ) { + const condition = rule.condition; + if ( Array.isArray(condition.responseHeaders) ) { continue; } + out.push(rule); + } + return out; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/make-rulesets.js ublock-origin-1.67.0+dfsg/platform/mv3/make-rulesets.js --- ublock-origin-1.46.0+dfsg/platform/mv3/make-rulesets.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/make-rulesets.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2022-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,19 +19,24 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; +import * as makeScriptlet from './make-scriptlets.js'; +import * as sfp from './js/static-filtering-parser.js'; -/******************************************************************************/ +import { + createHash, + randomBytes, +} from 'crypto'; +import { + dnrRulesetFromRawLists, + mergeRules, +} from './js/static-dnr-filtering.js'; +import { execSync } from 'node:child_process'; import fs from 'fs/promises'; -import https from 'https'; import path from 'path'; import process from 'process'; -import { createHash } from 'crypto'; import redirectResourcesMap from './js/redirect-resources.js'; -import { dnrRulesetFromRawLists } from './js/static-dnr-filtering.js'; -import { StaticFilteringParser } from './js/static-filtering-parser.js'; -import { fnameFromFileId } from './js/utils.js'; +import { safeReplace } from './safe-replace.js'; /******************************************************************************/ @@ -52,19 +57,29 @@ return args; })(); +const platform = commandLineArgs.get('platform') || 'chromium'; const outputDir = commandLineArgs.get('output') || '.'; const cacheDir = `${outputDir}/../mv3-data`; const rulesetDir = `${outputDir}/rulesets`; const scriptletDir = `${rulesetDir}/scripting`; +const envExtra = (( ) => { + const env = commandLineArgs.get('env'); + return env ? env.split('|') : []; +})(); const env = [ - 'chromium', - 'mv3', + platform, 'native_css_has', + 'mv3', 'ublock', 'ubol', 'user_stylesheet', + ...envExtra, ]; +if ( platform === 'edge' ) { + env.push('chromium'); +} + /******************************************************************************/ const jsonSetMapReplacer = (k, v) => { @@ -80,58 +95,72 @@ return parseInt(h,16) & 0x7FFFFFFF; }; -const hnSort = (a, b) => - a.split('.').reverse().join('.').localeCompare( - b.split('.').reverse().join('.') - ); - /******************************************************************************/ +const consoleLog = console.log; const stdOutput = []; -const log = (text, silent = false) => { +const log = (text, silent = true) => { stdOutput.push(text); if ( silent === false ) { - console.log(text); + consoleLog(text); } }; +console.log = log; + +const logProgress = text => { + process?.stdout?.clearLine?.(); + process?.stdout?.cursorTo?.(0); + process?.stdout?.write?.(text.length > 120 ? `${text.slice(0, 119)}… ` : `${text} `); +}; + /******************************************************************************/ -const urlToFileName = url => { - return url +async function fetchText(url, cacheDir) { + logProgress(`Reading locally cached ${url}`); + const fname = url .replace(/^https?:\/\//, '') - .replace(/\//g, '_') - ; -}; + .replace(/\//g, '_');(url); + const content = await fs.readFile( + `${cacheDir}/${fname}`, + { encoding: 'utf8' } + ).catch(( ) => { }); + if ( content !== undefined ) { + log(`\tFetched local ${url}`); + return { url, content }; + } + logProgress(`Fetching remote ${url}`); + log(`\tFetching remote ${url}`); + const response = await fetch(url).catch(( ) => { }); + if ( response === undefined ) { + return { url, error: `Fetching failed: ${url}` }; + } + let text; + if ( response.ok ) { + text = await response.text().catch(( ) => { }); + } else { + text = await fallbackFetchText(url).catch(( ) => { }); + } + if ( text === undefined ) { + return { url, error: `Fetching text content failed: ${url}` }; + } + writeFile(`${cacheDir}/${fname}`, text); + return { url, content: text }; +} -const fetchList = (url, cacheDir) => { - return new Promise((resolve, reject) => { - const fname = urlToFileName(url); - fs.readFile(`${cacheDir}/${fname}`, { encoding: 'utf8' }).then(content => { - log(`\tFetched local ${url}`); - resolve({ url, content }); - }).catch(( ) => { - log(`\tFetching remote ${url}`); - https.get(url, response => { - const data = []; - response.on('data', chunk => { - data.push(chunk.toString()); - }); - response.on('end', ( ) => { - const content = data.join(''); - try { - writeFile(`${cacheDir}/${fname}`, content); - } catch (ex) { - } - resolve({ url, content }); - }); - }).on('error', error => { - reject(error); - }); - }); - }); -}; +async function fallbackFetchText(url) { + const match = /^https:\/\/raw\.githubusercontent\.com\/([^/]+)\/([^/]+)\/master\/([^?]+)/.exec(url); + if ( match === null ) { return; } + logProgress(`\tGitHub CLI-fetching remote ${url}`); + // https://docs.github.com/en/rest/repos/contents + const content = execSync(`gh api \ + -H "Accept: application/vnd.github.raw+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${match[1]}/${match[2]}/contents/${match[3]} \ + `, { encoding: 'utf8' }); + return content; +} /******************************************************************************/ @@ -157,16 +186,60 @@ const ruleResources = []; const rulesetDetails = []; -const declarativeDetails = new Map(); -const proceduralDetails = new Map(); const scriptletStats = new Map(); -const specificDetails = new Map(); const genericDetails = new Map(); const requiredRedirectResources = new Set(); +let networkBad = new Set(); + +// This will be used to sign our inserted `!#trusted on` directives +const secret = createHash('sha256').update(randomBytes(16)).digest('hex').slice(0,16); +log(`Secret: ${secret}`, false); /******************************************************************************/ -async function fetchAsset(assetDetails) { +const restrSeparator = '(?:[^%.0-9a-z_-]|$)'; + +const rePatternFromUrlFilter = s => { + let anchor = 0b000; + if ( s.startsWith('||') ) { + anchor = 0b100; + s = s.slice(2); + } else if ( s.startsWith('|') ) { + anchor = 0b010; + s = s.slice(1); + } + if ( s.endsWith('|') ) { + anchor |= 0b001; + s = s.slice(0, -1); + } + let reStr = s.replace(rePatternFromUrlFilter.rePlainChars, '\\$&') + .replace(rePatternFromUrlFilter.reSeparators, restrSeparator) + .replace(rePatternFromUrlFilter.reDanglingAsterisks, '') + .replace(rePatternFromUrlFilter.reAsterisks, '\\S*?'); + if ( anchor & 0b100 ) { + reStr = ( + reStr.startsWith('\\.') ? + rePatternFromUrlFilter.restrHostnameAnchor2 : + rePatternFromUrlFilter.restrHostnameAnchor1 + ) + reStr; + } else if ( anchor & 0b010 ) { + reStr = '^' + reStr; + } + if ( anchor & 0b001 ) { + reStr += '$'; + } + return reStr; +}; +rePatternFromUrlFilter.rePlainChars = /[.+?${}()|[\]\\]/g; +rePatternFromUrlFilter.reSeparators = /\^/g; +rePatternFromUrlFilter.reDanglingAsterisks = /^\*+|\*+$/g; +rePatternFromUrlFilter.reAsterisks = /\*+/g; +rePatternFromUrlFilter.restrHostnameAnchor1 = '^[a-z-]+://(?:[^/?#]+\\.)?'; +rePatternFromUrlFilter.restrHostnameAnchor2 = '^[a-z-]+://(?:[^/?#]+)?'; + +/******************************************************************************/ + +async function fetchList(assetDetails) { // Remember fetched URLs const fetchedURLs = new Set(); @@ -184,30 +257,33 @@ continue; } fetchedURLs.add(part.url); + if ( + assetDetails.trusted || + part.url.startsWith('https://ublockorigin.github.io/uAssets/filters/') + ) { + newParts.push(`!#trusted on ${secret}`); + } newParts.push( - fetchList(part.url, cacheDir).then(details => { - const { url } = details; + fetchText(part.url, cacheDir).then(details => { + const { url, error } = details; + if ( error !== undefined ) { return details; } const content = details.content.trim(); - if ( typeof content === 'string' && content !== '' ) { - if ( - content.startsWith('<') === false || - content.endsWith('>') === false - ) { - return { url, content }; - } + if ( /* content === '' || */ /^<.*>$/.test(content) ) { + return { url, error: `Bad content: ${url}` }; } - log(`No valid content for ${details.name}`); - return { url, content: '' }; + return { url, content }; }) ); + newParts.push(`!#trusted off ${secret}`); } + if ( parts.some(v => typeof v === 'object' && v.error) ) { return; } parts = await Promise.all(newParts); - parts = StaticFilteringParser.utils.preparser.expandIncludes(parts, env); + parts = sfp.utils.preparser.expandIncludes(parts, env); } const text = parts.join('\n'); if ( text === '' ) { - log('No filterset found'); + log('No filterset found', false); } return text; } @@ -221,29 +297,99 @@ rule.condition !== undefined && rule.condition.regexFilter !== undefined; -const isRedirect = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.extensionPath !== undefined; +const isGood = rule => + isUnsupported(rule) === false && + /^(allow|block|redirect|modifyHeaders|allowAllRequests)$/.test(rule.action?.type); -const isCsp = rule => +const isURLSkip = rule => + isUnsupported(rule) === false && rule.action !== undefined && - rule.action.type === 'modifyHeaders'; + rule.action.type === 'urlskip'; -const isRemoveparam = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.transform !== undefined; +/******************************************************************************/ -const isGood = rule => - isUnsupported(rule) === false && - isRedirect(rule) === false && - isCsp(rule) === false && - isRemoveparam(rule) === false; +async function patchRuleset(ruleset) { + return import(`./${platform}/patch-ruleset.js`).then(module => { + return module.patchRuleset(ruleset) + }).catch(( ) => { + return ruleset; + }); +} /******************************************************************************/ -async function processNetworkFilters(assetDetails, network) { +// Two distinct hostnames: +// www.example.com +// example.com +// Can be reduced to a single one: +// example.com +// Since if example.com matches, then www.example.com (or any other subdomain +// of example.com) will always match. + +function pruneHostnameArray(hostnames) { + const rootMap = new Map(); + for ( const hostname of hostnames ) { + const labels = hostname.split('.'); + let currentMap = rootMap; + let i = labels.length; + while ( i-- ) { + const label = labels[i]; + let nextMap = currentMap.get(label); + if ( nextMap === null ) { break; } + if ( nextMap === undefined ) { + if ( i === 0 ) { + currentMap.set(label, (nextMap = null)); + } else { + currentMap.set(label, (nextMap = new Map())); + } + } else if ( i === 0 ) { + currentMap.set(label, null); + } + currentMap = nextMap; + } + } + const assemble = (currentMap, currentHostname, out) => { + for ( const [ label, nextMap ] of currentMap ) { + const nextHostname = currentHostname === '' + ? label + : `${label}.${currentHostname}`; + if ( nextMap === null ) { + out.push(nextHostname); + } else { + assemble(nextMap, nextHostname, out); + } + } + return out; + }; + return assemble(rootMap, '', []); +} + +/******************************************************************************* + * + * For large rulesets, one rule per line for compromise between size and + * readability. This also means that the number of lines in resulting file + * representative of the number of rules in the ruleset. + * + * */ + +function toJSONRuleset(ruleset) { + const nodupProps = [ 'domains', 'excludedDomains', 'requestDomains', 'excludedRequestDomains', 'initiatorDomains', 'excludedInitiatorDomains' ]; + for ( const { condition } of ruleset ) { + if ( condition === undefined ) { continue; } + for ( const prop of nodupProps ) { + if ( condition[prop] === undefined ) { continue; } + condition[prop] = Array.from(new Set(condition[prop])); + } + } + const sortProps = [ 'requestDomains', 'initiatorDomains', 'domains' ]; + ruleset.sort((a, b) => { + let aLen = 0, bLen = 0; + for ( const prop of sortProps ) { + aLen += a.condition[prop]?.length ?? 0; + bLen += b.condition[prop]?.length ?? 0; + } + return bLen - aLen; + }); const replacer = (k, v) => { if ( k.startsWith('_') ) { return; } if ( Array.isArray(v) ) { @@ -258,43 +404,182 @@ } return v; }; + const indent = ruleset.length > 10 ? undefined : 1; + const out = []; + let id = 1; + for ( const rule of ruleset ) { + rule.id = id++; + out.push(JSON.stringify(rule, replacer, indent)); + } + return `[\n${out.join(',\n')}\n]\n`; +} + +/******************************************************************************/ +function toStrictBlockRule(rule, out) { + if ( rule.action.type !== 'block' ) { return; } + const { condition } = rule; + if ( condition === undefined ) { return; } + if ( condition.domainType ) { return; } + if ( condition.excludedResourceTypes ) { return; } + if ( condition.requestMethods ) { return; } + if ( condition.excludedRequestMethods ) { return; } + if ( condition.responseHeaders ) { return; } + if ( condition.excludedResponseHeaders ) { return; } + if ( condition.initiatorDomains ) { return; } + if ( condition.excludedInitiatorDomains ) { return; } + const { resourceTypes } = condition; + if ( resourceTypes === undefined ) { + if ( condition.requestDomains === undefined ) { return; } + } else if ( resourceTypes.includes('main_frame') === false ) { + return; + } + let regexFilter; + if ( condition.urlFilter ) { + regexFilter = rePatternFromUrlFilter(condition.urlFilter); + } else if ( condition.regexFilter ) { + regexFilter = condition.regexFilter; + } else { + regexFilter = '^https?://.*'; + } + if ( regexFilter.startsWith('^') === false ) { + regexFilter = `^.*${regexFilter}`; + } + if ( + regexFilter.endsWith('$') === false && + regexFilter.endsWith('.*') === false && + regexFilter.endsWith('.+') === false + ) { + regexFilter = `${regexFilter}.*`; + } + const strictBlockRule = out.get(regexFilter) || { + action: { + type: 'redirect', + redirect: { + regexSubstitution: `/strictblock.html#\\0`, + }, + }, + condition: { + regexFilter, + resourceTypes: [ 'main_frame' ], + }, + priority: 29, + }; + if ( condition.requestDomains ) { + strictBlockRule.condition.requestDomains ??= []; + strictBlockRule.condition.requestDomains = Array.from( + new Set([ + ...strictBlockRule.condition.requestDomains, + ...condition.requestDomains, + ]) + ); + } + if ( condition.excludedRequestDomains ) { + strictBlockRule.condition.excludedRequestDomains ??= []; + strictBlockRule.condition.excludedRequestDomains = Array.from( + new Set([ + ...strictBlockRule.condition.excludedRequestDomains, + ...condition.excludedRequestDomains, + ]) + ); + } + out.set(regexFilter, strictBlockRule); +} +toStrictBlockRule.ruleId = 1; + +/******************************************************************************/ + +async function processNetworkFilters(assetDetails, network) { const { ruleset: rules } = network; log(`Input filter count: ${network.filterCount}`); log(`\tAccepted filter count: ${network.acceptedFilterCount}`); log(`\tRejected filter count: ${network.rejectedFilterCount}`); log(`Output rule count: ${rules.length}`); - const plainGood = rules.filter(rule => isGood(rule) && isRegex(rule) === false); - log(`\tPlain good: ${plainGood.length}`); + // Minimize requestDomains arrays + for ( const rule of rules ) { + const condition = rule.condition; + if ( condition === undefined ) { continue; } + const requestDomains = condition.requestDomains; + if ( requestDomains === undefined ) { continue; } + const beforeCount = requestDomains.length; + condition.requestDomains = pruneHostnameArray(requestDomains); + const afterCount = condition.requestDomains.length; + if ( afterCount !== beforeCount ) { + log(`\tPruning requestDomains: from ${beforeCount} to ${afterCount}`); + } + } + + // Add native DNR ruleset if present + if ( assetDetails.dnrURL ) { + const result = await fetchText(assetDetails.dnrURL, cacheDir); + for ( const rule of JSON.parse(result.content) ) { + rules.push(rule); + } + } - const regexes = rules.filter(rule => isGood(rule) && isRegex(rule)); - log(`\tMaybe good (regexes): ${regexes.length}`); + const staticRules = await patchRuleset( + rules.filter(rule => isGood(rule) && isRegex(rule) === false) + ); + log(`\tStatic rules: ${staticRules.length}`); + log(staticRules + .filter(rule => Array.isArray(rule._warning)) + .map(rule => rule._warning.map(v => `\t\t${v}`)) + .join('\n'), true + ); - const redirects = rules.filter(rule => - isUnsupported(rule) === false && - isRedirect(rule) + const regexRules = await patchRuleset( + rules.filter(rule => isGood(rule) && isRegex(rule)) ); - redirects.forEach(rule => { + log(`\tMaybe good (regexes): ${regexRules.length}`); + + staticRules.forEach(rule => { + if ( rule.action.redirect?.extensionPath === undefined ) { return; } requiredRedirectResources.add( rule.action.redirect.extensionPath.replace(/^\/+/, '') ); }); - log(`\tredirect=: ${redirects.length}`); - const removeparamsGood = rules.filter(rule => - isUnsupported(rule) === false && isRemoveparam(rule) - ); - const removeparamsBad = rules.filter(rule => - isUnsupported(rule) && isRemoveparam(rule) - ); - log(`\tremoveparams= (accepted/discarded): ${removeparamsGood.length}/${removeparamsBad.length}`); - - const csps = rules.filter(rule => - isUnsupported(rule) === false && - isCsp(rule) - ); - log(`\tcsp=: ${csps.length}`); + const urlskips = new Map(); + for ( const rule of rules ) { + if ( isURLSkip(rule) === false ) { continue; } + if ( rule.__modifierAction !== 0 ) { continue; } + const { condition } = rule; + if ( condition.resourceTypes ) { + if ( condition.resourceTypes.includes('main_frame') === false ) { + continue; + } + } + const { urlFilter, regexFilter, requestDomains } = condition; + let re; + if ( urlFilter !== undefined ) { + re = rePatternFromUrlFilter(urlFilter); + } else if ( regexFilter !== undefined ) { + re = regexFilter; + } else { + re = '^'; + } + const rawSteps = rule.__modifierValue; + const steps = rawSteps.includes(' ') && rawSteps.split(/ +/) || [ rawSteps ]; + const keyEntry = { + re, + c: condition.isUrlFilterCaseSensitive, + steps, + } + const key = JSON.stringify(keyEntry); + let actualEntry = urlskips.get(key); + if ( actualEntry === undefined ) { + urlskips.set(key, keyEntry); + actualEntry = keyEntry; + } + if ( requestDomains !== undefined ) { + if ( actualEntry.hostnames === undefined ) { + actualEntry.hostnames = []; + } + actualEntry.hostnames.push(...requestDomains); + } + } + log(`\turlskip=: ${urlskips.size}`); const bad = rules.filter(rule => isUnsupported(rule) @@ -302,48 +587,40 @@ log(`\tUnsupported: ${bad.length}`); log(bad.map(rule => rule._error.map(v => `\t\t${v}`)).join('\n'), true); - writeFile( - `${rulesetDir}/main/${assetDetails.id}.json`, - `${JSON.stringify(plainGood, replacer, 1)}\n` + writeFile(`${rulesetDir}/main/${assetDetails.id}.json`, + toJSONRuleset(staticRules) ); - if ( regexes.length !== 0 ) { - writeFile( - `${rulesetDir}/regex/${assetDetails.id}.json`, - `${JSON.stringify(regexes, replacer, 1)}\n` + if ( regexRules.length !== 0 ) { + writeFile(`${rulesetDir}/regex/${assetDetails.id}.json`, + toJSONRuleset(regexRules) ); } - if ( removeparamsGood.length !== 0 ) { - writeFile( - `${rulesetDir}/removeparam/${assetDetails.id}.json`, - `${JSON.stringify(removeparamsGood, replacer, 1)}\n` + const strictBlocked = new Map(); + for ( const rule of staticRules ) { + toStrictBlockRule(rule, strictBlocked); + } + if ( strictBlocked.size !== 0 ) { + mergeRules(strictBlocked, 'requestDomains'); + writeFile(`${rulesetDir}/strictblock/${assetDetails.id}.json`, + toJSONRuleset(Array.from(strictBlocked.values())) ); } - if ( redirects.length !== 0 ) { - writeFile( - `${rulesetDir}/redirect/${assetDetails.id}.json`, - `${JSON.stringify(redirects, replacer, 1)}\n` - ); - } - - if ( csps.length !== 0 ) { - writeFile( - `${rulesetDir}/csp/${assetDetails.id}.json`, - `${JSON.stringify(csps, replacer, 1)}\n` + if ( urlskips.size !== 0 ) { + writeFile(`${rulesetDir}/urlskip/${assetDetails.id}.json`, + JSON.stringify(Array.from(urlskips.values()), null, 1) ); } return { total: rules.length, - plain: plainGood.length, - discarded: removeparamsBad.length, + plain: staticRules.length, rejected: bad.length, - regex: regexes.length, - removeparam: removeparamsGood.length, - redirect: redirects.length, - csp: csps.length, + regex: regexRules.length, + strictblock: strictBlocked.size, + urlskip: urlskips.size, }; } @@ -355,7 +632,6 @@ // Load all available scriptlets into a key-val map, where the key is the // scriptlet token, and val is the whole content of the file. -const scriptletDealiasingMap = new Map(); let scriptletsMapPromise; function loadAllSourceScriptlets() { @@ -364,28 +640,21 @@ } scriptletsMapPromise = fs.readdir('./scriptlets').then(files => { - const reScriptletNameOrAlias = /^\/\/\/\s+(?:name|alias)\s+(\S+)/gm; + const readTemplateFile = file => + fs.readFile(`./scriptlets/${file}`, { encoding: 'utf8' }) + .then(text => ({ file, text })); const readPromises = []; for ( const file of files ) { - readPromises.push( - fs.readFile(`./scriptlets/${file}`, { encoding: 'utf8' }) - ); + readPromises.push(readTemplateFile(file)); } return Promise.all(readPromises).then(results => { const originalScriptletMap = new Map(); - for ( const text of results ) { - const aliasSet = new Set(); - for (;;) { - const match = reScriptletNameOrAlias.exec(text); - if ( match === null ) { break; } - aliasSet.add(match[1]); - } - if ( aliasSet.size === 0 ) { continue; } - const aliases = Array.from(aliasSet); - originalScriptletMap.set(aliases[0], text); - for ( let i = 0; i < aliases.length; i++ ) { - scriptletDealiasingMap.set(aliases[i], aliases[0]); - } + for ( const details of results ) { + originalScriptletMap.set( + details.file.replace('.template.js', '') + .replace('.template.css', ''), + details.text + ); } return originalScriptletMap; }); @@ -396,73 +665,151 @@ /******************************************************************************/ -const globalPatchedScriptletsSet = new Set(); +// http://www.cse.yorku.ca/~oz/hash.html#djb2 +// Must mirror content script surveyor's version -function addScriptingAPIResources(id, hostnames, fid) { - if ( hostnames === undefined ) { return; } - for ( const hn of hostnames ) { - let hostnamesToFidMap = specificDetails.get(id); - if ( hostnamesToFidMap === undefined ) { - hostnamesToFidMap = new Map(); - specificDetails.set(id, hostnamesToFidMap); - } - let fids = hostnamesToFidMap.get(hn); - if ( fids === undefined ) { - hostnamesToFidMap.set(hn, fid); - } else if ( fids instanceof Set ) { - fids.add(fid); - } else if ( fid !== fids ) { - fids = new Set([ fids, fid ]); - hostnamesToFidMap.set(hn, fids); +async function processGenericCosmeticFilters( + assetDetails, + selectorList, + exceptionList, + declarativeMap +) { + const exceptionSet = new Set( + exceptionList && + exceptionList.filter(a => a.key !== undefined).map(a => a.selector) + ); + + const genericSelectorMap = new Map(); + if ( selectorList ) { + for ( const { key, selector } of selectorList ) { + if ( key === undefined ) { continue; } + if ( exceptionSet.has(selector) ) { continue; } + const type = key.charCodeAt(0); + const hash = hashFromStr(type, key.slice(1)); + const selectors = genericSelectorMap.get(hash); + if ( selectors === undefined ) { + genericSelectorMap.set(hash, selector) + } else { + genericSelectorMap.set(hash, `${selectors},\n${selector}`) + } + } + } + + // Specific exceptions + const genericExceptionSieve = new Set(); + const genericExceptionMap = new Map(); + if ( declarativeMap ) { + for ( const [ exception, details ] of declarativeMap ) { + if ( details.rejected ) { continue; } + if ( details.key === undefined ) { continue; } + if ( details.matches !== undefined ) { continue; } + if ( details.excludeMatches === undefined ) { continue; } + const type = details.key.charCodeAt(0); + const hash = hashFromStr(type, details.key.slice(1)); + genericExceptionSieve.add(hash); + for ( const hn of details.excludeMatches ) { + const exceptions = genericExceptionMap.get(hn); + if ( exceptions === undefined ) { + genericExceptionMap.set(hn, exception); + } else { + genericExceptionMap.set(hn, `${exceptions}\n${exception}`); + } + } } } -} -const toCSSSpecific = s => (uidint32(s) & ~0b11) | 0b00; + if ( genericSelectorMap.size === 0 ) { + if ( genericExceptionMap.size === 0 ) { return 0; } + } -const pathFromFileName = fname => `${fname.slice(-1)}/${fname.slice(0,-1)}.js`; + const originalScriptletMap = await loadAllSourceScriptlets(); + let patchedScriptlet = originalScriptletMap.get('css-generic').replace( + '$rulesetId$', + assetDetails.id + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$genericSelectorMap\$/, + `${JSON.stringify(genericSelectorMap, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$genericExceptionSieve\$/, + `${JSON.stringify(genericExceptionSieve, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$genericExceptionMap\$/, + `${JSON.stringify(genericExceptionMap, scriptletJsonReplacer)}` + ); -/******************************************************************************/ + writeFile(`${scriptletDir}/generic/${assetDetails.id}.js`, + patchedScriptlet + ); -async function processGenericCosmeticFilters(assetDetails, bucketsMap, exclusions) { - const out = { - count: 0, - exclusionCount: 0, - }; - if ( bucketsMap === undefined ) { return out; } - if ( bucketsMap.size === 0 ) { return out; } - const bucketsList = Array.from(bucketsMap); - const count = bucketsList.reduce((a, v) => a += v[1].length, 0); - if ( count === 0 ) { return out; } - out.count = count; + log(`CSS-generic: ${genericExceptionSieve.size} specific CSS exceptions`); + log(`CSS-generic: ${genericSelectorMap.size} plain CSS selectors`); - const selectorLists = bucketsList.map(v => [ v[0], v[1].join(',') ]); + return genericSelectorMap.size + genericExceptionSieve.size; +} + +const hashFromStr = (type, s) => { + const len = s.length; + const step = len + 7 >>> 3; + let hash = (type << 5) + type ^ len; + for ( let i = 0; i < len; i += step ) { + hash = (hash << 5) + hash ^ s.charCodeAt(i); + } + return hash & 0xFFF; +}; + +/******************************************************************************/ + +async function processGenericHighCosmeticFilters( + assetDetails, + genericSelectorList, + genericExceptionList +) { + if ( genericSelectorList === undefined ) { return 0; } + const genericSelectorSet = new Set( + genericSelectorList + .filter(a => a.key === undefined) + .map(a => a.selector) + ); + // https://github.com/uBlockOrigin/uBOL-home/issues/365 + if ( genericExceptionList ) { + for ( const entry of genericExceptionList ) { + if ( entry.key !== undefined ) { continue; } + globalHighlyGenericExceptionSet.add(entry.selector); + } + } + for ( const selector of globalHighlyGenericExceptionSet ) { + if ( genericSelectorSet.has(selector) === false ) { continue; } + genericSelectorSet.delete(selector); + log(`\tRemoving excepted highly generic filter ##${selector}`); + } + if ( genericSelectorSet.size === 0 ) { return 0; } + const selectorLists = Array.from(genericSelectorSet).sort().join(',\n'); const originalScriptletMap = await loadAllSourceScriptlets(); - const patchedScriptlet = originalScriptletMap.get('css-generic') - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$genericSelectorMap\$/m, - `${JSON.stringify(selectorLists, scriptletJsonReplacer)}` - ); + let patchedScriptlet = originalScriptletMap.get('css-generichigh').replace( + '$rulesetId$', + assetDetails.id + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\$selectorList\$/, + selectorLists + ); - writeFile( - `${scriptletDir}/generic/${assetDetails.id}.js`, + writeFile(`${scriptletDir}/generichigh/${assetDetails.id}.css`, patchedScriptlet ); - genericDetails.set(assetDetails.id, exclusions.sort()); - - log(`CSS-generic: ${count} plain CSS selectors`); + log(`CSS-generic-high: ${genericSelectorSet.size} plain CSS selectors`); - return out; + return genericSelectorSet.size; } -/******************************************************************************/ +const globalHighlyGenericExceptionSet = new Set(); -const MAX_COSMETIC_FILTERS_PER_FILE = 256; +/******************************************************************************/ // This merges selectors which are used by the same hostnames @@ -522,14 +869,10 @@ const out = Array.from(contentMap).map(a => [ a[0], { a: a[1].a, - y: a[1].y ? Array.from(a[1].y).sort(hnSort) : undefined, + y: a[1].y ? Array.from(a[1].y) : undefined, n: a[1].n ? Array.from(a[1].n) : undefined, } - ]).sort((a, b) => { - const ha = Array.isArray(a[1].y) ? a[1].y[0] : '*'; - const hb = Array.isArray(b[1].y) ? b[1].y[0] : '*'; - return hnSort(ha, hb); - }); + ]); return out; } @@ -561,72 +904,44 @@ /******************************************************************************/ function argsMap2List(argsMap, hostnamesMap) { - const argsList = []; + const argsList = [ '' ]; const indexMap = new Map(); for ( const [ id, details ] of argsMap ) { indexMap.set(id, argsList.length); argsList.push(details); } + const argsSeqs = [ 0 ]; + const argsSeqsIndices = new Map(); for ( const [ hn, ids ] of hostnamesMap ) { + const seqKey = JSON.stringify(ids); + if ( argsSeqsIndices.has(seqKey) ) { + hostnamesMap.set(hn, argsSeqsIndices.get(seqKey)); + continue; + } + const seqIndex = argsSeqs.length; + argsSeqsIndices.set(seqKey, seqIndex); + hostnamesMap.set(hn, seqIndex); if ( typeof ids === 'number' ) { - hostnamesMap.set(hn, indexMap.get(ids)); + argsSeqs.push(indexMap.get(ids)); continue; } for ( let i = 0; i < ids.length; i++ ) { - ids[i] = indexMap.get(ids[i]); + argsSeqs.push(-indexMap.get(ids[i])); } + argsSeqs[argsSeqs.length-1] = -argsSeqs[argsSeqs.length-1]; } - return argsList; -} - -/******************************************************************************/ - -function splitDomainAndEntity(mapin) { - const domainBased = new Map(); - const entityBased = new Map(); - for ( const [ selector, domainDetails ] of mapin ) { - domainBased.set(selector, domainDetails); - if ( domainDetails.rejected ) { continue; } - if ( Array.isArray(domainDetails.matches) === false ) { continue; } - const domainMatches = []; - const entityMatches = []; - for ( const hn of domainDetails.matches ) { - if ( hn.endsWith('.*') ) { - entityMatches.push(hn.slice(0, -2)); - } else { - domainMatches.push(hn); - } - } - if ( entityMatches.length === 0 ) { continue; } - if ( domainMatches.length !== 0 ) { - domainDetails.matches = domainMatches; - } else { - domainBased.delete(selector); - } - const entityDetails = { - matches: entityMatches, - }; - if ( Array.isArray(domainDetails.excludeMatches) ) { - entityDetails.excludeMatches = domainDetails.excludeMatches.slice(); - } - entityBased.set(selector, entityDetails); - } - return { domainBased, entityBased }; + return { argsList, argsSeqs }; } /******************************************************************************/ async function processCosmeticFilters(assetDetails, mapin) { - if ( mapin === undefined ) { return; } + if ( mapin === undefined ) { return 0; } + if ( mapin.size === 0 ) { return 0; } - const { domainBased, entityBased } = splitDomainAndEntity(mapin); - const entityBasedEntries = groupHostnamesBySelectors( - groupSelectorsByHostnames(entityBased) - ); const domainBasedEntries = groupHostnamesBySelectors( - groupSelectorsByHostnames(domainBased) + groupSelectorsByHostnames(mapin) ); - // We do not want more than n CSS files per subscription, so we will // group multiple unrelated selectors in the same file, and distinct // css declarations will be injected programmatically according to the @@ -635,161 +950,56 @@ // The cosmetic filters will be injected programmatically as content // script and the decisions to activate the cosmetic filters will be // done at injection time according to the document's hostname. - const originalScriptletMap = await loadAllSourceScriptlets(); const generatedFiles = []; - for ( let i = 0; i < domainBasedEntries.length; i += MAX_COSMETIC_FILTERS_PER_FILE ) { - const slice = domainBasedEntries.slice(i, i + MAX_COSMETIC_FILTERS_PER_FILE); - const argsMap = slice.map(entry => [ - entry[0], - { - a: entry[1].a ? entry[1].a.join(',\n') : undefined, - n: entry[1].n - } - ]); - const hostnamesMap = new Map(); - for ( const [ id, details ] of slice ) { - if ( details.y === undefined ) { continue; } - scriptletHostnameToIdMap(details.y, id, hostnamesMap); - } - const argsList = argsMap2List(argsMap, hostnamesMap); - const patchedScriptlet = originalScriptletMap.get('css-specific') - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$hostnamesMap\$/m, - `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` - ); - const fid = toCSSSpecific(patchedScriptlet); - if ( globalPatchedScriptletsSet.has(fid) === false ) { - globalPatchedScriptletsSet.add(fid); - const fname = fnameFromFileId(fid); - writeFile(`${scriptletDir}/specific/${pathFromFileName(fname)}`, patchedScriptlet); - generatedFiles.push(fname); - } - for ( const entry of slice ) { - addScriptingAPIResources(assetDetails.id, entry[1].y, fid); - } - } - - // For entity-based entries, we generate a single scriptlet which will be - // injected only in Complete mode. - if ( entityBasedEntries.length !== 0 ) { - const argsMap = entityBasedEntries.map(entry => [ - entry[0], - { - a: entry[1].a ? entry[1].a.join(',') : undefined, - n: entry[1].n, - } - ]); - const entitiesMap = new Map(); - for ( const [ id, details ] of entityBasedEntries ) { - if ( details.y === undefined ) { continue; } - scriptletHostnameToIdMap(details.y, id, entitiesMap); - } - const argsList = argsMap2List(argsMap, entitiesMap); - const patchedScriptlet = originalScriptletMap.get('css-specific.entity') - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$entitiesMap\$/m, - `${JSON.stringify(entitiesMap, scriptletJsonReplacer)}` - ); - const fname = `${assetDetails.id}`; - writeFile(`${scriptletDir}/specific-entity/${fname}.js`, patchedScriptlet); - generatedFiles.push(fname); - } - - if ( generatedFiles.length !== 0 ) { - log(`CSS-specific domain-based: ${domainBased.size} distinct filters`); - log(`\tCombined into ${domainBasedEntries.length} distinct entries`); - log(`CSS-specific entity-based: ${entityBased.size} distinct filters`); - log(`\tCombined into ${entityBasedEntries.length} distinct entries`); - log(`CSS-specific injectable files: ${generatedFiles.length}`); - log(`\t${generatedFiles.join(', ')}`); - } - - return { - domainBased: domainBasedEntries.length, - entityBased: entityBasedEntries.length, - }; -} - -/******************************************************************************/ - -async function processDeclarativeCosmeticFilters(assetDetails, mapin) { - if ( mapin === undefined ) { return 0; } - if ( mapin.size === 0 ) { return 0; } - - // Distinguish declarative-compiled-as-procedural from actual procedural. - const declaratives = new Map(); - mapin.forEach((details, jsonSelector) => { - const selector = JSON.parse(jsonSelector); - if ( selector.cssable !== true ) { return; } - declaratives.set(jsonSelector, details); - }); - if ( declaratives.size === 0 ) { return 0; } - - const contentArray = groupHostnamesBySelectors( - groupSelectorsByHostnames(declaratives) - ); - - const argsMap = contentArray.map(entry => [ + const argsMap = domainBasedEntries.map(entry => [ entry[0], - { - a: entry[1].a, - n: entry[1].n, - } + entry[1].a ? entry[1].a.join('\n') : undefined, ]); const hostnamesMap = new Map(); - for ( const [ id, details ] of contentArray ) { - if ( details.y === undefined ) { continue; } - scriptletHostnameToIdMap(details.y, id, hostnamesMap); - } - - const argsList = argsMap2List(argsMap, hostnamesMap); - const originalScriptletMap = await loadAllSourceScriptlets(); - const patchedScriptlet = originalScriptletMap.get('css-declarative') - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$hostnamesMap\$/m, - `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` - ); - writeFile(`${scriptletDir}/declarative/${assetDetails.id}.js`, patchedScriptlet); - - { - const hostnames = new Set(); - for ( const entry of contentArray ) { - if ( Array.isArray(entry[1].y) === false ) { continue; } - for ( const hn of entry[1].y ) { - hostnames.add(hn); - } + let hasEntities = false; + for ( const [ id, details ] of domainBasedEntries ) { + if ( details.y ) { + scriptletHostnameToIdMap(details.y, id, hostnamesMap); + hasEntities ||= details.y.some(a => a.endsWith('.*')); } - if ( hostnames.has('*') ) { - hostnames.clear(); - hostnames.add('*'); + if ( details.n ) { + scriptletHostnameToIdMap(details.n.map(a => `~${a}`), id, hostnamesMap); + hasEntities ||= details.n.some(a => a.endsWith('.*')); } - declarativeDetails.set(assetDetails.id, Array.from(hostnames).sort()); } + const { argsList, argsSeqs } = argsMap2List(argsMap, hostnamesMap); - if ( contentArray.length !== 0 ) { - log(`Declarative-related distinct filters: ${contentArray.length} distinct combined selectors`); + const originalScriptletMap = await loadAllSourceScriptlets(); + let patchedScriptlet = originalScriptletMap.get('css-specific').replace( + '$rulesetId$', + assetDetails.id + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$argsList\$/, + `${JSON.stringify(argsList, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$argsSeqs\$/, + `${JSON.stringify(argsSeqs, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$hostnamesMap\$/, + `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + 'self.$hasEntities$', + JSON.stringify(hasEntities) + ); + writeFile(`${scriptletDir}/specific/${assetDetails.id}.js`, patchedScriptlet); + generatedFiles.push(`${assetDetails.id}`); + + if ( generatedFiles.length !== 0 ) { + log(`CSS-specific: ${mapin.size} distinct filters`); + log(`\tCombined into ${hostnamesMap.size} distinct hostnames`); } - return contentArray.length; + return hostnamesMap.size; } /******************************************************************************/ @@ -798,11 +1008,8 @@ if ( mapin === undefined ) { return 0; } if ( mapin.size === 0 ) { return 0; } - // Distinguish declarative-compiled-as-procedural from actual procedural. const procedurals = new Map(); mapin.forEach((details, jsonSelector) => { - const selector = JSON.parse(jsonSelector); - if ( selector.cssable ) { return; } procedurals.set(jsonSelector, details); }); if ( procedurals.size === 0 ) { return 0; } @@ -813,314 +1020,81 @@ const argsMap = contentArray.map(entry => [ entry[0], - { - a: entry[1].a, - n: entry[1].n, - } + entry[1].a, ]); const hostnamesMap = new Map(); + let hasEntities = false; for ( const [ id, details ] of contentArray ) { - if ( details.y === undefined ) { continue; } - scriptletHostnameToIdMap(details.y, id, hostnamesMap); - } - - const argsList = argsMap2List(argsMap, hostnamesMap); - const originalScriptletMap = await loadAllSourceScriptlets(); - const patchedScriptlet = originalScriptletMap.get('css-procedural') - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$hostnamesMap\$/m, - `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` - ); - writeFile(`${scriptletDir}/procedural/${assetDetails.id}.js`, patchedScriptlet); - - { - const hostnames = new Set(); - for ( const entry of contentArray ) { - if ( Array.isArray(entry[1].y) === false ) { continue; } - for ( const hn of entry[1].y ) { - hostnames.add(hn); - } - } - if ( hostnames.has('*') ) { - hostnames.clear(); - hostnames.add('*'); - } - proceduralDetails.set(assetDetails.id, Array.from(hostnames).sort()); - } - - if ( contentArray.length !== 0 ) { - log(`Procedural-related distinct filters: ${contentArray.length} distinct combined selectors`); - } - - return contentArray.length; -} - -/******************************************************************************/ - -async function processScriptletFilters(assetDetails, mapin) { - if ( mapin === undefined ) { return; } - - const { domainBased, entityBased } = splitDomainAndEntity(mapin); - - // Load all available scriptlets into a key-val map, where the key is the - // scriptlet token, and val is the whole content of the file. - const originalScriptletMap = await loadAllSourceScriptlets(); - - let domainBasedTokens; - if ( domainBased.size !== 0 ) { - domainBasedTokens = await processDomainScriptletFilters(assetDetails, domainBased, originalScriptletMap); - } - let entityBasedTokens; - if ( entityBased.size !== 0 ) { - entityBasedTokens = await processEntityScriptletFilters(assetDetails, entityBased, originalScriptletMap); - } - - return { domainBasedTokens, entityBasedTokens }; -} - -/******************************************************************************/ - -const parseScriptletArguments = raw => { - const out = []; - let s = raw; - let len = s.length; - let beg = 0, pos = 0; - let i = 1; - while ( beg < len ) { - pos = s.indexOf(',', pos); - // Escaped comma? If so, skip. - if ( pos > 0 && s.charCodeAt(pos - 1) === 0x5C /* '\\' */ ) { - s = s.slice(0, pos - 1) + s.slice(pos); - len -= 1; - continue; - } - if ( pos === -1 ) { pos = len; } - out.push(s.slice(beg, pos).trim()); - beg = pos = pos + 1; - i++; - } - return out; -}; - -const parseScriptletFilter = (raw, scriptletMap, tokenSuffix = '') => { - const filter = raw.slice(4, -1); - const end = filter.length; - let pos = filter.indexOf(','); - if ( pos === -1 ) { pos = end; } - const parts = filter.trim().split(',').map(s => s.trim()); - const token = scriptletDealiasingMap.get(parts[0]) || ''; - if ( token === '' ) { return; } - if ( scriptletMap.has(`${token}${tokenSuffix}`) === false ) { return; } - return { - token, - args: parseScriptletArguments(parts.slice(1).join(',').trim()), - }; -}; - -/******************************************************************************/ - -async function processDomainScriptletFilters(assetDetails, domainBased, originalScriptletMap) { - // For each instance of distinct scriptlet, we will collect distinct - // instances of arguments, and for each distinct set of argument, we - // will collect the set of hostnames for which the scriptlet/args is meant - // to execute. This will allow us a single content script file and the - // scriptlets execution will depend on hostname testing against the - // URL of the document at scriptlet execution time. In the end, we - // should have no more generated content script per subscription than the - // number of distinct source scriptlets. - const scriptletDetails = new Map(); - const rejectedFilters = []; - for ( const [ rawFilter, entry ] of domainBased ) { - if ( entry.rejected ) { - rejectedFilters.push(rawFilter); - continue; - } - const normalized = parseScriptletFilter(rawFilter, originalScriptletMap); - if ( normalized === undefined ) { - log(`Discarded unsupported scriptlet filter: ${rawFilter}`, true); - continue; - } - let argsDetails = scriptletDetails.get(normalized.token); - if ( argsDetails === undefined ) { - argsDetails = new Map(); - scriptletDetails.set(normalized.token, argsDetails); - } - const argsHash = JSON.stringify(normalized.args); - let hostnamesDetails = argsDetails.get(argsHash); - if ( hostnamesDetails === undefined ) { - hostnamesDetails = { - a: normalized.args, - y: new Set(), - n: new Set(), - }; - argsDetails.set(argsHash, hostnamesDetails); - } - if ( entry.matches ) { - for ( const hn of entry.matches ) { - hostnamesDetails.y.add(hn); - } + if ( details.y ) { + scriptletHostnameToIdMap(details.y, id, hostnamesMap); + hasEntities ||= details.y.some(a => a.endsWith('.*')); } - if ( entry.excludeMatches ) { - for ( const hn of entry.excludeMatches ) { - hostnamesDetails.n.add(hn); - } + if ( details.n ) { + scriptletHostnameToIdMap(details.n.map(a => `~${a}`), id, hostnamesMap); + hasEntities ||= details.n.some(a => a.endsWith('.*')); } } - - log(`Rejected scriptlet filters: ${rejectedFilters.length}`); - log(rejectedFilters.map(line => `\t${line}`).join('\n'), true); - - const generatedFiles = []; - const tokens = []; - - for ( const [ token, argsDetails ] of scriptletDetails ) { - const argsMap = Array.from(argsDetails).map(entry => [ - uidint32(entry[0]), - { a: entry[1].a, n: entry[1].n } - ]); - const hostnamesMap = new Map(); - for ( const [ argsHash, details ] of argsDetails ) { - scriptletHostnameToIdMap(details.y, uidint32(argsHash), hostnamesMap); - } - - const argsList = argsMap2List(argsMap, hostnamesMap); - const patchedScriptlet = originalScriptletMap.get(token) - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$hostnamesMap\$/m, - `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` - ); - const fname = `${assetDetails.id}.${token}.js`; - const fpath = `${scriptletDir}/scriptlet/${fname}`; - writeFile(fpath, patchedScriptlet); - generatedFiles.push(fname); - tokens.push(token); - - const hostnameMatches = new Set(hostnamesMap.keys()); - if ( hostnameMatches.has('*') ) { - hostnameMatches.clear(); - hostnameMatches.add('*'); - } - let rulesetScriptlets = scriptletStats.get(assetDetails.id); - if ( rulesetScriptlets === undefined ) { - scriptletStats.set(assetDetails.id, rulesetScriptlets = []); + const { argsList, argsSeqs } = argsMap2List(argsMap, hostnamesMap); + const argsListAfter = []; + for ( const a of argsList ) { + const aAfter = []; + for ( let b of a ) { + aAfter.push(JSON.parse(b)); } - rulesetScriptlets.push([ token, Array.from(hostnameMatches).sort() ]); + argsListAfter.push(JSON.stringify(aAfter)); } + const originalScriptletMap = await loadAllSourceScriptlets(); + let patchedScriptlet = originalScriptletMap.get('css-procedural').replace( + '$rulesetId$', + assetDetails.id + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$argsList\$/, + `${JSON.stringify(argsListAfter, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$argsSeqs\$/, + `${JSON.stringify(argsSeqs, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + /\bself\.\$hostnamesMap\$/, + `${JSON.stringify(hostnamesMap, scriptletJsonReplacer)}` + ); + patchedScriptlet = safeReplace(patchedScriptlet, + 'self.$hasEntities$', + JSON.stringify(hasEntities) + ); + writeFile(`${scriptletDir}/procedural/${assetDetails.id}.js`, patchedScriptlet); - if ( generatedFiles.length !== 0 ) { - const scriptletFilterCount = Array.from(scriptletDetails.values()) - .reduce((a, b) => a + b.size, 0); - log(`Scriptlet-related distinct filters: ${scriptletFilterCount}`); - log(`Scriptlet-related injectable files: ${generatedFiles.length}`); - log(`\t${generatedFiles.join(', ')}`); + if ( contentArray.length !== 0 ) { + log(`Procedural-related distinct filters: ${procedurals.size} distinct combined selectors`); + log(`\tCombined into ${hostnamesMap.size} distinct hostnames`); } - return tokens; + return hostnamesMap.size; } /******************************************************************************/ -async function processEntityScriptletFilters(assetDetails, entityBased, originalScriptletMap) { - // For each instance of distinct scriptlet, we will collect distinct - // instances of arguments, and for each distinct set of argument, we - // will collect the set of hostnames for which the scriptlet/args is meant - // to execute. This will allow us a single content script file and the - // scriptlets execution will depend on hostname testing against the - // URL of the document at scriptlet execution time. In the end, we - // should have no more generated content script per subscription than the - // number of distinct source scriptlets. - const scriptletMap = new Map(); - const rejectedFilters = []; - for ( const [ rawFilter, entry ] of entityBased ) { - if ( entry.rejected ) { - rejectedFilters.push(rawFilter); - continue; - } - const normalized = parseScriptletFilter(rawFilter, originalScriptletMap, '.entity'); - if ( normalized === undefined ) { - log(`Discarded unsupported scriptlet filter: ${rawFilter}`, true); - continue; - } - let argsDetails = scriptletMap.get(normalized.token); - if ( argsDetails === undefined ) { - argsDetails = new Map(); - scriptletMap.set(normalized.token, argsDetails); - } - const argsHash = JSON.stringify(normalized.args); - let scriptletDetails = argsDetails.get(argsHash); - if ( scriptletDetails === undefined ) { - scriptletDetails = { - a: normalized.args, - y: new Set(), - n: new Set(), - }; - argsDetails.set(argsHash, scriptletDetails); - } - if ( entry.matches ) { - for ( const entity of entry.matches ) { - scriptletDetails.y.add(entity); - } - } - if ( entry.excludeMatches ) { - for ( const hn of entry.excludeMatches ) { - scriptletDetails.n.add(hn); - } - } - } - - log(`Rejected scriptlet filters: ${rejectedFilters.length}`); - log(rejectedFilters.map(line => `\t${line}`).join('\n'), true); +async function processScriptletFilters(assetDetails, mapin) { + if ( mapin === undefined ) { return 0; } + if ( mapin.size === 0 ) { return 0; } - const generatedFiles = []; - const tokens = []; + makeScriptlet.init(); - for ( const [ token, argsDetails ] of scriptletMap ) { - const argsMap = Array.from(argsDetails).map(entry => [ - uidint32(entry[0]), - { a: entry[1].a, n: entry[1].n } - ]); - const entitiesMap = new Map(); - for ( const [ argsHash, details ] of argsDetails ) { - scriptletHostnameToIdMap(details.y, uidint32(argsHash), entitiesMap); - } - - const argsList = argsMap2List(argsMap, entitiesMap); - const patchedScriptlet = originalScriptletMap.get(`${token}.entity`) - .replace( - '$rulesetId$', - assetDetails.id - ).replace( - /\bself\.\$argsList\$/m, - `${JSON.stringify(argsList, scriptletJsonReplacer)}` - ).replace( - /\bself\.\$entitiesMap\$/m, - `${JSON.stringify(entitiesMap, scriptletJsonReplacer)}` - ); - const fname = `${assetDetails.id}.${token}.js`; - const fpath = `${scriptletDir}/scriptlet-entity/${fname}`; - writeFile(fpath, patchedScriptlet); - generatedFiles.push(fname); - tokens.push(token); + for ( const details of mapin.values() ) { + makeScriptlet.compile(assetDetails, details); } - - if ( generatedFiles.length !== 0 ) { - log(`Scriptlet-related entity-based injectable files: ${generatedFiles.length}`); - log(`\t${generatedFiles.join(', ')}`); + const stats = await makeScriptlet.commit( + assetDetails.id, + `${scriptletDir}/scriptlet`, + writeFile + ); + if ( stats.length !== 0 ) { + scriptletStats.set(assetDetails.id, stats); } - - return tokens; + makeScriptlet.reset(); + return stats.length; } /******************************************************************************/ @@ -1129,12 +1103,28 @@ log('============================'); log(`Listset for '${assetDetails.id}':`); - if ( assetDetails.text === undefined ) { - const text = await fetchAsset(assetDetails); - if ( text === '' ) { return; } + if ( assetDetails.text === undefined && assetDetails.urls.length !== 0 ) { + const text = await fetchList(assetDetails); + if ( text === undefined ) { + process.exit(1); + } assetDetails.text = text; + } else { + assetDetails.text = ''; } + if ( Array.isArray(assetDetails.filters) && assetDetails.filters.length ) { + const extra = [ + `!#trusted on ${secret}`, + ...assetDetails.filters, + `!#trusted off ${secret}`, + assetDetails.text, + ]; + assetDetails.text = extra.join('\n').trim(); + } + + if ( assetDetails.text === '' ) { return; } + const extensionPaths = []; for ( const [ fname, details ] of redirectResourcesMap ) { const path = `/web_accessible_resources/${fname}`; @@ -1152,8 +1142,12 @@ const results = await dnrRulesetFromRawLists( [ { name: assetDetails.id, text: assetDetails.text } ], - { env, extensionPaths } + { env, extensionPaths, secret, networkBad } ); + networkBad = results.networkBad; + + // Release memory used by filter list content + assetDetails.text = undefined; const netStats = await processNetworkFilters( assetDetails, @@ -1175,13 +1169,6 @@ continue; } const parsed = JSON.parse(selector); - const matches = - details.matches.filter(hn => hn.endsWith('.*') === false); - if ( matches.length === 0 ) { - rejectedCosmetic.push(`Entity-based filter not supported: ${parsed.raw}`); - continue; - } - details.matches = matches; parsed.raw = undefined; proceduralCosmetic.set(JSON.stringify(parsed), details); } @@ -1191,18 +1178,41 @@ log(rejectedCosmetic.map(line => `\t${line}`).join('\n'), true); } + const genericDetailsForRuleset = {}; + if ( + Array.isArray(results.network.generichideExclusions) && + results.network.generichideExclusions.length !== 0 + ) { + genericDetailsForRuleset.unhide = results.network.generichideExclusions + .filter(hn => hn.endsWith('.*') === false) + .sort(); + } + if ( + Array.isArray(results.network.generichideInclusions) && + results.network.generichideInclusions.length !== 0 + ) { + genericDetailsForRuleset.hide = results.network.generichideInclusions + .filter(hn => hn.endsWith('.*') === false) + .sort(); + } + if ( genericDetailsForRuleset.unhide || genericDetailsForRuleset.hide ) { + genericDetails.set(assetDetails.id, genericDetailsForRuleset); + } + const genericCosmeticStats = await processGenericCosmeticFilters( assetDetails, - results.genericCosmetic, - results.network.generichideExclusions.filter(hn => hn.endsWith('.*') === false) + results.genericCosmeticFilters, + results.genericCosmeticExceptions, + declarativeCosmetic ); - const specificCosmeticStats = await processCosmeticFilters( + const genericHighCosmeticStats = await processGenericHighCosmeticFilters( assetDetails, - declarativeCosmetic + results.genericCosmeticFilters, + results.genericCosmeticExceptions, ); - const declarativeStats = await processDeclarativeCosmeticFilters( + const specificCosmeticStats = await processCosmeticFilters( assetDetails, - proceduralCosmetic + declarativeCosmetic ); const proceduralStats = await processProceduralCosmeticFilters( assetDetails, @@ -1216,8 +1226,11 @@ rulesetDetails.push({ id: assetDetails.id, name: assetDetails.name, + group: assetDetails.group, + parent: assetDetails.parent, enabled: assetDetails.enabled, lang: assetDetails.lang, + tags: assetDetails.tags, homeURL: assetDetails.homeURL, filters: { total: results.network.filterCount, @@ -1230,14 +1243,16 @@ regex: netStats.regex, removeparam: netStats.removeparam, redirect: netStats.redirect, - csp: netStats.csp, + modifyHeaders: netStats.modifyHeaders, + strictblock: netStats.strictblock, + urlskip: netStats.urlskip, discarded: netStats.discarded, rejected: netStats.rejected, }, css: { generic: genericCosmeticStats, + generichigh: genericHighCosmeticStats, specific: specificCosmeticStats, - declarative: declarativeStats, procedural: proceduralStats, }, scriptlets: scriptletStats, @@ -1254,156 +1269,41 @@ async function main() { - // Get manifest content - const manifest = await fs.readFile( - `${outputDir}/manifest.json`, - { encoding: 'utf8' } - ).then(text => - JSON.parse(text) - ); - - // Create unique version number according to build time - let version = manifest.version; + let version = ''; { const now = new Date(); - const yearPart = now.getUTCFullYear() - 2000; - const monthPart = (now.getUTCMonth() + 1) * 1000; - const dayPart = now.getUTCDate() * 10; - const hourPart = Math.floor(now.getUTCHours() / 3) + 1; - version += `.${yearPart}.${monthPart + dayPart + hourPart}`; - } - log(`Version: ${version}`); - - // Get assets.json content - const assets = await fs.readFile( - `./assets.json`, - { encoding: 'utf8' } - ).then(text => + const yearPart = now.getUTCFullYear(); + const monthPart = now.getUTCMonth() + 1; + const dayPart = now.getUTCDate(); + const hourPart = Math.floor(now.getUTCHours()); + const minutePart = Math.floor(now.getUTCMinutes()); + version = `${yearPart}.${monthPart*100+dayPart}.${hourPart*100+minutePart}`; + } + log(`Version: ${version}`, false); + + // Get list of rulesets + const rulesets = await fs.readFile('rulesets.json', { + encoding: 'utf8' + }).then(text => JSON.parse(text) ); - // Assemble all default lists as the default ruleset - const contentURLs = [ - 'https://ublockorigin.github.io/uAssets/filters/filters.txt', - 'https://ublockorigin.github.io/uAssets/filters/badware.txt', - 'https://ublockorigin.github.io/uAssets/filters/privacy.txt', - 'https://ublockorigin.github.io/uAssets/filters/resource-abuse.txt', - 'https://ublockorigin.github.io/uAssets/filters/unbreak.txt', - 'https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt', - 'https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt', - 'https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt', - 'https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt', - 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext', - ]; - await rulesetFromURLs({ - id: 'default', - name: 'Ads, trackers, miners, and more' , - enabled: true, - urls: contentURLs, - homeURL: 'https://github.com/uBlockOrigin/uAssets', - }); - - // Regional rulesets - const excludedLists = [ - 'ara-0', - 'EST-0', - ]; - // Merge lists which have same target languages - const langToListsMap = new Map(); - for ( const [ id, asset ] of Object.entries(assets) ) { - if ( asset.content !== 'filters' ) { continue; } - if ( asset.off !== true ) { continue; } - if ( typeof asset.lang !== 'string' ) { continue; } - if ( excludedLists.includes(id) ) { continue; } - let ids = langToListsMap.get(asset.lang); - if ( ids === undefined ) { - langToListsMap.set(asset.lang, ids = []); - } - ids.push(id); - } - for ( const ids of langToListsMap.values() ) { - const urls = []; - for ( const id of ids ) { - const asset = assets[id]; - const contentURL = Array.isArray(asset.contentURL) - ? asset.contentURL[0] - : asset.contentURL; - urls.push(contentURL); - } - const id = ids[0]; - const asset = assets[id]; - await rulesetFromURLs({ - id: id.toLowerCase(), - lang: asset.lang, - name: asset.title, - enabled: false, - urls, - homeURL: asset.supportURL, - }); + for ( const ruleset of rulesets ) { + if ( ruleset.excludedPlatforms?.includes(platform) ) { continue; } + await rulesetFromURLs(ruleset); } - // Handpicked rulesets from assets.json - const handpicked = [ 'block-lan', 'dpollock-0', 'adguard-spyware-url' ]; - for ( const id of handpicked ) { - const asset = assets[id]; - if ( asset.content !== 'filters' ) { continue; } - - const contentURL = Array.isArray(asset.contentURL) - ? asset.contentURL[0] - : asset.contentURL; - await rulesetFromURLs({ - id: id.toLowerCase(), - name: asset.title, - enabled: false, - urls: [ contentURL ], - homeURL: asset.supportURL, - }); - } + logProgress(''); - // Handpicked rulesets from abroad - await rulesetFromURLs({ - id: 'stevenblack-hosts', - name: 'Steven Black\'s hosts file', - enabled: false, - urls: [ 'https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts' ], - homeURL: 'https://github.com/StevenBlack/hosts#readme', - }); - - writeFile( - `${rulesetDir}/ruleset-details.json`, + writeFile(`${rulesetDir}/ruleset-details.json`, `${JSON.stringify(rulesetDetails, null, 1)}\n` ); - // We sort the hostnames for convenience/performance in the extension's - // script manager -- the scripting API does a sort() internally. - for ( const [ rulesetId, hostnamesToFidsMap ] of specificDetails ) { - specificDetails.set( - rulesetId, - Array.from(hostnamesToFidsMap).sort() - ); - } - writeFile( - `${rulesetDir}/specific-details.json`, - `${JSON.stringify(specificDetails, jsonSetMapReplacer)}\n` - ); - - writeFile( - `${rulesetDir}/declarative-details.json`, - `${JSON.stringify(declarativeDetails, jsonSetMapReplacer, 1)}\n` - ); - - writeFile( - `${rulesetDir}/procedural-details.json`, - `${JSON.stringify(proceduralDetails, jsonSetMapReplacer, 1)}\n` - ); - - writeFile( - `${rulesetDir}/scriptlet-details.json`, + writeFile(`${rulesetDir}/scriptlet-details.json`, `${JSON.stringify(scriptletStats, jsonSetMapReplacer, 1)}\n` ); - writeFile( - `${rulesetDir}/generic-details.json`, + writeFile(`${rulesetDir}/generic-details.json`, `${JSON.stringify(genericDetails, jsonSetMapReplacer, 1)}\n` ); @@ -1415,31 +1315,36 @@ await Promise.all(writeOps); // Patch manifest + // Get manifest content + const manifest = await fs.readFile( + `${outputDir}/manifest.json`, + { encoding: 'utf8' } + ).then(text => + JSON.parse(text) + ); // Patch declarative_net_request key manifest.declarative_net_request = { rule_resources: ruleResources }; // Patch web_accessible_resources key - manifest.web_accessible_resources = [{ - resources: Array.from(requiredRedirectResources).map(path => `/${path}`), + manifest.web_accessible_resources = manifest.web_accessible_resources || []; + const web_accessible_resources = { + resources: Array.from(requiredRedirectResources).map(path => `${path}`), matches: [ '' ], - use_dynamic_url: true, - }]; - // Patch version key - const now = new Date(); - const yearPart = now.getUTCFullYear() - 2000; - const monthPart = (now.getUTCMonth() + 1) * 1000; - const dayPart = now.getUTCDate() * 10; - const hourPart = Math.floor(now.getUTCHours() / 3) + 1; - manifest.version = manifest.version + `.${yearPart}.${monthPart + dayPart + hourPart}`; + }; + if ( env.includes('chromium') && env.includes('safari') === false ) { + web_accessible_resources.use_dynamic_url = true; + } + manifest.web_accessible_resources.push(web_accessible_resources); + + // Patch manifest version property + manifest.version = version; // Commit changes - await fs.writeFile( - `${outputDir}/manifest.json`, + await fs.writeFile(`${outputDir}/manifest.json`, JSON.stringify(manifest, null, 2) + '\n' ); // Log results const logContent = stdOutput.join('\n') + '\n'; await fs.writeFile(`${outputDir}/log.txt`, logContent); - await fs.writeFile(`${cacheDir}/log.txt`, logContent); } main(); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/make-scriptlets.js ublock-origin-1.67.0+dfsg/platform/mv3/make-scriptlets.js --- ublock-origin-1.46.0+dfsg/platform/mv3/make-scriptlets.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/make-scriptlets.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,196 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2017-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { builtinScriptlets } from './js/resources/scriptlets.js'; +import fs from 'fs/promises'; +import { safeReplace } from './safe-replace.js'; + +/******************************************************************************/ + +const resourceDetails = new Map(); +const resourceAliases = new Map(); +const scriptletFiles = new Map(); + +/******************************************************************************/ + +function createScriptletCoreCode(scriptletToken) { + const details = resourceDetails.get(scriptletToken); + const components = new Map([ [ scriptletToken, details.code ] ]); + const dependencies = details.dependencies && details.dependencies.slice() || []; + while ( dependencies.length !== 0 ) { + const token = dependencies.shift(); + if ( components.has(token) ) { continue; } + const details = resourceDetails.get(token); + if ( details === undefined ) { continue; } + components.set(token, details.code); + if ( Array.isArray(details.dependencies) === false ) { continue; } + dependencies.push(...details.dependencies); + } + return Array.from(components.values()).join('\n\n'); +} + +/******************************************************************************/ + +export function init() { + for ( const scriptlet of builtinScriptlets ) { + const { name, aliases, fn } = scriptlet; + const entry = { + name: fn.name, + code: fn.toString(), + world: scriptlet.world || 'MAIN', + dependencies: scriptlet.dependencies, + requiresTrust: scriptlet.requiresTrust === true, + }; + resourceDetails.set(name, entry); + if ( Array.isArray(aliases) === false ) { continue; } + for ( const alias of aliases ) { + resourceAliases.set(alias, name); + } + } +} + +/******************************************************************************/ + +export function reset() { + scriptletFiles.clear(); +} + +/******************************************************************************/ + +export function compile(assetDetails, details) { + if ( details.args[0].endsWith('.js') === false ) { + details.args[0] += '.js'; + } + if ( resourceAliases.has(details.args[0]) ) { + details.args[0] = resourceAliases.get(details.args[0]); + } + const scriptletToken = details.args[0]; + const resourceEntry = resourceDetails.get(scriptletToken); + if ( resourceEntry === undefined ) { return; } + const argsToken = JSON.stringify(details.args.slice(1)); + if ( resourceEntry.requiresTrust && details.trustedSource !== true ) { + console.log(`Rejecting +js(${scriptletToken},${argsToken.slice(1,-1)}): ${assetDetails.id} is not trusted`); + return; + } + if ( scriptletFiles.has(scriptletToken) === false ) { + scriptletFiles.set(scriptletToken, { + name: resourceEntry.name, + code: createScriptletCoreCode(scriptletToken), + world: resourceEntry.world, + args: new Map(), + hostnames: new Map(), + exceptions: new Map(), + hasEntities: false, + hasAncestors: false, + matches: new Set(), + }); + } + const scriptletDetails = scriptletFiles.get(scriptletToken); + if ( scriptletDetails.args.has(argsToken) === false ) { + scriptletDetails.args.set(argsToken, scriptletDetails.args.size); + } + const iArgs = scriptletDetails.args.get(argsToken); + if ( details.matches ) { + for ( const hn of details.matches ) { + const isEntity = hn.endsWith('.*') || hn.endsWith('.*>>'); + scriptletDetails.hasEntities ||= isEntity; + const isAncestor = hn.endsWith('>>') + scriptletDetails.hasAncestors ||= isAncestor; + if ( isEntity || isAncestor ) { + scriptletDetails.matches.clear(); + scriptletDetails.matches.add('*'); + } + if ( scriptletDetails.matches.has('*') === false ) { + scriptletDetails.matches.add(hn); + } + if ( scriptletDetails.hostnames.has(hn) === false ) { + scriptletDetails.hostnames.set(hn, new Set()); + } + scriptletDetails.hostnames.get(hn).add(iArgs); + } + } else { + scriptletDetails.matches.add('*'); + } + if ( details.excludeMatches ) { + for ( const hn of details.excludeMatches ) { + if ( scriptletDetails.exceptions.has(hn) === false ) { + scriptletDetails.exceptions.set(hn, []); + } + scriptletDetails.exceptions.get(hn).push(iArgs); + } + } +} + +/******************************************************************************/ + +export async function commit(rulesetId, path, writeFn) { + const scriptletTemplate = await fs.readFile( + './scriptlets/scriptlet.template.js', + { encoding: 'utf8' } + ); + const patchHnMap = hnmap => { + const out = Array.from(hnmap); + out.forEach(a => { + const values = Array.from(a[1]); + a[1] = values.length === 1 ? values[0] : values; + }); + return out; + }; + const scriptletStats = []; + for ( const [ name, details ] of scriptletFiles ) { + let content = safeReplace(scriptletTemplate, + 'function $scriptletName$(){}', + details.code + ); + content = safeReplace(content, /\$rulesetId\$/, rulesetId, 0); + content = safeReplace(content, /\$scriptletName\$/, details.name, 0); + content = safeReplace(content, + 'self.$argsList$', + JSON.stringify(Array.from(details.args.keys()).map(a => JSON.parse(a))) + ); + content = safeReplace(content, + 'self.$hostnamesMap$', + JSON.stringify(patchHnMap(details.hostnames)) + ); + content = safeReplace(content, + 'self.$hasEntities$', + JSON.stringify(details.hasEntities) + ); + content = safeReplace(content, + 'self.$hasAncestors$', + JSON.stringify(details.hasAncestors) + ); + content = safeReplace(content, + 'self.$exceptionsMap$', + JSON.stringify(Array.from(details.exceptions)) + ); + writeFn(`${path}/${rulesetId}.${name}`, content); + scriptletStats.push([ + name.slice(0, -3), { + hostnames: Array.from(details.matches).sort(), + world: details.world, + } + ]); + } + return scriptletStats; +} + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/rulesets.json ublock-origin-1.67.0+dfsg/platform/mv3/rulesets.json --- ublock-origin-1.46.0+dfsg/platform/mv3/rulesets.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/rulesets.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,636 @@ +[ + { + "id": "ublock-filters", + "name": "uBlock filters – Ads, trackers, and more", + "group": "default", + "enabled": true, + "trusted": true, + "urls": [ + "https://ublockorigin.github.io/uAssets/filters/quick-fixes.min.txt", + "https://ublockorigin.github.io/uAssets/filters/unbreak.min.txt", + "https://ublockorigin.github.io/uAssets/filters/filters.min.txt", + "https://ublockorigin.github.io/uAssets/filters/privacy.min.txt", + "https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt" + ], + "homeURL": "https://github.com/uBlockOrigin/uAssets" + }, + { + "id": "easylist", + "name": "EasyList", + "group": "default", + "enabled": true, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt" + ], + "homeURL": "https://easylist.to/" + }, + { + "id": "easyprivacy", + "name": "EasyPrivacy", + "group": "default", + "enabled": true, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt" + ], + "homeURL": "https://easylist.to/" + }, + { + "id": "pgl", + "name": "Peter Lowe – Ads, trackers, and more", + "group": "default", + "enabled": true, + "urls": [ + "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext" + ], + "homeURL": "https://pgl.yoyo.org/adservers/" + }, + { + "id": "ublock-badware", + "name": "uBlock filters – Badware risks", + "group": "malware", + "enabled": true, + "trusted": true, + "urls": [ + "https://ublockorigin.github.io/uAssets/filters/badware.min.txt" + ], + "homeURL": "https://github.com/uBlockOrigin/uAssets" + }, + { + "id": "urlhaus-full", + "name": "Malicious URL Blocklist", + "group": "malware", + "enabled": true, + "excludedPlatforms": [ "safari" ], + "urls": [ + "https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-hosts.txt" + ], + "homeURL": "https://gitlab.com/malware-filter/urlhaus-filter" + }, + { + "id": "adguard-mobile", + "name": "AdGuard/uBO – Mobile Ads", + "group": "ads", + "enabled": false, + "tags": "mobile", + "urls": [ + "https://ublockorigin.github.io/uAssets/filters/filters-mobile.txt", + "https://filters.adtidy.org/extension/ublock/filters/11.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "block-lan", + "name": "Block Outsider Intrusion into LAN", + "group": "privacy", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/filters/lan-block.txt" + ], + "homeURL": "https://github.com/uBlockOrigin/uAssets" + }, + { + "id": "dpollock-0", + "name": "Dan Pollock’s hosts file", + "enabled": false, + "excludedPlatforms": [ "safari" ], + "urls": [ + "https://someonewhocares.org/hosts/hosts" + ], + "homeURL": "https://someonewhocares.org/hosts/" + }, + { + "id": "adguard-spyware-url", + "name": "AdGuard URL Tracking Protection", + "group": "privacy", + "enabled": false, + "excludedPlatforms": [ "safari" ], + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/17.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "annoyances-cookies", + "name": "EasyList/uBO – Cookie Notices", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt", + "https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "annoyances-overlays", + "name": "EasyList/uBO – Overlay Notices", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-newsletters.txt", + "https://ublockorigin.github.io/uAssets/filters/annoyances-others.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "annoyances-social", + "name": "EasyList – Social Widgets", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-social.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "annoyances-widgets", + "name": "EasyList – Chat Widgets", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-chat.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "annoyances-others", + "name": "EasyList – Other Annoyances", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-annoyances.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "annoyances-notifications", + "name": "EasyList – Notifications", + "group": "annoyances", + "enabled": false, + "urls": [ + "https://ublockorigin.github.io/uAssets/thirdparties/easylist-notifications.txt" + ], + "homeURL": "https://github.com/easylist/easylist#fanboy-lists" + }, + { + "id": "ublock-experimental", + "name": "uBlock filters – Experimental", + "enabled": false, + "trusted": true, + "urls": [ + "https://ublockorigin.github.io/uAssets/filters/experimental.min.txt" + ], + "homeURL": "https://github.com/uBlockOrigin/uAssets" + }, + { + "id": "stevenblack-hosts", + "name": "Steven Black’s Unified Hosts (adware + malware)", + "enabled": false, + "excludedPlatforms": [ "safari" ], + "urls": [ + "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" + ], + "homeURL": "https://github.com/StevenBlack/hosts#readme" + }, + { + "id": "ubol-tests", + "name": "uBO Lite Test Filters", + "enabled": false, + "trusted": true, + "urls": [ + "https://ublockorigin.github.io/uBOL-home/tests/test-filters.txt" + ], + "homeURL": "https://ublockorigin.github.io/uBOL-home/tests/test-filters.html" + }, + { + "id": "alb-0", + "group": "regions", + "lang": "sq", + "name": "🇦🇱al 🇽🇰xk: Adblock List for Albania", + "tags": "ads albania shqipja", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt" + ], + "homeURL": "https://github.com/AnXh3L0/blocklist" + }, + { + "id": "bgr-0", + "group": "regions", + "lang": "bg mk", + "name": "🇧🇬bg: Bulgarian Adblock list", + "tags": "ads bulgarian България macedonian Македонија", + "enabled": false, + "urls": [ + "https://stanev.org/abp/adblock_bg.txt" + ], + "homeURL": "https://stanev.org/abp/" + }, + { + "id": "chn-0", + "group": "regions", + "lang": "ug zh", + "name": "🇨🇳cn 🇹🇼tw: AdGuard Chinese (中文)", + "tags": "ads chinese 中文", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/224.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "cze-0", + "group": "regions", + "lang": "cs sk", + "name": "🇨🇿cz 🇸🇰sk: EasyList Czech and Slovak", + "tags": "ads czech česká slovak slovenská", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt" + ], + "homeURL": "https://github.com/tomasko126/easylistczechandslovak" + }, + { + "id": "deu-0", + "group": "regions", + "lang": "de dsb hsb lb rm", + "name": "🇩🇪de 🇨🇭ch 🇦🇹at: EasyList Germany", + "tags": "ads german deutschland luxembourgish lëtzebuerg romansh", + "enabled": false, + "urls": [ + "https://easylist.to/easylistgermany/easylistgermany.txt" + ], + "homeURL": "https://forums.lanik.us/viewforum.php?f=90" + }, + { + "id": "est-0", + "group": "regions", + "lang": "et", + "name": "🇪🇪ee: Eesti saitidele kohandatud filter", + "enabled": false, + "urls": [ + "https://ubol-et.adblock.ee/list.txt" + ], + "homeURL": "https://github.com/sander85/uBOL-et" + }, + { + "id": "fin-0", + "group": "regions", + "lang": "fi", + "name": "🇫🇮fi: Adblock List for Finland", + "tags": "ads finnish", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/gh-pages/Finland_adb.txt" + ], + "homeURL": "https://github.com/finnish-easylist-addition/finnish-easylist-addition" + }, + { + "id": "fra-0", + "group": "regions", + "lang": "ar br ff fr lb oc son", + "name": "🇫🇷fr 🇨🇦ca: AdGuard Français", + "tags": "ads french", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/16.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "grc-0", + "group": "regions", + "lang": "el", + "name": "🇬🇷gr 🇨🇾cy: Greek AdBlock Filter", + "tags": "ads greek", + "enabled": false, + "urls": [ + "https://www.void.gr/kargig/void-gr-filters.txt" + ], + "homeURL": "https://github.com/kargig/greek-adblockplus-filter" + }, + { + "id": "hrv-0", + "group": "regions", + "lang": "bs hr sr", + "name": "🇭🇷hr 🇷🇸rs: Dandelion Sprout's Serbo-Croatian filters", + "tags": "ads croatian serbian bosnian", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt" + ], + "homeURL": "https://github.com/DandelionSprout/adfilt#readme" + }, + { + "id": "hun-0", + "group": "regions", + "lang": "hu", + "name": "🇭🇺hu: hufilter", + "tags": "ads hungarian", + "enabled": false, + "urls": [ + "https://cdn.jsdelivr.net/gh/hufilter/hufilter@gh-pages/hufilter-ublock.txt" + ], + "homeURL": "https://github.com/hufilter/hufilter" + }, + { + "id": "idn-0", + "group": "regions", + "lang": "id ms", + "name": "🇮🇩id 🇲🇾my: ABPindo", + "tags": "ads indonesian malay", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/ABPindo/indonesianadblockrules/master/subscriptions/abpindo.txt" + ], + "homeURL": "https://github.com/ABPindo/indonesianadblockrules" + }, + { + "id": "ind-0", + "group": "regions", + "lang": "as bn gu hi kn ml mr ne pa si ta te", + "name": "🇮🇳in 🇱🇰lk 🇳🇵np: IndianList", + "tags": "ads assamese bengali gujarati hindi kannada malayalam marathi nepali punjabi sinhala tamil telugu", + "enabled": false, + "urls": [ + "https://easylist-downloads.adblockplus.org/indianlist.txt" + ], + "homeURL": "https://github.com/mediumkreation/IndianList" + }, + { + "id": "irn-0", + "group": "regions", + "lang": "fa ps tg", + "name": "🇮🇷ir: PersianBlocker", + "tags": "ads af ir persian pashto tajik tj", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt" + ], + "homeURL": "https://github.com/MasterKia/PersianBlocker" + }, + { + "id": "isl-0", + "group": "regions", + "lang": "is", + "name": "🇮🇸is: Icelandic ABP List", + "tags": "ads icelandic", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/brave/adblock-lists/master/custom/is.txt" + ], + "homeURL": "https://github.com/brave/adblock-lists/issues" + }, + { + "id": "isr-0", + "group": "regions", + "lang": "he", + "name": "🇮🇱il: EasyList Hebrew", + "tags": "ads hebrew", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt" + ], + "homeURL": "https://github.com/easylist/EasyListHebrew" + }, + { + "id": "ita-0", + "group": "regions", + "lang": "it lij", + "name": "🇮🇹it: EasyList Italy", + "tags": "ads italian", + "enabled": false, + "urls": [ + "https://easylist-downloads.adblockplus.org/easylistitaly.txt" + ], + "homeURL": "https://forums.lanik.us/viewforum.php?f=96" + }, + { + "id": "jpn-1", + "group": "regions", + "lang": "ja", + "name": "🇯🇵jp: AdGuard Japanese", + "tags": "ads japanese 日本語", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/7.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "kor-1", + "group": "regions", + "lang": "ko", + "name": "🇰🇷kr: List-KR", + "tags": "ads korean 한국어", + "enabled": false, + "urls": [ + "https://cdn.jsdelivr.net/gh/List-KR/List-KR@latest/filter-uBlockOrigin.txt" + ], + "homeURL": "https://github.com/List-KR/List-KR#readme" + }, + { + "id": "ltu-0", + "group": "regions", + "lang": "lt", + "name": "🇱🇹lt: EasyList Lithuania", + "tags": "ads lithuanian", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt" + ], + "homeURL": "https://github.com/EasyList-Lithuania/easylist_lithuania" + }, + { + "id": "lva-0", + "group": "regions", + "lang": "lv", + "name": "🇱🇻lv: Latvian List", + "tags": "ads latvian", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/Latvian-List/adblock-latvian/master/lists/latvian-list.txt" + ], + "homeURL": "https://github.com/Latvian-List/adblock-latvian" + }, + { + "id": "mkd-0", + "group": "regions", + "lang": "mk", + "name": "🇲🇰mk: Macedonian adBlock Filters", + "tags": "ads macedonian", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/DeepSpaceHarbor/Macedonian-adBlock-Filters/master/Filters" + ], + "homeURL": "https://github.com/DeepSpaceHarbor/Macedonian-adBlock-Filters" + }, + { + "id": "nld-0", + "group": "regions", + "lang": "af fy nl", + "name": "🇳🇱nl 🇧🇪be: AdGuard Dutch", + "tags": "ads afrikaans be belgië frisian dutch flemish nederlands netherlands nl sr suriname za", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/8.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "nor-0", + "group": "regions", + "lang": "nb nn no da is", + "name": "🇳🇴no 🇩🇰dk 🇮🇸is: Dandelion Sprouts nordiske filtre", + "tags": "ads norwegian danish icelandic", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt" + ], + "homeURL": "https://github.com/DandelionSprout/adfilt" + }, + { + "id": "pol-0", + "group": "regions", + "lang": "szl pl _", + "name": "🇵🇱pl: Oficjalne Polskie Filtry do uBlocka Origin", + "tags": "ads polish polski", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt" + ], + "homeURL": "https://github.com/MajkiIT/polish-ads-filter" + }, + { + "id": "rou-1", + "group": "regions", + "lang": "ro", + "name": "🇷🇴ro 🇲🇩md: Romanian Ad (ROad) Block List Light", + "tags": "ads romanian română moldavian moldovenească молдовеняскэ", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/tcptomato/ROad-Block/master/road-block-filters-light.txt" + ], + "homeURL": "https://github.com/tcptomato/ROad-Block" + }, + { + "id": "rus-0", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "lang": "be kk tt ru uz", + "name": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek uk", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt" + ], + "homeURL": "https://forums.lanik.us/viewforum.php?f=102" + }, + { + "id": "rus-1", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "name": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList: Counters", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek be kk tt ru uk uz", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt" + ], + "homeURL": "https://forums.lanik.us/viewforum.php?f=102" + }, + { + "id": "spa-0", + "group": "regions", + "lang": "an ast ca cak es eu gl gn trs quz", + "name": "🇪🇸es 🇦🇷ar 🇲🇽mx 🇨🇴co: EasyList Spanish", + "tags": "ads aragonese basque catalan spanish español galician guarani", + "enabled": false, + "urls": [ + "https://easylist-downloads.adblockplus.org/easylistspanish.txt" + ], + "homeURL": "https://forums.lanik.us/viewforum.php?f=103" + }, + { + "id": "spa-1", + "group": "regions", + "lang": "an ast ca cak es eu gl gn trs pt quz", + "name": "🇪🇸es 🇦🇷ar 🇧🇷br 🇵🇹pt: AdGuard Spanish/Portuguese", + "tags": "ads aragonese basque catalan spanish español galician guarani portuguese português", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/9.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "svn-0", + "group": "regions", + "lang": "sl", + "name": "🇸🇮si: Slovenian List", + "tags": "ads slovenian slovenski", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt" + ], + "homeURL": "https://github.com/betterwebleon/slovenian-list" + }, + { + "id": "swe-1", + "group": "regions", + "lang": "sv", + "name": "🇸🇪se: Frellwit's Swedish Filter", + "tags": "ads swedish svenska", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt" + ], + "homeURL": "https://github.com/lassekongo83/Frellwits-filter-lists" + }, + { + "id": "tha-0", + "group": "regions", + "lang": "th", + "name": "🇹🇭th: EasyList Thailand", + "tags": "ads thai ไทย", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/easylist-thailand.txt" + ], + "homeURL": "https://github.com/easylist-thailand/easylist-thailand" + }, + { + "id": "tur-0", + "group": "regions", + "lang": "tr", + "name": "🇹🇷tr: AdGuard Turkish", + "tags": "ads turkish türkçe", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/13.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "ukr-0", + "group": "regions", + "lang": "uk", + "name": "🇺🇦ua: AdGuard Ukrainian", + "tags": "ads ukraine україна", + "enabled": false, + "urls": [ + "https://filters.adtidy.org/extension/ublock/filters/23.txt" + ], + "homeURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters" + }, + { + "id": "vie-1", + "group": "regions", + "lang": "vi", + "name": "🇻🇳vn: ABPVN List", + "tags": "ads vietnamese việt", + "enabled": false, + "urls": [ + "https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn_ublock.txt" + ], + "homeURL": "https://abpvn.com/" + } +] diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/css-api.js ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-api.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/css-api.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-api.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,46 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(api => { + if ( typeof api === 'object' ) { return; } + + const inserted = new Set(); + + self.cssAPI = { + insert(css) { + chrome.runtime.sendMessage({ + what: 'insertCSS', + css, + }).catch(( ) => { + }); + inserted.add(css); + }, + }; + + self.addEventListener('pageshow', ( ) => { + chrome.runtime.sendMessage({ + what: 'insertCSS', + css: Array.from(inserted).join('\n'), + }).catch(( ) => { + }); + }); + +})(self.cssAPI); diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/css-user.js ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-user.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/css-user.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-user.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,59 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +(async function uBOL_cssUser() { + +/******************************************************************************/ + +const docURL = new URL(document.baseURI); +const details = await chrome.runtime.sendMessage({ + what: 'injectCustomFilters', + hostname: docURL.hostname, +}).catch(( ) => { +}); + +if ( details?.proceduralSelectors?.length ) { + if ( self.ProceduralFiltererAPI ) { + self.customProceduralFiltererAPI = new self.ProceduralFiltererAPI(); + self.customProceduralFiltererAPI.addSelectors( + details.proceduralSelectors.map(a => JSON.parse(a)) + ); + } +} + +if ( details?.plainSelectors?.length ) { + const selectors = details.plainSelectors; + self.addEventListener('pageshow', ( ) => { + chrome.runtime.sendMessage({ + what: 'insertCSS', + css: `${selectors.join(',\n')}{display:none!important;}`, + }).catch(( ) => { + }); + }); +} + +self.customFilters = details; + +/******************************************************************************/ + +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/ext-compat.js ublock-origin-1.67.0+dfsg/platform/mv3/safari/ext-compat.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/ext-compat.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/ext-compat.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,223 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + + +export const webext = self.browser; + +/******************************************************************************/ + +// https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest/ + +const nativeDNR = webext.declarativeNetRequest; + +const isSupportedRule = r => { + if ( r.action.responseHeaders ) { return false; } + const { condition } = r; + if ( condition.tabIds !== undefined ) { return false; } + if ( condition.resourceTypes?.includes('object') ) { + if ( condition.resourceTypes.length === 1 ) { return false; } + const i = condition.resourceTypes.indexOf('object'); + condition.resourceTypes.splice(i, 1); + } + if ( condition.excludedResourceTypes?.includes('object') ) { + const i = condition.excludedResourceTypes.indexOf('object'); + condition.excludedResourceTypes.splice(i, 1); + if ( condition.excludedResourceTypes.length === 0 ) { + delete condition.excludedResourceTypes; + } + } + return true; +}; + +const prepareUpdateRules = optionsBefore => { + const { addRules, removeRuleIds } = optionsBefore; + const addRulesAfter = addRules?.filter(isSupportedRule); + if ( Boolean(addRulesAfter?.length || removeRuleIds?.length) === false ) { return; } + addRulesAfter?.forEach(r => { + if ( r.action?.redirect?.regexSubstitution ) { + if ( r.condition?.requestDomains ) { + r.condition.domains = r.condition.requestDomains; + delete r.condition.requestDomains; + return; + } + } + if ( r.condition?.initiatorDomains ) { + r.condition.domains = r.condition.initiatorDomains; + delete r.condition.initiatorDomains; + } + if ( r.condition?.excludedInitiatorDomains ) { + r.condition.excludedDomains = r.condition.excludedInitiatorDomains; + delete r.condition.excludedInitiatorDomains; + } + }); + const optionsAfter = {}; + if ( addRulesAfter?.length ) { optionsAfter.addRules = addRulesAfter; } + if ( removeRuleIds?.length ) { optionsAfter.removeRuleIds = removeRuleIds; } + return optionsAfter; +}; + +const ruleCompare = (a, b) => a.id - b.id; + +const isSameRules = (a, b) => { + a.sort(ruleCompare); + b.sort(ruleCompare); + return JSON.stringify(a) === JSON.stringify(b); +}; + +/******************************************************************************/ + +export function normalizeDNRRules(rules, ruleIds) { + if ( Array.isArray(rules) === false ) { return rules; } + const selectedRules = Array.isArray(ruleIds) + ? rules.filter(rule => ruleIds.includes(rule.id)) + : rules; + selectedRules.forEach(rule => { + const { condition } = rule; + if ( Array.isArray(condition.domains) ) { + condition.initiatorDomains = condition.domains; + delete condition.domains; + } + if ( Array.isArray(condition.excludedDomains) ) { + condition.excludedInitiatorDomains = condition.excludedDomains; + delete condition.excludedDomains; + } + }); + return selectedRules; +} + +/******************************************************************************/ + +export const dnr = { + DYNAMIC_RULESET_ID: '_dynamic', + MAX_NUMBER_OF_ENABLED_STATIC_RULESETS: nativeDNR.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS, + MAX_NUMBER_OF_REGEX_RULES: nativeDNR.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES, + async getAvailableStaticRuleCount() { + return 150000; + }, + getDynamicRules({ ruleIds } = {}) { + return new Promise(resolve => { + nativeDNR.getDynamicRules(rules => { + if ( Array.isArray(rules) === false ) { return resolve([]); } + return resolve(normalizeDNRRules(rules, ruleIds)); + }); + }); + }, + getEnabledRulesets(...args) { + return nativeDNR.getEnabledRulesets(...args); + }, + getMatchedRules(...args) { + return nativeDNR.getMatchedRules(...args); + }, + getSessionRules({ ruleIds } = {}) { + return new Promise(resolve => { + nativeDNR.getSessionRules(rules => { + if ( Array.isArray(rules) === false ) { return resolve([]); } + return resolve(normalizeDNRRules(rules, ruleIds)); + }); + }); + }, + isRegexSupported(...args) { + return nativeDNR.isRegexSupported(...args); + }, + async updateDynamicRules(optionsBefore) { + const optionsAfter = prepareUpdateRules(optionsBefore); + if ( optionsAfter === undefined ) { return; } + return nativeDNR.updateDynamicRules(optionsAfter); + }, + updateEnabledRulesets(...args) { + return nativeDNR.updateEnabledRulesets(...args); + }, + async updateSessionRules(optionsBefore) { + const optionsAfter = prepareUpdateRules(optionsBefore); + if ( optionsAfter === undefined ) { return; } + return nativeDNR.updateSessionRules(optionsAfter); + }, + async setAllowAllRules(id, allowed, notAllowed, reverse, priority) { + const beforeRules = await this.getDynamicRules({ ruleIds: [ id+0 ] }); + const addRules = []; + if ( reverse || allowed.length || notAllowed.length ) { + const rule0 = { + id: id+0, + action: { type: 'allow' }, + condition: { urlFilter: '*' }, + priority, + }; + if ( allowed.length ) { + rule0.condition.domains = allowed; + } else if ( notAllowed.length ) { + rule0.condition.excludedDomains = notAllowed; + } + addRules.push(rule0); + } + if ( isSameRules(addRules, beforeRules) ) { return false; } + return this.updateDynamicRules({ + addRules, + removeRuleIds: beforeRules.map(r => r.id), + }).then(( ) => + true + ).catch(( ) => + false + ); + }, + setExtensionActionOptions(...args) { + return nativeDNR.setExtensionActionOptions(...args); + }, +}; + +/******************************************************************************/ + +// Workaround for: +// https://github.com/uBlockOrigin/uBOL-home/issues/515 +// https://bugs.webkit.org/show_bug.cgi?id=300236 +// +// For each realm, we will force-reload registered rulesets once. + +const { windows } = webext; +const NORMAL_REALM = 0b01; +const PRIVATE_REALM = 0b10; +const ALL_REALMS = NORMAL_REALM | PRIVATE_REALM; +let seenRealms = 0b00; + +async function forceEnableRulesets(windowId) { + if ( seenRealms === ALL_REALMS ) { return; } + if ( windowId === windows.WINDOW_ID_NONE ) { return; } + const details = await windows.get(windowId, { windowTypes: [ 'normal' ] }); + const incognito = details?.incognito; + if ( typeof incognito !== 'boolean' ) { return; } + const currentRealm = incognito ? PRIVATE_REALM : NORMAL_REALM; + if ( (seenRealms & currentRealm) !== 0 ) { return; } + seenRealms |= currentRealm; + webext.storage.session.set({ __seenRealms: seenRealms }); + const ids = await nativeDNR.getEnabledRulesets(); + if ( ids.length === 0 ) { return; } + nativeDNR.updateEnabledRulesets({ + disableRulesetIds: ids.slice(), + enableRulesetIds: ids.slice(), + }); +} + +windows.onFocusChanged.addListener(forceEnableRulesets); + +webext.storage.session.get('__seenRealms').then(bin => { + seenRealms |= bin?.__seenRealms ?? 0; +}).catch(( ) => { +}); + diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/manifest.json ublock-origin-1.67.0+dfsg/platform/mv3/safari/manifest.json --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/manifest.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,89 @@ +{ + "action": { + "default_icon": "/img/icon_64.png", + "default_popup": "popup.html" + }, + "author": "Raymond Hill", + "background": { + "scripts": [ "/js/background.js" ], + "type": "module", + "persistent": false + }, + "browser_specific_settings": { + "safari": { + "strict_min_version": "18.6" + } + }, + "commands": { + "enter-zapper-mode": { + "description": "__MSG_zapperTipEnter__" + }, + "enter-picker-mode": { + "description": "__MSG_pickerTipEnter__" + } + }, + "declarative_net_request": { + "rule_resources": [ + ] + }, + "default_locale": "en", + "description": "__MSG_extShortDesc__", + "icons": { + "16": "/img/icon_16.png", + "32": "/img/icon_32.png", + "64": "/img/icon_64.png", + "128": "/img/icon_128.png", + "512": "/img/icon_512.png" + }, + "manifest_version": 3, + "name": "__MSG_extName__", + "options_ui": { + "page": "dashboard.html" + }, + "host_permissions": [ + "" + ], + "permissions": [ + "activeTab", + "declarativeNetRequest", + "declarativeNetRequestWithHostAccess", + "scripting", + "storage" + ], + "short_name": "uBO Lite", + "version": "1.0", + "web_accessible_resources": [ + { + "resources": [ + "strictblock.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "zapper-ui.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "picker-ui.html" + ], + "matches": [ + "" + ] + }, + { + "resources": [ + "unpicker-ui.html" + ], + "matches": [ + "" + ] + } + ] +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/patch-extension.js ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-extension.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/patch-extension.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-extension.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,107 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import fs from 'fs/promises'; +import process from 'process'; + +/******************************************************************************/ + +const commandLineArgs = (( ) => { + const args = Object.create(null); + let name, value; + for ( const arg of process.argv.slice(2) ) { + const pos = arg.indexOf('='); + if ( pos === -1 ) { + name = arg; + value = ''; + } else { + name = arg.slice(0, pos); + value = arg.slice(pos+1); + } + args[name] = value; + } + return args; +})(); + +/******************************************************************************/ + +// Apple store rejects when description (extShortDesc) is longer than 112 +// characters. + +async function fixLongDescription(path) { + let text = await fs.readFile(path, { encoding: 'utf8' }); + const messages = JSON.parse(text); + let message = messages.extShortDesc.message; + if ( message.length <= 112 ) { return; } + const pos = message.indexOf('.'); + if ( pos !== -1 ) { + message = message.slice(0, pos+1); + } + if ( message.length >= 112 ) { + message = `${message.slice(0, 111)}…`; + } + messages.extShortDesc.message = message; + text = JSON.stringify(messages, null, 2); + await fs.writeFile(path, text); +} + +async function fixLongDescriptions() { + const promises = []; + const packageDir = commandLineArgs.packageDir; + const entries = await fs.readdir(`${packageDir}/_locales/`, { withFileTypes: true }); + for ( const entry of entries ) { + if ( entry.isDirectory() === false ) { continue; } + promises.push(fixLongDescription(`${packageDir}/_locales/${entry.name}/messages.json`)); + } + return Promise.all(promises); +} + +/******************************************************************************/ + +// Apple store rejects when version has four components. + +async function fixManifest() { + const packageDir = commandLineArgs.packageDir; + const path = `${packageDir}/manifest.json`; + let text = await fs.readFile(path, { encoding: 'utf8' }); + const manifest = JSON.parse(text); + const match = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.exec(manifest.version); + if ( match === null ) { return; } + const month = parseInt(match[2], 10); + const dayofmonth = parseInt(match[3], 10); + const monthday /* sort of */ = month * 100 + dayofmonth; + manifest.version = `${match[1]}.${monthday}.${match[4]}`; + text = JSON.stringify(manifest, null, 2); + await fs.writeFile(path, text); +} + +/******************************************************************************/ + +async function main() { + await Promise.all([ + fixLongDescriptions(), + fixManifest(), + ]); +} + +main(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safari/patch-ruleset.js ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-ruleset.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safari/patch-ruleset.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-ruleset.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,69 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +function patchRule(rule, out) { + const copy = structuredClone(rule); + const condition = copy.condition; + if ( copy.action.type === 'modifyHeaders' ) { return; } + if ( Array.isArray(copy.condition.responseHeaders) ) { return; } + // https://github.com/uBlockOrigin/uBOL-home/issues/476#issuecomment-3299309478 + if ( copy.action.redirect?.transform?.queryTransform?.removeParams ) { + const resourceTypes = condition.resourceTypes; + if ( resourceTypes?.includes('main_frame') ) { + condition.resourceTypes = resourceTypes.filter(a => a !== 'main_frame'); + if ( condition.resourceTypes.length === 0 ) { return; } + } + } + if ( Array.isArray(condition.initiatorDomains) ) { + condition.domains = condition.initiatorDomains; + delete condition.initiatorDomains; + } + if ( Array.isArray(condition.excludedInitiatorDomains) ) { + condition.excludedDomains = condition.excludedInitiatorDomains; + delete condition.excludedInitiatorDomains; + } + // https://github.com/uBlockOrigin/uBOL-home/issues/434 + let { urlFilter } = condition; + if ( urlFilter?.endsWith('^') ) { + urlFilter = urlFilter.slice(0, -1); + const match = /^(.*?\/\/|\|\|)/.exec(urlFilter); + const pattern = match + ? urlFilter.slice(match[0].length) + : urlFilter; + if ( /[^\w.%*-]/.test(pattern) ) { + const extra = structuredClone(copy); + extra.condition.urlFilter = `${urlFilter}|`; + out.push(extra); + console.log(`\tAdd ${extra.condition.urlFilter}`); + } + } + out.push(copy); + return copy; +} + +export function patchRuleset(ruleset) { + const out = []; + for ( const rule of ruleset ) { + if ( patchRule(rule, out) ) { continue; } + console.log(`\tReject ${JSON.stringify(rule)}`); + } + return out; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/safe-replace.js ublock-origin-1.67.0+dfsg/platform/mv3/safe-replace.js --- ublock-origin-1.46.0+dfsg/platform/mv3/safe-replace.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/safe-replace.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,37 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2017-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +export function safeReplace(text, pattern, replacement, count = 1) { + const rePattern = typeof pattern === 'string' + ? new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + : pattern; + let out = text; + for (;;) { + const match = rePattern.exec(out); + if ( match === null ) { break; } + out = out.slice(0, match.index) + + replacement + + out.slice(match.index + match[0].length); + count -= 1; + if ( count === 0 ) { break; } + } + return out; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/salvage-ruleids.mjs ublock-origin-1.67.0+dfsg/platform/mv3/salvage-ruleids.mjs --- ublock-origin-1.46.0+dfsg/platform/mv3/salvage-ruleids.mjs 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/salvage-ruleids.mjs 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,116 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +/******************************************************************************/ + +import fs from 'fs/promises'; +import process from 'process'; + +/******************************************************************************/ + +const commandLineArgs = (( ) => { + const args = new Map(); + let name, value; + for ( const arg of process.argv.slice(2) ) { + const pos = arg.indexOf('='); + if ( pos === -1 ) { + name = arg; + value = ''; + } else { + name = arg.slice(0, pos); + value = arg.slice(pos+1); + } + args.set(name, value); + } + return args; +})(); + +const beforeDir = commandLineArgs.get('before') || ''; +const afterDir = commandLineArgs.get('after') || ''; + +if ( beforeDir === '' || afterDir === '' ) { + process.exit(0); +} + +/******************************************************************************/ + +async function main() { + const folders = [ + 'main', + 'modify-headers', + 'redirect', + 'regex', + 'removeparam', + ]; + const writePromises = []; + for ( const folder of folders ) { + const afterFiles = await fs.readdir(`${afterDir}/rulesets/${folder}`).catch(( ) => { }); + if ( afterFiles === undefined ) { continue; } + for ( const file of afterFiles ) { + let raw = await fs.readFile(`${beforeDir}/rulesets/${folder}/${file}`, 'utf-8').catch(( ) => ''); + let beforeRules; + try { beforeRules = JSON.parse(raw); } catch { } + if ( Array.isArray(beforeRules) === false ) { continue; } + raw = await fs.readFile(`${afterDir}/rulesets/${folder}/${file}`, 'utf-8').catch(( ) => ''); + let afterRules; + try { afterRules = JSON.parse(raw); } catch { } + if ( Array.isArray(afterRules) === false ) { continue; } + const beforeMap = new Map(beforeRules.map(a => { + const id = a.id; + a.id = 0; + return [ JSON.stringify(a), id ]; + })); + const reusedIds = new Set(); + for ( const afterRule of afterRules ) { + afterRule.id = 0; + const key = JSON.stringify(afterRule); + const beforeId = beforeMap.get(key); + if ( beforeId === undefined ) { continue; } + if ( reusedIds.has(beforeId) ) { continue; } + afterRule.id = beforeId; + reusedIds.add(beforeId); + } + // Assign new ids to unmatched rules + let ruleIdGenerator = 1; + for ( const afterRule of afterRules ) { + if ( afterRule.id !== 0 ) { continue; } + while ( reusedIds.has(ruleIdGenerator) ) { ruleIdGenerator += 1; } + afterRule.id = ruleIdGenerator++; + } + afterRules.sort((a, b) => a.id - b.id); + const indent = afterRules.length > 10 ? undefined : 1; + const lines = []; + for ( const afterRule of afterRules ) { + lines.push(JSON.stringify(afterRule, null, indent)); + } + const path = `${afterDir}/rulesets/${folder}/${file}`; + console.log(` Salvaged ${reusedIds.size} ids in ${folder}/${file}`); + writePromises.push( + fs.writeFile(path, `[\n${lines.join(',\n')}\n]\n`) + ); + } + } + await Promise.all(writePromises); +} + +main(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-current-script.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-current-script.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,181 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-current-script.entity -/// alias acs.entity -/// alias abort-current-inline-script.entity -/// alias acis.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortCurrentScriptEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -// Issues to mind before changing anything: -// https://github.com/uBlockOrigin/uBlock-issues/issues/2154 - -const scriptlet = ( - target = '', - needle = '', - context = '' -) => { - if ( target === '' ) { return; } - const reRegexEscape = /[.*+?^${}()|[\]\\]/g; - const reNeedle = (( ) => { - if ( needle === '' ) { return /^/; } - if ( /^\/.+\/$/.test(needle) ) { - return new RegExp(needle.slice(1,-1)); - } - return new RegExp(needle.replace(reRegexEscape, '\\$&')); - })(); - const reContext = (( ) => { - if ( context === '' ) { return; } - if ( /^\/.+\/$/.test(context) ) { - return new RegExp(context.slice(1,-1)); - } - return new RegExp(context.replace(reRegexEscape, '\\$&')); - })(); - const chain = target.split('.'); - let owner = window; - let prop; - for (;;) { - prop = chain.shift(); - if ( chain.length === 0 ) { break; } - owner = owner[prop]; - if ( owner instanceof Object === false ) { return; } - } - let value; - let desc = Object.getOwnPropertyDescriptor(owner, prop); - if ( - desc instanceof Object === false || - desc.get instanceof Function === false - ) { - value = owner[prop]; - desc = undefined; - } - const magic = String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - const scriptTexts = new WeakMap(); - const getScriptText = elem => { - let text = elem.textContent; - if ( text.trim() !== '' ) { return text; } - if ( scriptTexts.has(elem) ) { return scriptTexts.get(elem); } - const [ , mime, content ] = - /^data:([^,]*),(.+)$/.exec(elem.src.trim()) || - [ '', '', '' ]; - try { - switch ( true ) { - case mime.endsWith(';base64'): - text = self.atob(content); - break; - default: - text = self.decodeURIComponent(content); - break; - } - } catch(ex) { - } - scriptTexts.set(elem, text); - return text; - }; - const validate = ( ) => { - const e = document.currentScript; - if ( e instanceof HTMLScriptElement === false ) { return; } - if ( reContext !== undefined && reContext.test(e.src) === false ) { - return; - } - if ( reNeedle.test(getScriptText(e)) === false ) { return; } - throw new ReferenceError(magic); - }; - Object.defineProperty(owner, prop, { - get: function() { - validate(); - return desc instanceof Object - ? desc.get.call(owner) - : value; - }, - set: function(a) { - validate(); - if ( desc instanceof Object ) { - desc.set.call(owner, a); - } else { - value = a; - } - } - }); - const oe = window.onerror; - window.onerror = function(msg) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe.apply(this, arguments); - } - }.bind(); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-current-script.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-current-script.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-current-script.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,184 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-current-script -/// alias acs -/// alias abort-current-inline-script -/// alias acis - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortCurrentScript() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -// Issues to mind before changing anything: -// https://github.com/uBlockOrigin/uBlock-issues/issues/2154 - -const scriptlet = ( - target = '', - needle = '', - context = '' -) => { - if ( target === '' ) { return; } - const reRegexEscape = /[.*+?^${}()|[\]\\]/g; - const reNeedle = (( ) => { - if ( needle === '' ) { return /^/; } - if ( /^\/.+\/$/.test(needle) ) { - return new RegExp(needle.slice(1,-1)); - } - return new RegExp(needle.replace(reRegexEscape, '\\$&')); - })(); - const reContext = (( ) => { - if ( context === '' ) { return; } - if ( /^\/.+\/$/.test(context) ) { - return new RegExp(context.slice(1,-1)); - } - return new RegExp(context.replace(reRegexEscape, '\\$&')); - })(); - const chain = target.split('.'); - let owner = window; - let prop; - for (;;) { - prop = chain.shift(); - if ( chain.length === 0 ) { break; } - owner = owner[prop]; - if ( owner instanceof Object === false ) { return; } - } - let value; - let desc = Object.getOwnPropertyDescriptor(owner, prop); - if ( - desc instanceof Object === false || - desc.get instanceof Function === false - ) { - value = owner[prop]; - desc = undefined; - } - const magic = String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - const scriptTexts = new WeakMap(); - const getScriptText = elem => { - let text = elem.textContent; - if ( text.trim() !== '' ) { return text; } - if ( scriptTexts.has(elem) ) { return scriptTexts.get(elem); } - const [ , mime, content ] = - /^data:([^,]*),(.+)$/.exec(elem.src.trim()) || - [ '', '', '' ]; - try { - switch ( true ) { - case mime.endsWith(';base64'): - text = self.atob(content); - break; - default: - text = self.decodeURIComponent(content); - break; - } - } catch(ex) { - } - scriptTexts.set(elem, text); - return text; - }; - const validate = ( ) => { - const e = document.currentScript; - if ( e instanceof HTMLScriptElement === false ) { return; } - if ( reContext !== undefined && reContext.test(e.src) === false ) { - return; - } - if ( reNeedle.test(getScriptText(e)) === false ) { return; } - throw new ReferenceError(magic); - }; - Object.defineProperty(owner, prop, { - get: function() { - validate(); - return desc instanceof Object - ? desc.get.call(owner) - : value; - }, - set: function(a) { - validate(); - if ( desc instanceof Object ) { - desc.set.call(owner, a); - } else { - value = a; - } - } - }); - const oe = window.onerror; - window.onerror = function(msg) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe.apply(this, arguments); - } - }.bind(); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,139 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-on-property-read.entity -/// alias aopr.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortOnPropertyReadEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const ObjGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -const ObjDefineProperty = Object.defineProperty; - -const magic = - String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - -const abort = function() { - throw new ReferenceError(magic); -}; - -const makeProxy = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - const desc = ObjGetOwnPropertyDescriptor(owner, chain); - if ( !desc || desc.get !== abort ) { - ObjDefineProperty(owner, chain, { - get: abort, - set: function(){} - }); - } - return; - } - - const prop = chain.slice(0, pos); - let v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v ) { - makeProxy(v, chain); - return; - } - - const desc = ObjGetOwnPropertyDescriptor(owner, prop); - if ( desc && desc.set !== undefined ) { return; } - - ObjDefineProperty(owner, prop, { - get: function() { return v; }, - set: function(a) { - v = a; - if ( a instanceof Object ) { - makeProxy(a, chain); - } - } - }); -}; - -const scriptlet = ( - chain = '' -) => { - const owner = window; - makeProxy(owner, chain); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-read.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-on-property-read -/// alias aopr - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortOnPropertyRead() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const ObjGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -const ObjDefineProperty = Object.defineProperty; - -const magic = - String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - -const abort = function() { - throw new ReferenceError(magic); -}; - -const makeProxy = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - const desc = ObjGetOwnPropertyDescriptor(owner, chain); - if ( !desc || desc.get !== abort ) { - ObjDefineProperty(owner, chain, { - get: abort, - set: function(){} - }); - } - return; - } - - const prop = chain.slice(0, pos); - let v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v ) { - makeProxy(v, chain); - return; - } - - const desc = ObjGetOwnPropertyDescriptor(owner, prop); - if ( desc && desc.set !== undefined ) { return; } - - ObjDefineProperty(owner, prop, { - get: function() { return v; }, - set: function(a) { - v = a; - if ( a instanceof Object ) { - makeProxy(a, chain); - } - } - }); -}; - -const scriptlet = ( - chain = '' -) => { - const owner = window; - makeProxy(owner, chain); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-on-property-write.entity -/// alias aopw.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortOnPropertyWriteEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const magic = - String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - -const abort = function() { - throw new ReferenceError(magic); -}; - -const scriptlet = ( - prop = '' -) => { - let owner = window; - for (;;) { - const pos = prop.indexOf('.'); - if ( pos === -1 ) { break; } - owner = owner[prop.slice(0, pos)]; - if ( owner instanceof Object === false ) { return; } - prop = prop.slice(pos + 1); - } - delete owner[prop]; - Object.defineProperty(owner, prop, { - set: function() { - abort(); - } - }); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/abort-on-property-write.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name abort-on-property-write -/// alias aopw - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_abortOnPropertyWrite() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const magic = - String.fromCharCode(Date.now() % 26 + 97) + - Math.floor(Math.random() * 982451653 + 982451653).toString(36); - -const abort = function() { - throw new ReferenceError(magic); -}; - -const scriptlet = ( - prop = '' -) => { - let owner = window; - for (;;) { - const pos = prop.indexOf('.'); - if ( pos === -1 ) { break; } - owner = owner[prop.slice(0, pos)]; - if ( owner instanceof Object === false ) { return; } - prop = prop.slice(pos + 1); - } - delete owner[prop]; - Object.defineProperty(owner, prop, { - set: function() { - abort(); - } - }); - const oe = window.onerror; - window.onerror = function(msg, src, line, col, error) { - if ( typeof msg === 'string' && msg.includes(magic) ) { - return true; - } - if ( oe instanceof Function ) { - return oe(msg, src, line, col, error); - } - }.bind(); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-declarative.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-declarative.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-declarative.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-declarative.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name css-declarative - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssDeclarativeImport() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -self.declarativeImports = self.declarativeImports || []; -self.declarativeImports.push({ argsList, hostnamesMap }); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generic.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generic.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name css-generic - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssGenericImport() { - -/******************************************************************************/ - -// $rulesetId$ - -const toImport = self.$genericSelectorMap$; - -const genericSelectorMap = self.genericSelectorMap || new Map(); - -if ( genericSelectorMap.size === 0 ) { - self.genericSelectorMap = new Map(toImport); - return; -} - -for ( const toImportEntry of toImport ) { - const existing = genericSelectorMap.get(toImportEntry[0]); - genericSelectorMap.set( - toImportEntry[0], - existing === undefined - ? toImportEntry[1] - : `${existing},${toImportEntry[1]}` - ); -} - -self.genericSelectorMap = genericSelectorMap; - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generic.template.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.template.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generic.template.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.template.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,87 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +// $rulesetId$ + +// Important! +// Isolate from global scope +(function uBOL_cssGenericImport() { + +/******************************************************************************/ + +const genericSelectorMap = self.$genericSelectorMap$; +const genericExceptionSieve = self.$genericExceptionSieve$; +const genericExceptionMap = self.$genericExceptionMap$; + +if ( genericSelectorMap ) { + const map = self.genericSelectorMap = + self.genericSelectorMap || new Map(); + if ( map.size !== 0 ) { + for ( const entry of genericSelectorMap ) { + const before = map.get(entry[0]); + if ( before === undefined ) { + map.set(entry[0], entry[1]); + } else { + map.set(entry[0], `${before},\n${entry[1]}`); + } + } + } else { + self.genericSelectorMap = new Map(genericSelectorMap); + } + genericSelectorMap.length = 0; +} + +if ( genericExceptionSieve ) { + const hashes = self.genericExceptionSieve = + self.genericExceptionSieve || new Set(); + if ( hashes.size !== 0 ) { + for ( const hash of genericExceptionSieve ) { + hashes.add(hash); + } + } else { + self.genericExceptionSieve = new Set(genericExceptionSieve); + } + genericExceptionSieve.length = 0; +} + +if ( genericExceptionMap ) { + const map = self.genericExceptionMap = + self.genericExceptionMap || new Map(); + if ( map.size !== 0 ) { + for ( const entry of genericExceptionMap ) { + const before = map.get(entry[0]); + if ( before === undefined ) { + map.set(entry[0], entry[1]); + } else { + map.set(entry[0], `${before}\n${entry[1]}`); + } + } + } else { + self.genericExceptionMap = new Map(genericExceptionMap); + } + genericExceptionMap.length = 0; +} + +/******************************************************************************/ + +})(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generichigh.template.css ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generichigh.template.css --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-generichigh.template.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generichigh.template.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,26 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +/* $rulesetId$ */ + +$selectorList$ { + display: none !important; +} diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-procedural.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-procedural.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2014-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name css-procedural - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssProceduralImport() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -self.proceduralImports = self.proceduralImports || []; -self.proceduralImports.push({ argsList, hostnamesMap }); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,42 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +// ruleset: $rulesetId$ + +// Important! +// Isolate from global scope +(function uBOL_cssProceduralImport() { + +/******************************************************************************/ + +const argsList = self.$argsList$; +const argsSeqs = self.$argsSeqs$; +const hostnamesMap = new Map(self.$hostnamesMap$); +const hasEntities = self.$hasEntities$; + +self.proceduralImports = self.proceduralImports || []; +self.proceduralImports.push({ argsList, argsSeqs, hostnamesMap, hasEntities }); + +/******************************************************************************/ + +})(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name css-specific.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssSpecificEntityImport() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -self.specificEntityImports = self.specificEntityImports || []; -self.specificEntityImports.push({ argsList, entitiesMap }); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name css-specific - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_cssSpecific() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -const styles = []; -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - styles.push(details.a); - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -if ( styles.length === 0 ) { return; } - -try { - const sheet = new CSSStyleSheet(); - sheet.replace(`@layer{${styles.join(',')}{display:none!important;}}`); - document.adoptedStyleSheets = [ - ...document.adoptedStyleSheets, - sheet - ]; -} catch(ex) { -} - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.template.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.template.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/css-specific.template.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.template.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,42 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2019-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +// ruleset: $rulesetId$ + +// Important! +// Isolate from global scope +(function uBOL_cssSpecificImports() { + +/******************************************************************************/ + +const argsList = self.$argsList$; +const argsSeqs = self.$argsSeqs$; +const hostnamesMap = new Map(self.$hostnamesMap$); +const hasEntities = self.$hasEntities$; + +self.specificImports = self.specificImports || []; +self.specificImports.push({ argsList, argsSeqs, hostnamesMap, hasEntities }); + +/******************************************************************************/ + +})(); + +/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/json-prune.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/json-prune.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/json-prune.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/json-prune.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name json-prune - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_jsonPrune() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -// https://github.com/uBlockOrigin/uBlock-issues/issues/1545 -// - Add support for "remove everything if needle matches" case - -const scriptlet = ( - rawPrunePaths = '', - rawNeedlePaths = '' -) => { - const prunePaths = rawPrunePaths !== '' - ? rawPrunePaths.split(/ +/) - : []; - let needlePaths; - if ( prunePaths.length === 0 ) { return; } - needlePaths = prunePaths.length !== 0 && rawNeedlePaths !== '' - ? rawNeedlePaths.split(/ +/) - : []; - const findOwner = function(root, path, prune = false) { - let owner = root; - let chain = path; - for (;;) { - if ( typeof owner !== 'object' || owner === null ) { - return false; - } - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - if ( prune === false ) { - return owner.hasOwnProperty(chain); - } - if ( chain === '*' ) { - for ( const key in owner ) { - if ( owner.hasOwnProperty(key) === false ) { continue; } - delete owner[key]; - } - } else if ( owner.hasOwnProperty(chain) ) { - delete owner[chain]; - } - return true; - } - const prop = chain.slice(0, pos); - if ( - prop === '[]' && Array.isArray(owner) || - prop === '*' && owner instanceof Object - ) { - const next = chain.slice(pos + 1); - let found = false; - for ( const key of Object.keys(owner) ) { - found = findOwner(owner[key], next, prune) || found; - } - return found; - } - if ( owner.hasOwnProperty(prop) === false ) { return false; } - owner = owner[prop]; - chain = chain.slice(pos + 1); - } - }; - const mustProcess = function(root) { - for ( const needlePath of needlePaths ) { - if ( findOwner(root, needlePath) === false ) { - return false; - } - } - return true; - }; - const pruner = function(o) { - if ( mustProcess(o) === false ) { return o; } - for ( const path of prunePaths ) { - findOwner(o, path, true); - } - return o; - }; - JSON.parse = new Proxy(JSON.parse, { - apply: function() { - return pruner(Reflect.apply(...arguments)); - }, - }); - Response.prototype.json = new Proxy(Response.prototype.json, { - apply: function() { - return Reflect.apply(...arguments).then(o => pruner(o)); - }, - }); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-addeventlistener-if.entity -/// alias noaelif.entity -/// alias aeld.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noAddEventListenerIfEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const regexpFromArg = arg => { - if ( arg === '' ) { return /^/; } - if ( /^\/.+\/$/.test(arg) ) { return new RegExp(arg.slice(1,-1)); } - return new RegExp(arg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); -}; - -/******************************************************************************/ - -const scriptlet = ( - needle1 = '', - needle2 = '' -) => { - const reNeedle1 = regexpFromArg(needle1); - const reNeedle2 = regexpFromArg(needle2); - self.EventTarget.prototype.addEventListener = new Proxy( - self.EventTarget.prototype.addEventListener, - { - apply: function(target, thisArg, args) { - let type, handler; - try { - type = String(args[0]); - handler = String(args[1]); - } catch(ex) { - } - if ( - reNeedle1.test(type) === false || - reNeedle2.test(handler) === false - ) { - return target.apply(thisArg, args); - } - } - } - ); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-addeventlistener-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-addeventlistener-if -/// alias noaelif -/// alias addEventListener-defuser -/// alias aeld - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noAddEventListenerIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const regexpFromArg = arg => { - if ( arg === '' ) { return /^/; } - if ( /^\/.+\/$/.test(arg) ) { return new RegExp(arg.slice(1,-1)); } - return new RegExp(arg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); -}; - -/******************************************************************************/ - -const scriptlet = ( - needle1 = '', - needle2 = '' -) => { - const reNeedle1 = regexpFromArg(needle1); - const reNeedle2 = regexpFromArg(needle2); - self.EventTarget.prototype.addEventListener = new Proxy( - self.EventTarget.prototype.addEventListener, - { - apply: function(target, thisArg, args) { - let type, handler; - try { - type = String(args[0]); - handler = String(args[1]); - } catch(ex) { - } - if ( - reNeedle1.test(type) === false || - reNeedle2.test(handler) === false - ) { - return target.apply(thisArg, args); - } - } - } - ); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-fetch-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-fetch-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-fetch-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-fetch-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-fetch-if - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noFetchIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - conditions = '' -) => { - const needles = []; - for ( const condition of conditions.split(/\s+/) ) { - if ( condition === '' ) { continue; } - const pos = condition.indexOf(':'); - let key, value; - if ( pos !== -1 ) { - key = condition.slice(0, pos); - value = condition.slice(pos + 1); - } else { - key = 'url'; - value = condition; - } - if ( value === '' ) { - value = '^'; - } else if ( value.startsWith('/') && value.endsWith('/') ) { - value = value.slice(1, -1); - } else { - value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needles.push({ key, re: new RegExp(value) }); - } - self.fetch = new Proxy(self.fetch, { - apply: function(target, thisArg, args) { - let proceed = true; - try { - let details; - if ( args[0] instanceof self.Request ) { - details = args[0]; - } else { - details = Object.assign({ url: args[0] }, args[1]); - } - const props = new Map(); - for ( const prop in details ) { - let v = details[prop]; - if ( typeof v !== 'string' ) { - try { v = JSON.stringify(v); } - catch(ex) { } - } - if ( typeof v !== 'string' ) { continue; } - props.set(prop, v); - } - proceed = needles.length === 0; - for ( const { key, re } of needles ) { - if ( - props.has(key) === false || - re.test(props.get(key)) === false - ) { - proceed = true; - break; - } - } - } catch(ex) { - } - return proceed - ? Reflect.apply(target, thisArg, args) - : Promise.resolve(new Response()); - } - }); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-setinterval-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-setinterval-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-setinterval-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-setinterval-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-setinterval-if -/// alias no-setInterval-if -/// alias nosiif - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noSetIntervalIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - needle = '', - delay = '' -) => { - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( delay === '' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1,-1); - } else if ( needle !== '' ) { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const reNeedle = new RegExp(needle); - const regexpTest = RegExp.prototype.test; - self.setInterval = new Proxy(self.setInterval, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - const b = args[1]; - let defuse; - if ( needle !== '' ) { - defuse = regexpTest.call(reNeedle, a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } - return target.apply(thisArg, args); - } - }); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-settimeout-if.entity -/// alias no-setTimeout-if.entity -/// alias nostif.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noSetTimeoutIfEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const scriptlet = ( - needle = '', - delay = '' -) => { - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( delay === '' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1,-1); - } else if ( needle !== '' ) { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const reNeedle = new RegExp(needle); - const regexpTest = RegExp.prototype.test; - self.setTimeout = new Proxy(self.setTimeout, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - const b = args[1]; - let defuse; - if ( needle !== '' ) { - defuse = regexpTest.call(reNeedle, a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } - return target.apply(thisArg, args); - } - }); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-settimeout-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-settimeout-if -/// alias no-setTimeout-if -/// alias nostif - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noSetTimeoutIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - needle = '', - delay = '' -) => { - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( delay === '' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - if ( needle.startsWith('/') && needle.endsWith('/') ) { - needle = needle.slice(1,-1); - } else if ( needle !== '' ) { - needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const reNeedle = new RegExp(needle); - const regexpTest = RegExp.prototype.test; - self.setTimeout = new Proxy(self.setTimeout, { - apply: function(target, thisArg, args) { - const a = String(args[0]); - const b = args[1]; - let defuse; - if ( needle !== '' ) { - defuse = regexpTest.call(reNeedle, a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - } - return target.apply(thisArg, args); - } - }); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-windowopen-if.entity -/// alias no-windowOpen-if.entity -/// alias nowoif.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noWindowOpenIfEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const scriptlet = ( - needle = '', - delay = '', - options = '' -) => { - const newSyntax = /^[01]?$/.test(needle) === false; - let pattern = ''; - let targetResult = true; - let autoRemoveAfter = -1; - if ( newSyntax ) { - pattern = needle; - if ( pattern.startsWith('!') ) { - targetResult = false; - pattern = pattern.slice(1); - } - autoRemoveAfter = parseInt(delay); - if ( isNaN(autoRemoveAfter) ) { - autoRemoveAfter = -1; - } - } else { - pattern = delay; - if ( needle === '0' ) { - targetResult = false; - } - } - if ( pattern === '' ) { - pattern = '.?'; - } else if ( /^\/.+\/$/.test(pattern) ) { - pattern = pattern.slice(1,-1); - } else { - pattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const rePattern = new RegExp(pattern); - const createDecoy = function(tag, urlProp, url) { - const decoy = document.createElement(tag); - decoy[urlProp] = url; - decoy.style.setProperty('height','1px', 'important'); - decoy.style.setProperty('position','fixed', 'important'); - decoy.style.setProperty('top','-1px', 'important'); - decoy.style.setProperty('width','1px', 'important'); - document.body.appendChild(decoy); - setTimeout(( ) => decoy.remove(), autoRemoveAfter * 1000); - return decoy; - }; - window.open = new Proxy(window.open, { - apply: function(target, thisArg, args) { - const url = args[0]; - if ( rePattern.test(url) !== targetResult ) { - return target.apply(thisArg, args); - } - if ( autoRemoveAfter < 0 ) { return null; } - const decoy = /\bobj\b/.test(options) - ? createDecoy('object', 'data', url) - : createDecoy('iframe', 'src', url); - let popup = decoy.contentWindow; - if ( typeof popup === 'object' && popup !== null ) { - Object.defineProperty(popup, 'closed', { value: false }); - } else { - const noopFunc = (function(){}).bind(self); - popup = new Proxy(self, { - get: function(target, prop) { - if ( prop === 'closed' ) { return false; } - const r = Reflect.get(...arguments); - if ( typeof r === 'function' ) { return noopFunc; } - return target[prop]; - }, - set: function() { - return Reflect.set(...arguments); - }, - }); - } - return popup; - } - }); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-windowopen-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,159 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-windowopen-if -/// alias no-windowOpen-if -/// alias nowoif -/// alias window.open-defuser - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noWindowOpenIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - needle = '', - delay = '', - options = '' -) => { - const newSyntax = /^[01]?$/.test(needle) === false; - let pattern = ''; - let targetResult = true; - let autoRemoveAfter = -1; - if ( newSyntax ) { - pattern = needle; - if ( pattern.startsWith('!') ) { - targetResult = false; - pattern = pattern.slice(1); - } - autoRemoveAfter = parseInt(delay); - if ( isNaN(autoRemoveAfter) ) { - autoRemoveAfter = -1; - } - } else { - pattern = delay; - if ( needle === '0' ) { - targetResult = false; - } - } - if ( pattern === '' ) { - pattern = '.?'; - } else if ( /^\/.+\/$/.test(pattern) ) { - pattern = pattern.slice(1,-1); - } else { - pattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - const rePattern = new RegExp(pattern); - const createDecoy = function(tag, urlProp, url) { - const decoy = document.createElement(tag); - decoy[urlProp] = url; - decoy.style.setProperty('height','1px', 'important'); - decoy.style.setProperty('position','fixed', 'important'); - decoy.style.setProperty('top','-1px', 'important'); - decoy.style.setProperty('width','1px', 'important'); - document.body.appendChild(decoy); - setTimeout(( ) => decoy.remove(), autoRemoveAfter * 1000); - return decoy; - }; - window.open = new Proxy(window.open, { - apply: function(target, thisArg, args) { - const url = args[0]; - if ( rePattern.test(url) !== targetResult ) { - return target.apply(thisArg, args); - } - if ( autoRemoveAfter < 0 ) { return null; } - const decoy = /\bobj\b/.test(options) - ? createDecoy('object', 'data', url) - : createDecoy('iframe', 'src', url); - let popup = decoy.contentWindow; - if ( typeof popup === 'object' && popup !== null ) { - Object.defineProperty(popup, 'closed', { value: false }); - } else { - const noopFunc = (function(){}).bind(self); - popup = new Proxy(self, { - get: function(target, prop) { - if ( prop === 'closed' ) { return false; } - const r = Reflect.get(...arguments); - if ( typeof r === 'function' ) { return noopFunc; } - return target[prop]; - }, - set: function() { - return Reflect.set(...arguments); - }, - }); - } - return popup; - } - }); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-xhr-if.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-xhr-if.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/no-xhr-if.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/no-xhr-if.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name no-xhr-if - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_noXhrIf() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - conditions = '' -) => { - const xhrInstances = new WeakMap(); - const needles = []; - for ( const condition of conditions.split(/\s+/) ) { - if ( condition === '' ) { continue; } - const pos = condition.indexOf(':'); - let key, value; - if ( pos !== -1 ) { - key = condition.slice(0, pos); - value = condition.slice(pos + 1); - } else { - key = 'url'; - value = condition; - } - if ( value === '' ) { - value = '^'; - } else if ( value.startsWith('/') && value.endsWith('/') ) { - value = value.slice(1, -1); - } else { - value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - } - needles.push({ key, re: new RegExp(value) }); - } - self.XMLHttpRequest = class extends self.XMLHttpRequest { - open(...args) { - const argNames = [ 'method', 'url' ]; - const haystack = new Map(); - for ( let i = 0; i < args.length && i < argNames.length; i++ ) { - haystack.set(argNames[i], args[i]); - } - if ( haystack.size !== 0 ) { - let matches = true; - for ( const { key, re } of needles ) { - matches = re.test(haystack.get(key) || ''); - if ( matches === false ) { break; } - } - if ( matches ) { - xhrInstances.set(this, haystack); - } - } - return super.open(...args); - } - send(...args) { - const haystack = xhrInstances.get(this); - if ( haystack === undefined ) { - return super.send(...args); - } - Object.defineProperties(this, { - readyState: { value: 4, writable: false }, - response: { value: '', writable: false }, - responseText: { value: '', writable: false }, - responseURL: { value: haystack.get('url'), writable: false }, - responseXML: { value: '', writable: false }, - status: { value: 200, writable: false }, - statusText: { value: 'OK', writable: false }, - }); - this.dispatchEvent(new Event('readystatechange')); - this.dispatchEvent(new Event('load')); - this.dispatchEvent(new Event('loadend')); - } - }; -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ - diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,116 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock + +*/ + +// ruleset: $rulesetId$ + +// Important! +// Isolate from global scope + +// Start of local scope +(function uBOL_$scriptletName$() { + +/******************************************************************************/ + +function $scriptletName$(){} + +/******************************************************************************/ + +const scriptletGlobals = {}; // eslint-disable-line +const argsList = self.$argsList$; +const hostnamesMap = new Map(self.$hostnamesMap$); +const exceptionsMap = new Map(self.$exceptionsMap$); +const hasEntities = self.$hasEntities$; +const hasAncestors = self.$hasAncestors$; + +const collectArgIndices = (hn, map, out) => { + let argsIndices = map.get(hn); + if ( argsIndices === undefined ) { return; } + if ( typeof argsIndices !== 'number' ) { + for ( const argsIndex of argsIndices ) { + out.add(argsIndex); + } + } else { + out.add(argsIndices); + } +}; + +const indicesFromHostname = (hostname, suffix = '') => { + const hnParts = hostname.split('.'); + const hnpartslen = hnParts.length; + if ( hnpartslen === 0 ) { return; } + for ( let i = 0; i < hnpartslen; i++ ) { + const hn = `${hnParts.slice(i).join('.')}${suffix}`; + collectArgIndices(hn, hostnamesMap, todoIndices); + collectArgIndices(hn, exceptionsMap, tonotdoIndices); + } + if ( hasEntities ) { + const n = hnpartslen - 1; + for ( let i = 0; i < n; i++ ) { + for ( let j = n; j > i; j-- ) { + const en = `${hnParts.slice(i,j).join('.')}.*${suffix}`; + collectArgIndices(en, hostnamesMap, todoIndices); + collectArgIndices(en, exceptionsMap, tonotdoIndices); + } + } + } +}; + +const entries = (( ) => { + const docloc = document.location; + const origins = [ docloc.origin ]; + if ( docloc.ancestorOrigins ) { + origins.push(...docloc.ancestorOrigins); + } + return origins.map((origin, i) => { + const beg = origin.lastIndexOf('://'); + if ( beg === -1 ) { return; } + const hn = origin.slice(beg+3) + const end = hn.indexOf(':'); + return { hn: end === -1 ? hn : hn.slice(0, end), i }; + }).filter(a => a !== undefined); +})(); +if ( entries.length === 0 ) { return; } + +const todoIndices = new Set(); +const tonotdoIndices = new Set(); + +indicesFromHostname(entries[0].hn); +if ( hasAncestors ) { + for ( const entry of entries ) { + if ( entry.i === 0 ) { continue; } + indicesFromHostname(entry.hn, '>>'); + } +} + +// Apply scriplets +for ( const i of todoIndices ) { + if ( tonotdoIndices.has(i) ) { continue; } + try { $scriptletName$(...argsList[i]); } + catch { } +} + +/******************************************************************************/ + +// End of local scope +})(); + +void 0; diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/set-constant.entity.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.entity.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/set-constant.entity.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.entity.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name set-constant.entity -/// alias set.entity - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_setConstantEntity() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const entitiesMap = new Map(self.$entitiesMap$); - -/******************************************************************************/ - -const scriptlet = ( - chain = '', - cValue = '' -) => { - if ( chain === '' ) { return; } - if ( cValue === 'undefined' ) { - cValue = undefined; - } else if ( cValue === 'false' ) { - cValue = false; - } else if ( cValue === 'true' ) { - cValue = true; - } else if ( cValue === 'null' ) { - cValue = null; - } else if ( cValue === "''" ) { - cValue = ''; - } else if ( cValue === '[]' ) { - cValue = []; - } else if ( cValue === '{}' ) { - cValue = {}; - } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; - } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; - } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; - } else if ( /^\d+$/.test(cValue) ) { - cValue = parseFloat(cValue); - if ( isNaN(cValue) ) { return; } - if ( Math.abs(cValue) > 0x7FFF ) { return; } - } else { - return; - } - let aborted = false; - const mustAbort = function(v) { - if ( aborted ) { return true; } - aborted = - (v !== undefined && v !== null) && - (cValue !== undefined && cValue !== null) && - (typeof v !== typeof cValue); - return aborted; - }; - // https://github.com/uBlockOrigin/uBlock-issues/issues/156 - // Support multiple trappers for the same property. - const trapProp = function(owner, prop, configurable, handler) { - if ( handler.init(owner[prop]) === false ) { return; } - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if ( odesc instanceof Object ) { - owner[prop] = cValue; - if ( odesc.get instanceof Function ) { - prevGetter = odesc.get; - } - if ( odesc.set instanceof Function ) { - prevSetter = odesc.set; - } - } - try { - Object.defineProperty(owner, prop, { - configurable, - get() { - if ( prevGetter !== undefined ) { - prevGetter(); - } - return handler.getter(); // cValue - }, - set(a) { - if ( prevSetter !== undefined ) { - prevSetter(a); - } - handler.setter(a); - } - }); - } catch(ex) { - } - }; - const trapChain = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - trapProp(owner, chain, false, { - v: undefined, - init: function(v) { - if ( mustAbort(v) ) { return false; } - this.v = v; - return true; - }, - getter: function() { - return cValue; - }, - setter: function(a) { - if ( mustAbort(a) === false ) { return; } - cValue = a; - } - }); - return; - } - const prop = chain.slice(0, pos); - const v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v instanceof Object || typeof v === 'object' && v !== null ) { - trapChain(v, chain); - return; - } - trapProp(owner, prop, true, { - v: undefined, - init: function(v) { - this.v = v; - return true; - }, - getter: function() { - return this.v; - }, - setter: function(a) { - this.v = a; - if ( a instanceof Object ) { - trapChain(a, chain); - } - } - }); - }; - trapChain(window, chain); -}; - -/******************************************************************************/ - -const hnparts = []; -try { hnparts.push(...document.location.hostname.split('.')); } catch(ex) { } -const hnpartslen = hnparts.length - 1; -for ( let i = 0; i < hnpartslen; i++ ) { - for ( let j = hnpartslen; j > i; j-- ) { - const hn = hnparts.slice(i).join('.'); - const en = hnparts.slice(i,j).join('.'); - let argsIndices = entitiesMap.get(en); - if ( argsIndices === undefined ) { continue; } - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } -} - -argsList.length = 0; -entitiesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/set-constant.js ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.js --- ublock-origin-1.46.0+dfsg/platform/mv3/scriptlets/set-constant.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/set-constant.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2019-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock - - The scriptlets below are meant to be injected only into a - web page context. -*/ - -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -/// name set-constant -/// alias set - -/******************************************************************************/ - -// Important! -// Isolate from global scope -(function uBOL_setConstant() { - -/******************************************************************************/ - -// $rulesetId$ - -const argsList = self.$argsList$; - -const hostnamesMap = new Map(self.$hostnamesMap$); - -/******************************************************************************/ - -const scriptlet = ( - chain = '', - cValue = '' -) => { - if ( chain === '' ) { return; } - if ( cValue === 'undefined' ) { - cValue = undefined; - } else if ( cValue === 'false' ) { - cValue = false; - } else if ( cValue === 'true' ) { - cValue = true; - } else if ( cValue === 'null' ) { - cValue = null; - } else if ( cValue === "''" ) { - cValue = ''; - } else if ( cValue === '[]' ) { - cValue = []; - } else if ( cValue === '{}' ) { - cValue = {}; - } else if ( cValue === 'noopFunc' ) { - cValue = function(){}; - } else if ( cValue === 'trueFunc' ) { - cValue = function(){ return true; }; - } else if ( cValue === 'falseFunc' ) { - cValue = function(){ return false; }; - } else if ( /^\d+$/.test(cValue) ) { - cValue = parseFloat(cValue); - if ( isNaN(cValue) ) { return; } - if ( Math.abs(cValue) > 0x7FFF ) { return; } - } else { - return; - } - let aborted = false; - const mustAbort = function(v) { - if ( aborted ) { return true; } - aborted = - (v !== undefined && v !== null) && - (cValue !== undefined && cValue !== null) && - (typeof v !== typeof cValue); - return aborted; - }; - // https://github.com/uBlockOrigin/uBlock-issues/issues/156 - // Support multiple trappers for the same property. - const trapProp = function(owner, prop, configurable, handler) { - if ( handler.init(owner[prop]) === false ) { return; } - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if ( odesc instanceof Object ) { - owner[prop] = cValue; - if ( odesc.get instanceof Function ) { - prevGetter = odesc.get; - } - if ( odesc.set instanceof Function ) { - prevSetter = odesc.set; - } - } - try { - Object.defineProperty(owner, prop, { - configurable, - get() { - if ( prevGetter !== undefined ) { - prevGetter(); - } - return handler.getter(); // cValue - }, - set(a) { - if ( prevSetter !== undefined ) { - prevSetter(a); - } - handler.setter(a); - } - }); - } catch(ex) { - } - }; - const trapChain = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - trapProp(owner, chain, false, { - v: undefined, - init: function(v) { - if ( mustAbort(v) ) { return false; } - this.v = v; - return true; - }, - getter: function() { - return cValue; - }, - setter: function(a) { - if ( mustAbort(a) === false ) { return; } - cValue = a; - } - }); - return; - } - const prop = chain.slice(0, pos); - const v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v instanceof Object || typeof v === 'object' && v !== null ) { - trapChain(v, chain); - return; - } - trapProp(owner, prop, true, { - v: undefined, - init: function(v) { - this.v = v; - return true; - }, - getter: function() { - return this.v; - }, - setter: function(a) { - this.v = a; - if ( a instanceof Object ) { - trapChain(a, chain); - } - } - }); - }; - trapChain(window, chain); -}; - -/******************************************************************************/ - -let hn; -try { hn = document.location.hostname; } catch(ex) { } -while ( hn ) { - if ( hostnamesMap.has(hn) ) { - let argsIndices = hostnamesMap.get(hn); - if ( typeof argsIndices === 'number' ) { argsIndices = [ argsIndices ]; } - for ( const argsIndex of argsIndices ) { - const details = argsList[argsIndex]; - if ( details.n && details.n.includes(hn) ) { continue; } - try { scriptlet(...details.a); } catch(ex) {} - } - } - if ( hn === '*' ) { break; } - const pos = hn.indexOf('.'); - if ( pos !== -1 ) { - hn = hn.slice(pos + 1); - } else { - hn = '*'; - } -} - -argsList.length = 0; -hostnamesMap.clear(); - -/******************************************************************************/ - -})(); - -/******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/nodejs/.eslintrc.json ublock-origin-1.67.0+dfsg/platform/nodejs/.eslintrc.json --- ublock-origin-1.46.0+dfsg/platform/nodejs/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/nodejs/.eslintrc.json 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,38 @@ +{ + "root": true, + "env": { + "es2021": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "rules": { + "eqeqeq": [ "warn", "always" ], + "indent": [ + "warn", + 4, + { + "ArrayExpression": "first", + "CallExpression": { "arguments": "first" }, + "MemberExpression": "off", + "ObjectExpression": "off", + "ignoreComments": true, + "ignoredNodes": [ + "AssignmentExpression:has(Literal)" + ] + } + ], + "getter-return": "off", + "no-control-regex": "off", + "no-empty": [ "error", { "allowEmptyCatch": true } ], + "no-promise-executor-return": [ "error" ], + "no-template-curly-in-string": [ "error" ], + "no-unreachable-loop": [ "error" ], + "no-useless-backreference": [ "error" ], + "no-useless-escape": "off", + "require-atomic-updates": [ "warn" ] + } +} diff -Nru ublock-origin-1.46.0+dfsg/platform/nodejs/README.md ublock-origin-1.67.0+dfsg/platform/nodejs/README.md --- ublock-origin-1.46.0+dfsg/platform/nodejs/README.md 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/nodejs/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -# uBlock Origin Core - -The core filtering engines used in the uBlock Origin ("uBO") extension, and has -no external dependencies. - -## Installation - -Install: `npm install @gorhill/ubo-core` - -This is a very early version and the API is subject to change at any time. - -This package uses [native JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules). - - -## Description - -The package contains uBO's static network filtering engine ("SNFE"), which -purpose is to parse and enforce filter lists. The matching algorithm is highly -efficient, and _especially_ optimized to match against large sets of pure -hostnames. - -The SNFE can be fed filter lists from a variety of sources, such as [EasyList/EasyPrivacy](https://easylist.to/), -[uBlock filters](https://github.com/uBlockOrigin/uAssets/tree/master/filters), -and also lists of domain names or hosts file format (i.e. block lists from [The Block List Project](https://github.com/blocklistproject/Lists#the-block-list-project), -[Steven Black's HOSTS](https://github.com/StevenBlack/hosts#readme), etc). - - -## Usage - -At the moment, there can be only one instance of the static network filtering -engine ("SNFE"), which proxy API must be imported as follow: - -```js -import { StaticNetFilteringEngine } from '@gorhill/ubo-core'; -``` - -If you must import as a NodeJS module: - -```js -const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core'); -``` - - -Create an instance of SNFE: - -```js -const snfe = StaticNetFilteringEngine.create(); -``` - -Feed the SNFE with filter lists -- `useLists()` accepts an array of -objects (or promises to object) which expose the raw text of a list -through the `raw` property, and optionally the name of the list through the -`name` property (how you fetch the lists is up to you): - -```js -await snfe.useLists([ - fetch('easylist').then(raw => ({ name: 'easylist', raw })), - fetch('easyprivacy').then(raw => ({ name: 'easyprivacy', raw })), -]); -``` - -Now we are ready to match network requests: - -```js -// Not blocked -if ( snfe.matchRequest({ - originURL: 'https://www.bloomberg.com/', - url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css', - type: 'stylesheet' -}) !== 0 ) { - console.log(snfe.toLogData()); -} - -// Blocked -if ( snfe.matchRequest({ - originURL: 'https://www.bloomberg.com/', - url: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js', - type: 'script' -}) !== 0 ) { - console.log(snfe.toLogData()); -} - -// Unblocked -if ( snfe.matchRequest({ - originURL: 'https://www.bloomberg.com/', - url: 'https://sourcepointcmp.bloomberg.com/ccpa.js', - type: 'script' -}) !== 0 ) { - console.log(snfe.toLogData()); -} -``` - -It is possible to pre-parse filter lists and save the intermediate results for -later use -- useful to speed up the loading of filter lists. This will be -documented eventually, but if you feel adventurous, you can look at the code -and use this capability now if you figure out the details. - ---- - -## Extras - -You can directly use specific APIs exposed by this package, here are some of -them, which are used internally by uBO's SNFE. - -### HNTrieContainer - -A well optimised [compressed trie](https://en.wikipedia.org/wiki/Trie#Compressing_tries) -container specialized to specifically store and lookup hostnames. - -The matching algorithm is designed for hostnames, i.e. the hostname labels -making up a hostname are matched from right to left, such that `www.example.org` -with be a match if `example.org` is stored into the trie, while -`anotherexample.org` won't be a match. - -`HNTrieContainer` is designed to store a large number of hostnames with CPU and -memory efficiency as a main concern -- and is a key component of uBO. - -To create and use a standalone `HNTrieContainer` object: - -```js -import HNTrieContainer from '@gorhill/ubo-core/js/hntrie.js'; - -const trieContainer = new HNTrieContainer(); - -const aTrie = trieContainer.createOne(); -trieContainer.add(aTrie, 'example.org'); -trieContainer.add(aTrie, 'example.com'); - -const anotherTrie = trieContainer.createOne(); -trieContainer.add(anotherTrie, 'foo.invalid'); -trieContainer.add(anotherTrie, 'bar.invalid'); - -// matches() return the position at which the match starts, or -1 when -// there is no match. - -// Matches: return 4 -console.log("trieContainer.matches(aTrie, 'www.example.org')", trieContainer.matches(aTrie, 'www.example.org')); - -// Does not match: return -1 -console.log("trieContainer.matches(aTrie, 'www.foo.invalid')", trieContainer.matches(aTrie, 'www.foo.invalid')); - -// Does not match: return -1 -console.log("trieContainer.matches(anotherTrie, 'www.example.org')", trieContainer.matches(anotherTrie, 'www.example.org')); - -// Matches: return 0 -console.log("trieContainer.matches(anotherTrie, 'foo.invalid')", trieContainer.matches(anotherTrie, 'foo.invalid')); -``` - -The `reset()` method must be used to remove all the tries from a trie container, -you can't remove a single trie from the container. - -```js -trieContainer.reset(); -``` - -When you reset a trie container, you can't use the reference to prior instances -of trie, i.e. `aTrie` and `anotherTrie` are no longer valid and shouldn't be -used following a reset. diff -Nru ublock-origin-1.46.0+dfsg/platform/nodejs/build.js ublock-origin-1.67.0+dfsg/platform/nodejs/build.js --- ublock-origin-1.46.0+dfsg/platform/nodejs/build.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/nodejs/build.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,12 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - import fs from 'fs'; - import { pslInit } from './index.js'; /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/nodejs/index.js ublock-origin-1.67.0+dfsg/platform/nodejs/index.js --- ublock-origin-1.46.0+dfsg/platform/nodejs/index.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/nodejs/index.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,31 +19,42 @@ Home: https://github.com/gorhill/uBlock */ -/* globals WebAssembly */ +/* globals process */ -'use strict'; +import * as s14e from './js/s14e-serializer.js'; +import * as sfp from './js/static-filtering-parser.js'; -/******************************************************************************/ +import { + CompiledListReader, + CompiledListWriter, +} from './js/static-filtering-io.js'; +import { + TextDecoder, + TextEncoder, +} from 'util'; +import { + dirname, + resolve +} from 'path'; +import { + domainToASCII, + fileURLToPath +} from 'url'; +import { FilteringContext } from './js/filtering-context.js'; +import { LineIterator } from './js/text-utils.js'; import { createRequire } from 'module'; - +import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js'; import { readFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { domainToASCII, fileURLToPath } from 'url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); +import snfe from './js/static-net-filtering.js'; -import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js'; +/******************************************************************************/ -import snfe from './js/static-net-filtering.js'; -import { FilteringContext } from './js/filtering-context.js'; -import { LineIterator } from './js/text-utils.js'; -import { StaticFilteringParser } from './js/static-filtering-parser.js'; +const __dirname = dirname(fileURLToPath(import.meta.url)); -import { - CompiledListReader, - CompiledListWriter, -} from './js/static-filtering-io.js'; +// https://stackoverflow.com/questions/69187442/const-utf8encoder-new-textencoder-in-node-js +globalThis.TextDecoder = TextDecoder; +globalThis.TextEncoder = TextEncoder; /******************************************************************************/ @@ -110,6 +121,7 @@ /******************************************************************************/ function compileList({ name, raw }, compiler, writer, options = {}) { + if ( typeof raw !== 'string' || raw === '' ) { return; } const lineIter = new LineIterator(raw); const events = Array.isArray(options.events) ? options.events : undefined; @@ -117,7 +129,9 @@ writer.properties.set('name', name); } - const { parser } = compiler; + const parser = new sfp.AstFilterParser({ + maxTokenLength: snfe.MAX_TOKEN_LENGTH, + }); while ( lineIter.eot() === false ) { let line = lineIter.next(); @@ -125,13 +139,10 @@ if ( lineIter.peek(4) !== ' ' ) { break; } line = line.slice(0, -2).trim() + lineIter.next().trim(); } - parser.analyze(line); - if ( parser.shouldIgnore() ) { continue; } - if ( parser.category !== parser.CATStaticNetFilter ) { continue; } - if ( parser.patternHasUnicode() && parser.toASCII() === false ) { - continue; - } - if ( compiler.compile(writer) ) { continue; } + parser.parse(line); + if ( parser.isFilter() === false ) { continue; } + if ( parser.isNetworkFilter() === false ) { continue; } + if ( compiler.compile(parser, writer) ) { continue; } if ( compiler.error !== undefined && events !== undefined ) { options.events.push({ type: 'error', @@ -164,7 +175,7 @@ if ( typeof compiled !== 'string' || compiled === '' ) { const writer = new CompiledListWriter(); if ( compiler === null ) { - compiler = snfe.createCompiler(new StaticFilteringParser()); + compiler = snfe.createCompiler(); } compiled = compileList(list, compiler, writer, options); } @@ -174,13 +185,12 @@ // Populate filtering engine with resolved filter lists const promises = []; for ( const list of lists ) { - const promise = list instanceof Promise ? list : Promise.resolve(list); - promises.push(promise.then(list => consumeList(list))); + promises.push(Promise.resolve(list).then(list => consumeList(list))); } useLists.promise = Promise.all(promises); await useLists.promise; - useLists.promise = null; // eslint-disable-line require-atomic-updates + useLists.promise = null; // Commit changes snfe.freeze(); @@ -219,6 +229,7 @@ } filterQuery(details) { + fctx.redirectURL = undefined; const directives = snfe.filterQuery(fctx.fromDetails(details)); if ( directives === undefined ) { return; } return { redirectURL: fctx.redirectURL, directives }; @@ -240,12 +251,14 @@ return compileList(...args); } - serialize() { - return snfe.serialize(); + async serialize() { + const data = snfe.serialize(); + return s14e.serialize(data, { compress: true }); } - deserialize(serialized) { - return snfe.unserialize(serialized); + async deserialize(serialized) { + const data = s14e.deserialize(serialized); + return snfe.unserialize(data); } static async create({ noPSL = false } = {}) { @@ -272,7 +285,7 @@ // module.exports. Once all included files are written like ES modules, using // export statements, this should no longer be necessary. if ( typeof module !== 'undefined' && typeof exports !== 'undefined' ) { - module.exports = exports; + module.exports = exports; // eslint-disable-line no-undef } export { diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/.eslintrc.json ublock-origin-1.67.0+dfsg/platform/npm/.eslintrc.json --- ublock-origin-1.46.0+dfsg/platform/npm/.eslintrc.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -{ - "root": true, - "env": { - "es2021": true, - "node": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "rules": { - "eqeqeq": [ "warn", "always" ], - "indent": [ - "warn", - 4, - { - "ArrayExpression": "first", - "CallExpression": { "arguments": "first" }, - "MemberExpression": "off", - "ObjectExpression": "off", - "ignoreComments": true, - "ignoredNodes": [ - "AssignmentExpression:has(Literal)" - ] - } - ], - "getter-return": "off", - "no-control-regex": "off", - "no-empty": [ "error", { "allowEmptyCatch": true } ], - "no-promise-executor-return": [ "error" ], - "no-template-curly-in-string": [ "error" ], - "no-unreachable-loop": [ "error" ], - "no-useless-backreference": [ "error" ], - "no-useless-escape": "off", - "require-atomic-updates": [ "warn" ] - } -} diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/README.md ublock-origin-1.67.0+dfsg/platform/npm/README.md --- ublock-origin-1.46.0+dfsg/platform/npm/README.md 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/README.md 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,170 @@ +# uBlock Origin Core + +The core filtering engines used in the uBlock Origin ("uBO") extension, and has +no external dependencies. + +## Installation + +Install: `npm install @gorhill/ubo-core` + +This is a very early version and the API is subject to change at any time. + +This package uses [native JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules). + + +## Description + +The package contains uBO's static network filtering engine ("SNFE"), which +purpose is to parse and enforce filter lists. The matching algorithm is highly +efficient, and _especially_ optimized to match against large sets of pure +hostnames. + +The SNFE can be fed filter lists from a variety of sources, such as [EasyList/EasyPrivacy](https://easylist.to/), +[uBlock filters](https://github.com/uBlockOrigin/uAssets/tree/master/filters), +and also lists of domain names or hosts file format (i.e. block lists from [The Block List Project](https://github.com/blocklistproject/Lists#the-block-list-project), +[Steven Black's HOSTS](https://github.com/StevenBlack/hosts#readme), etc). + + +## Usage + +See `./demo.js` in package for instructions to quickly get started. + +At the moment, there can be only one instance of the static network filtering +engine ("SNFE"), which proxy API must be imported as follow: + +```js +import { StaticNetFilteringEngine } from '@gorhill/ubo-core'; +``` + +If you must import as a NodeJS module: + +```js +const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core'); +``` + + +Create an instance of SNFE: + +```js +const snfe = await StaticNetFilteringEngine.create(); +``` + +Feed the SNFE with filter lists -- `useLists()` accepts an array of +objects (or promises to object) which expose the raw text of a list +through the `raw` property, and optionally the name of the list through the +`name` property (how you fetch the lists is up to you): + +```js +await snfe.useLists([ + fetch('easylist').then(r => r.text()).then(raw => ({ name: 'easylist', raw })), + fetch('easyprivacy').then(r => r.text()).then(raw => ({ name: 'easyprivacy', raw })), +]); +``` + +Now we are ready to match network requests: + +```js +// Not blocked +if ( snfe.matchRequest({ + originURL: 'https://www.bloomberg.com/', + url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css', + type: 'stylesheet' +}) !== 0 ) { + console.log(snfe.toLogData()); +} + +// Blocked +if ( snfe.matchRequest({ + originURL: 'https://www.bloomberg.com/', + url: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js', + type: 'script' +}) !== 0 ) { + console.log(snfe.toLogData()); +} + +// Unblocked +if ( snfe.matchRequest({ + originURL: 'https://www.bloomberg.com/', + url: 'https://sourcepointcmp.bloomberg.com/ccpa.js', + type: 'script' +}) !== 0 ) { + console.log(snfe.toLogData()); +} +``` + +Once all the filter lists are loaded into the static network filtering engine, +you can serialize the content of the engine into a JS string: + +```js +const serializedData = await snfe.serialize(); +``` + +You can save and later use that JS string to fast-load the content of the +static network filtering engine without having to parse and compile the lists: + +```js +const snfe = await StaticNetFilteringEngine.create(); +await snfe.deserialize(serializedData); +``` + +--- + +## Extras + +You can directly use specific APIs exposed by this package, here are some of +them, which are used internally by uBO's SNFE. + +### HNTrieContainer + +A well optimised [compressed trie](https://en.wikipedia.org/wiki/Trie#Compressing_tries) +container specialized to specifically store and lookup hostnames. + +The matching algorithm is designed for hostnames, i.e. the hostname labels +making up a hostname are matched from right to left, such that `www.example.org` +with be a match if `example.org` is stored into the trie, while +`anotherexample.org` won't be a match. + +`HNTrieContainer` is designed to store a large number of hostnames with CPU and +memory efficiency as a main concern -- and is a key component of uBO. + +To create and use a standalone `HNTrieContainer` object: + +```js +import HNTrieContainer from '@gorhill/ubo-core/js/hntrie.js'; + +const trieContainer = new HNTrieContainer(); + +const aTrie = trieContainer.createOne(); +trieContainer.add(aTrie, 'example.org'); +trieContainer.add(aTrie, 'example.com'); + +const anotherTrie = trieContainer.createOne(); +trieContainer.add(anotherTrie, 'foo.invalid'); +trieContainer.add(anotherTrie, 'bar.invalid'); + +// matches() return the position at which the match starts, or -1 when +// there is no match. + +// Matches: return 4 +console.log("trieContainer.matches(aTrie, 'www.example.org')", trieContainer.matches(aTrie, 'www.example.org')); + +// Does not match: return -1 +console.log("trieContainer.matches(aTrie, 'www.foo.invalid')", trieContainer.matches(aTrie, 'www.foo.invalid')); + +// Does not match: return -1 +console.log("trieContainer.matches(anotherTrie, 'www.example.org')", trieContainer.matches(anotherTrie, 'www.example.org')); + +// Matches: return 0 +console.log("trieContainer.matches(anotherTrie, 'foo.invalid')", trieContainer.matches(anotherTrie, 'foo.invalid')); +``` + +The `reset()` method must be used to remove all the tries from a trie container, +you can't remove a single trie from the container. + +```js +trieContainer.reset(); +``` + +When you reset a trie container, you can't use the reference to prior instances +of trie, i.e. `aTrie` and `anotherTrie` are no longer valid and shouldn't be +used following a reset. diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/demo.js ublock-origin-1.67.0+dfsg/platform/npm/demo.js --- ublock-origin-1.46.0+dfsg/platform/npm/demo.js 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/demo.js 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,121 @@ +/******************************************************************************* + * + * A simple demo to quickly get started. + * + * Command line: + * + * mkdir myproject + * cd myproject + * npm install @gorhill/ubo-core + * cp node_modules/@gorhill/ubo-core/demo.js . + * + * There will be a `demo.js` file in your `myproject` folder, which you can + * modify and execute: + * + * node demo.js + * + * Since the demo here uses ES module syntax, you may want to add the following + * to the generated package.json file to avoid the warning: + * + * "type": "module", + * + * The demo will fetch filter lists from EasyList server, then serialize the + * content of the static network filtering engine into a local `./cache/` + * folder. + * + * The serialized data will be reused if available in order to avoid fetching + * from remote server each time it is executed. + * + * This demo is kept as simple as possible, so there is not a lot of error + * handling. + * + * */ + +import { StaticNetFilteringEngine } from '@gorhill/ubo-core'; +import fs from 'fs/promises'; + +/******************************************************************************/ + +async function fetchList(name, url) { + return fetch(url).then(r => { + return r.text(); + }).then(raw => { + console.log(`${name} fetched`); + return { name, raw }; + }).catch(reason => { + console.error(reason); + }); +} + +async function main() { + const pathToSelfie = 'cache/selfie.txt'; + + const snfe = await StaticNetFilteringEngine.create(); + + // Up to date serialization data (aka selfie) available? + let selfie; + const ageInDays = await fs.stat(pathToSelfie).then(stat => { + const fileDate = new Date(stat.mtime); + return (Date.now() - fileDate.getTime()) / (7 * 24 * 60 * 60); + }).catch(( ) => Number.MAX_SAFE_INTEGER); + + // Use a selfie if available and not older than 7 days + if ( ageInDays <= 7 ) { + selfie = await fs.readFile(pathToSelfie, { encoding: 'utf8' }) + .then(data => typeof data === 'string' && data !== '' && data) + .catch(( ) => { }); + if ( typeof selfie === 'string' ) { + await snfe.deserialize(selfie); + } + } + + // Fetch filter lists if no up to date selfie available + if ( !selfie ) { + console.log(`Fetching lists...`); + await snfe.useLists([ + fetchList('ubo-ads', 'https://ublockorigin.github.io/uAssetsCDN/filters/filters.min.txt'), + fetchList('ubo-badware', 'https://ublockorigin.github.io/uAssetsCDN/filters/badware.min.txt'), + fetchList('ubo-privacy', 'https://ublockorigin.github.io/uAssetsCDN/filters/privacy.min.txt'), + fetchList('ubo-unbreak', 'https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.min.txt'), + fetchList('ubo-quick', 'https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt'), + fetchList('easylist', 'https://easylist.to/easylist/easylist.txt'), + fetchList('easyprivacy', 'https://easylist.to/easylist/easyprivacy.txt'), + fetchList('plowe', 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext'), + ]); + const selfie = await snfe.serialize(); + await fs.mkdir('cache', { recursive: true }); + await fs.writeFile(pathToSelfie, selfie); + } + + // List of tests to perform + const tests = [ + { + originURL: 'https://www.bloomberg.com/', + url: 'https://www.google-analytics.com/gs.js', + type: 'script', + }, { + originURL: 'https://www.bloomberg.com/', + url: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js', + type: 'script', + }, { + originURL: 'https://www.bloomberg.com/', + url: 'https://bloomberg.com/main.css', + type: 'stylesheet', + } + ]; + + // Test each entry for a match against the content of the engine + for ( const test of tests ) { + console.log('\nRequest details:', test); + const r = snfe.matchRequest(test); + if ( r === 1 ) { // Blocked + console.log('Blocked:', snfe.toLogData()); + } else if ( r === 2 ) { // Unblocked + console.log('Unblocked:', snfe.toLogData()); + } else { // Not blocked + console.log('Not blocked'); + } + } +} + +main(); diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/package-lock.json ublock-origin-1.67.0+dfsg/platform/npm/package-lock.json --- ublock-origin-1.46.0+dfsg/platform/npm/package-lock.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/package-lock.json 2025-10-25 19:32:51.000000000 +0000 @@ -1,3038 +1,18 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.26", - "lockfileVersion": 2, + "version": "0.1.30", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gorhill/ubo-core", - "version": "0.1.26", + "version": "0.1.30", "license": "GPL-3.0-or-later", - "devDependencies": { - "c8": "^7.12.0", - "eslint": "^8.29.0", - "esm-world": "0.1.3", - "mocha": "^10.2.0", - "scaling-palm-tree": "github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f" - }, + "devDependencies": {}, "engines": { - "node": ">=14.0.0", + "node": ">=18.0.0", "npm": ">=6.14.4" } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/esm-world": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/esm-world/-/esm-world-0.1.3.tgz", - "integrity": "sha512-nzgmXAdSIuKf11R6Y1gFnnVkARCYvDobcPAdt85aKxw8lH5QOkwpdJ/2ezC/FIRSRxuebq/lsXnRVNRtJCyzDQ==", - "dev": true, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.14.4" - } - }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - } - }, - "node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/scaling-palm-tree": { - "resolved": "git+ssh://git@github.com/mjethani/scaling-palm-tree.git#15cf1ab37e038771e1ff8005edc46d95f176739f", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - }, - "dependencies": { - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "esm-world": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/esm-world/-/esm-world-0.1.3.tgz", - "integrity": "sha512-nzgmXAdSIuKf11R6Y1gFnnVkARCYvDobcPAdt85aKxw8lH5QOkwpdJ/2ezC/FIRSRxuebq/lsXnRVNRtJCyzDQ==", - "dev": true - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "scaling-palm-tree": { - "version": "git+ssh://git@github.com/mjethani/scaling-palm-tree.git#15cf1ab37e038771e1ff8005edc46d95f176739f", - "dev": true, - "from": "scaling-palm-tree@github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f" - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/package.json ublock-origin-1.67.0+dfsg/platform/npm/package.json --- ublock-origin-1.46.0+dfsg/platform/npm/package.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/package.json 2025-10-25 19:32:51.000000000 +0000 @@ -1,15 +1,11 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.26", + "version": "0.1.30", "description": "To create a working instance of uBlock Origin's static network filtering engine", "type": "module", "main": "index.js", "scripts": { - "build": "node build.js", - "lint": "eslint js/ *.js tests/*.js", - "test": "c8 --include=index.js --include=js/**/*.js node test.js --mocha", - "test-full-battery": "c8 --include=index.js --include=js/**/*.js node test.js --mocha --full-battery", - "check-leaks": "mocha --check-leaks tests/leaks.js" + "build": "node build.js" }, "repository": { "type": "git", @@ -31,14 +27,9 @@ }, "homepage": "https://github.com/gorhill/uBlock#readme", "engines": { - "node": ">=14.0.0", + "node": ">=18.0.0", "npm": ">=6.14.4" }, "devDependencies": { - "c8": "^7.12.0", - "eslint": "^8.29.0", - "esm-world": "0.1.3", - "mocha": "^10.2.0", - "scaling-palm-tree": "github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f" } } diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/test.js ublock-origin-1.67.0+dfsg/platform/npm/test.js --- ublock-origin-1.46.0+dfsg/platform/npm/test.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/test.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify @@ -19,15 +19,10 @@ Home: https://github.com/gorhill/uBlock */ -/* eslint-disable-next-line no-redeclare */ /* globals process */ -'use strict'; - -/******************************************************************************/ - -import { spawn } from "child_process"; import { promisify } from 'util'; +import { spawn } from "child_process"; /******************************************************************************/ diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/tests/_common.js ublock-origin-1.67.0+dfsg/platform/npm/tests/_common.js --- ublock-origin-1.46.0+dfsg/platform/npm/tests/_common.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/tests/_common.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/tests/leaks.js ublock-origin-1.67.0+dfsg/platform/npm/tests/leaks.js --- ublock-origin-1.46.0+dfsg/platform/npm/tests/leaks.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/tests/leaks.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/tests/request-data.js ublock-origin-1.67.0+dfsg/platform/npm/tests/request-data.js --- ublock-origin-1.46.0+dfsg/platform/npm/tests/request-data.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/tests/request-data.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/tests/snfe.js ublock-origin-1.67.0+dfsg/platform/npm/tests/snfe.js --- ublock-origin-1.46.0+dfsg/platform/npm/tests/snfe.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/tests/snfe.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify diff -Nru ublock-origin-1.46.0+dfsg/platform/npm/tests/wasm.js ublock-origin-1.67.0+dfsg/platform/npm/tests/wasm.js --- ublock-origin-1.46.0+dfsg/platform/npm/tests/wasm.js 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/npm/tests/wasm.js 2025-10-25 19:32:51.000000000 +0000 @@ -1,6 +1,6 @@ /******************************************************************************* - uBlock Origin - a browser extension to block requests. + uBlock Origin - a comprehensive, efficient content blocker Copyright (C) 2014-present Raymond Hill This program is free software: you can redistribute it and/or modify diff -Nru ublock-origin-1.46.0+dfsg/platform/opera/manifest.json ublock-origin-1.67.0+dfsg/platform/opera/manifest.json --- ublock-origin-1.46.0+dfsg/platform/opera/manifest.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/opera/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -6,7 +6,8 @@ "browser_action": { "default_icon": { "16": "img/icon_16.png", - "32": "img/icon_32.png" + "32": "img/icon_32.png", + "64": "img/icon_64.png" }, "default_popup": "popup-fenix.html", "default_title": "uBlock Origin" @@ -29,6 +30,9 @@ }, "toggle-cosmetic-filtering": { "description": "__MSG_toggleCosmeticFiltering__" + }, + "toggle-javascript": { + "description": "__MSG_toggleJavascript__" } }, "content_scripts": [ @@ -53,14 +57,25 @@ "https://filterlists.com/*", "https://forums.lanik.us/*", "https://github.com/*", - "https://*.github.io/*", - "https://*.letsblock.it/*" + "https://*.github.io/*" ], "js": [ "/js/scriptlets/subscriber.js" ], "run_at": "document_idle", "all_frames": false + }, + { + "matches": [ + "https://github.com/uBlockOrigin/*", + "https://ublockorigin.github.io/*", + "https://*.reddit.com/r/uBlockOrigin/*" + ], + "js": [ + "/js/scriptlets/updater.js" + ], + "run_at": "document_idle", + "all_frames": false } ], "default_locale": "en", @@ -73,10 +88,11 @@ }, "incognito": "split", "manifest_version": 2, - "minimum_opera_version": "53.0", + "minimum_opera_version": "79.0", "name": "uBlock Origin", "options_page": "dashboard.html", "permissions": [ + "alarms", "contextMenus", "privacy", "storage", diff -Nru ublock-origin-1.46.0+dfsg/platform/thunderbird/manifest.json ublock-origin-1.67.0+dfsg/platform/thunderbird/manifest.json --- ublock-origin-1.46.0+dfsg/platform/thunderbird/manifest.json 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/platform/thunderbird/manifest.json 2025-10-25 19:32:51.000000000 +0000 @@ -1,8 +1,8 @@ { - "applications": { + "browser_specific_settings": { "gecko": { "id": "uBlock0@raymondhill.net", - "strict_min_version": "78.0" + "strict_min_version": "91.0" } }, "author": "Raymond Hill & contributors", @@ -41,14 +41,25 @@ "https://filterlists.com/*", "https://forums.lanik.us/*", "https://github.com/*", - "https://*.github.io/*", - "https://*.letsblock.it/*" + "https://*.github.io/*" ], "js": [ "/js/scriptlets/subscriber.js" ], "run_at": "document_idle", "all_frames": false + }, + { + "matches": [ + "https://github.com/uBlockOrigin/*", + "https://ublockorigin.github.io/*", + "https://*.reddit.com/r/uBlockOrigin/*" + ], + "js": [ + "/js/scriptlets/updater.js" + ], + "run_at": "document_idle", + "all_frames": false } ], "default_locale": "en", @@ -66,6 +77,7 @@ "open_in_tab": true }, "permissions": [ + "alarms", "privacy", "storage", "tabs", diff -Nru ublock-origin-1.46.0+dfsg/src/1p-filters.html ublock-origin-1.67.0+dfsg/src/1p-filters.html --- ublock-origin-1.46.0+dfsg/src/1p-filters.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/1p-filters.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,10 +3,10 @@ + uBlock — Your filters - @@ -23,17 +23,18 @@
    - -

    question-circle

    -   +  

    +

    +
    +
    -
    +
    @@ -44,7 +45,6 @@ - @@ -52,14 +52,14 @@ - - - - - + + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/3p-filters.html ublock-origin-1.67.0+dfsg/src/3p-filters.html --- ublock-origin-1.46.0+dfsg/src/3p-filters.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/3p-filters.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,6 +3,7 @@ + uBlock — Filter lists @@ -17,11 +18,10 @@
    -
    - +

    + - -

    +

    @@ -39,44 +39,75 @@
    -
    -
    +
    + +
    + +
    search
    +
    +
    - diff -Nru ublock-origin-1.46.0+dfsg/src/advanced-settings.html ublock-origin-1.67.0+dfsg/src/advanced-settings.html --- ublock-origin-1.46.0+dfsg/src/advanced-settings.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/advanced-settings.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,6 +3,7 @@ + @@ -13,7 +14,7 @@ - + @@ -23,13 +24,13 @@
    -
    +
    - + diff -Nru ublock-origin-1.46.0+dfsg/src/asset-viewer.html ublock-origin-1.67.0+dfsg/src/asset-viewer.html --- ublock-origin-1.46.0+dfsg/src/asset-viewer.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/asset-viewer.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,45 +3,45 @@ + - - + - +
    - + spinner
    -
    +
    - - - - - + + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/blank.html ublock-origin-1.67.0+dfsg/src/blank.html --- ublock-origin-1.46.0+dfsg/src/blank.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/blank.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,11 @@ + + + + + + +uBO blank + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/code-viewer.html ublock-origin-1.67.0+dfsg/src/code-viewer.html --- ublock-origin-1.46.0+dfsg/src/code-viewer.html 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/code-viewer.html 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,54 @@ + + + + + + +Code viewer + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/css/1p-filters.css ublock-origin-1.67.0+dfsg/src/css/1p-filters.css --- ublock-origin-1.46.0+dfsg/src/css/1p-filters.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/1p-filters.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } @@ -9,15 +10,24 @@ height: 100%; justify-content: stretch; overflow: hidden; + overflow-y: auto; width: 100%; } .body { flex-shrink: 0; } +/* https://github.com/uBlockOrigin/uBlock-issues/issues/3058 */ +:root.mobile body { + min-height: unset; + } +html:not(.mobile) [data-i18n="1pTrustWarning"] { + font-weight: bold; + } .codeMirrorContainer { flex-grow: 1; } #userFilters { + min-height: 8em; text-align: left; word-wrap: normal; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/3p-filters.css ublock-origin-1.67.0+dfsg/src/css/3p-filters.css --- ublock-origin-1.46.0+dfsg/src/css/3p-filters.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/3p-filters.css 2025-10-25 19:32:51.000000000 +0000 @@ -7,7 +7,6 @@ } #actions { background-color: var(--surface-1); - padding: var(--default-gap-small) 0 var(--default-gap-xsmall) 0; position: sticky; top: 0; z-index: 10; @@ -15,141 +14,216 @@ #buttonUpdate.active { pointer-events: none; } -#buttonUpdate.active .fa-icon svg { +#buttonUpdate.active .fa-icon svg, +body.working #buttonUpdate:not(.disabled) .fa-icon svg { animation: spin 1s linear infinite; transform-origin: 50%; } -#listsOfBlockedHostsPrompt { - cursor: pointer; + +body.updating #actions, +body.working #actions { + cursor: progress; } -#lists { - margin: 0.5em 0 0 0; - padding: 0; +body.updating #actions #buttonUpdate, +body.working #actions button { + pointer-events: none; } -#listsOfBlockedHostsPrompt::before, -.groupEntry:not([data-groupkey="user"]) .geDetails::before { - color: var(--ink-3); - content: '\2212'; - font-family: monospace; - font-size: large; - margin-inline-end: 0.25em; - -webkit-margin-end: 0.25em; - } -body.hideUnused #listsOfBlockedHostsPrompt::before, -.groupEntry.hideUnused:not([data-groupkey="user"]) .geDetails::before { - content: '+'; + +.listExpander { + font-size: 18px; + padding: 0; } -.groupEntry { - margin: 0.5em 0; +.listExpander:first-child { + justify-content: flex-start; + min-width: 20px; + } +.listExpander:not(:first-child) { + color: var(--checkbox-checked-ink); + fill: var(--checkbox-checked-ink); } -.groupEntry .geDetails { - cursor: pointer; +.listExpander svg { + transform: rotate(90deg); + transform-origin: 50%; } -.groupEntry .geName { - pointer-events: none; + +#lists .fa-icon:hover { + transform: scale(1.25); } -.groupEntry .geCount { - color: var(--ink-3); - font-size: 90%; - pointer-events: none; + +#lists .rootstats.expanded .listExpander svg { + transform: rotate(180deg); } -.listEntries { - margin-inline-start: 0.6em; - -webkit-margin-start: 0.6em; + +#lists .searchfield { + margin-block-start: calc(var(--font-size) * 0.75); + margin-inline-start: var(--checkbox-size); + } +#lists.searchMode > .listEntries .listEntries, +#lists.searchMode > .listEntries .listEntry.searchMatch { + display: flex !important; } -.groupEntry:not([data-groupkey="user"]) .listEntry:not(.isDefault).unused { +#lists.searchMode > .listEntries .listEntry { display: none; } -.listEntry > * { - margin-left: 0; - margin-right: 0; - unicode-bidi: embed; +#lists.searchMode > .listEntries .listExpander { + visibility: hidden; + } + +#listsOfBlockedHostsPrompt { + cursor: pointer; } -.listEntry .listname { + +#lists .listEntries { + display: flex; + flex-direction: column; + margin-inline-start: var(--checkbox-size); + } +#lists > .listEntries { + margin-inline-start: 0; + } +#lists .listEntry { + align-items: flex-start; + flex-direction: column; + margin-bottom: 0; + margin-inline-start: 0; white-space: nowrap; } -.listEntry.toRemove .checkbox { - visibility: hidden; +#lists .listEntry[data-key="user"] { + margin-top: 0; } -.listEntry.toRemove .listname { - text-decoration: line-through; +#lists .listEntry > .detailbar { + column-gap: calc(var(--default-gap-xxsmall) + 2px); + display: inline-flex; + } +#lists .listEntry[data-key="user"] > .detailbar { + display: none; + } +#lists .listEntry[data-role="node"].expanded > .detailbar .listExpander svg { + transform: rotate(180deg); + } +#lists .listEntry[data-parent="root"]:not(.expanded) > .listEntries > .listEntry:not(.checked):not(.isDefault):not(.stickied) { + display: none; + } +#lists .listEntry:not([data-parent="root"]):not(.expanded) > .listEntries > .listEntry { + display: none; } -.listEntry a, -.listEntry .fa-icon, -.listEntry .counts { +#lists .nodestats { + align-self: flex-end; color: var(--info0-ink); fill: var(--info0-ink); - display: none; + cursor: default; + font-size: var(--font-size-smaller); +} +#lists .iconbar { + column-gap: var(--default-gap-xxsmall); + color: var(--info0-ink); + fill: var(--info0-ink); + display: inline-flex; + flex-direction: row; font-size: 120%; - margin: 0 0.2em 0 0; } -.listEntry .fa-icon:hover { - transform: scale(1.25); +#lists .iconbar a { + color: var(--info0-ink); + fill: var(--info0-ink); } -.listEntry .content { +#lists .iconbar .fa-icon { + display: none; + } +#lists .iconbar .content { display: inline-flex; } -.listEntry a.towiki { +#lists .iconbar a.towiki { display: inline-flex; } -.listEntry.support a.support { +#lists .listEntry > .detailbar .iconbar a.support { display: inline-flex; } -.listEntry .remove, -.listEntry .unsecure, -.listEntry .failed { +#lists .listEntry > .detailbar .iconbar a.support[href="#"] { + display: none; + } +#lists .iconbar .remove, +#lists .iconbar .unsecure, +#lists .iconbar .failed { color: var(--info3-ink); fill: var(--info3-ink); cursor: pointer; } -.listEntry.external .remove { +#lists .listEntry.external > .detailbar .iconbar .remove { display: inline-flex; } -.listEntry.mustread a.mustread { +#lists .listEntry > .detailbar .iconbar a.mustread { color: var(--info1-ink); fill: var(--info1-ink); display: inline-flex; } -.listEntry .counts { - font-size: smaller; +#lists .listEntry > .detailbar .iconbar a.mustread[href="#"] { + display: none; + } +#lists .listEntry .leafstats { + align-items: flex-end; + color: var(--info0-ink); + fill: var(--info0-ink); + display: none; + font-size: var(--font-size-xsmall); + margin-inline-start: calc(var(--checkbox-size) + var(--checkbox-margin-end)); } -.listEntry.checked .counts { - display: inline-block; +#lists .listEntry > .detailbar .leafstats { + margin-inline-start: 0; + } +#lists .listEntry.checked > .leafstats, +#lists .listEntry.checked > .detailbar .leafstats { + display: inline-flex; } -.listEntry .status { +#lists .iconbar .status { cursor: default; display: none; } -.listEntry.checked.unsecure .unsecure { +#lists .listEntry.checked.unsecure > .detailbar .iconbar .unsecure { display: inline-flex; } -.listEntry.failed .failed { +#lists .listEntry.failed > .detailbar .iconbar .failed { display: inline-flex; } -.listEntry .cache { +#lists .iconbar .cache { cursor: pointer; } -.listEntry.checked.cached:not(.obsolete) .cache { +#lists .listEntry.checked.cached:not(.obsolete) > .detailbar .iconbar .cache { display: inline-flex; } -.listEntry .obsolete { +#lists .listEntry.cached.recent:not(.obsolete) > .detailbar .iconbar .cache { + color: var(--dashboard-happy-green); + fill: var(--dashboard-happy-green); + } +#lists .iconbar .obsolete { color: var(--info2-ink); fill: var(--info2-ink); } -body:not(.updating) .listEntry.checked.obsolete .obsolete { +body:not(.updating,.working) #lists .listEntry.checked.obsolete > .detailbar .iconbar .obsolete { display: inline-flex; } -.listEntry .updating { +#lists .iconbar .updating { transform-origin: 50%; } -body.updating .listEntry.checked.obsolete .updating { +body.updating #lists .listEntry.checked.obsolete > .detailbar .iconbar .updating, +body.working #lists .listEntry.checked.obsolete:not(.cached) > .detailbar .iconbar .updating { animation: spin 1s steps(8) infinite; display: inline-flex; } -.listEntry.toImport { - margin: 0.5em 0; + +#lists .listEntry.toRemove .checkbox { + visibility: hidden; } -.listEntry.toImport textarea { +#lists .listEntry.toRemove .listname { + text-decoration: line-through; + } + +#lists .listEntry[data-role="import"].expanded .listExpander svg { + transform: rotate(180deg); + } +#lists .listEntry[data-role="import"].expanded textarea { + visibility: visible; + } +#lists .listEntry[data-role="import"] textarea { border: 1px solid #ccc; box-sizing: border-box; display: block; @@ -161,32 +235,3 @@ white-space: pre; width: 100%; } -.listEntry.toImport.checked textarea { - visibility: visible; - } - -/* touch-screen devices */ -:root.mobile .listEntry .fa-icon { - font-size: 120%; - margin: 0 0.5em 0 0; - } -:root.mobile .listEntries { - margin-inline-start: 0; - -webkit-margin-start: 0; - } -:root.mobile .li.listEntry { - /* background-color: var(--bg-1); */ - overflow-x: auto; - } -:root.mobile .li.listEntry label > span:not([class]) { - flex-grow: 1; - } -:root.mobile .li.listEntry .listname, -:root.mobile .li.listEntry .iconbar { - align-items: flex-start; - display: flex; - white-space: nowrap; - } -:root.mobile .li.listEntry .iconbar { - margin-top: 0.2em; - } diff -Nru ublock-origin-1.46.0+dfsg/src/css/advanced-settings.css ublock-origin-1.67.0+dfsg/src/css/advanced-settings.css --- ublock-origin-1.46.0+dfsg/src/css/advanced-settings.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/advanced-settings.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/asset-viewer.css ublock-origin-1.67.0+dfsg/src/css/asset-viewer.css --- ublock-origin-1.46.0+dfsg/src/css/asset-viewer.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/asset-viewer.css 2025-10-25 19:32:51.000000000 +0000 @@ -23,6 +23,7 @@ display: flex; flex-direction: column; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; padding: 0; diff -Nru ublock-origin-1.46.0+dfsg/src/css/code-viewer.css ublock-origin-1.67.0+dfsg/src/css/code-viewer.css --- ublock-origin-1.46.0+dfsg/src/css/code-viewer.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/code-viewer.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,68 @@ +body { + border: 0; + display: flex; + flex-direction: column; + height: 100vh; + height: 100svh; + margin: 0; + overflow: hidden; + padding: 0; + width: 100vw; + } +#header { + background-color: var(--cm-gutter-surface); + border-bottom: 1px solid var(--surface-1); + padding: var(--default-gap-xsmall); + position: relative; + z-index: 1000000; + } +#header input[type="url"] { + box-sizing: border-box; + font-size: var(--font-size-smaller); + width: 100%; + } +#header:focus-within #pastURLs { + display: flex; + } +#currentURL { + display: flex; + gap: 0.5rem; + } +#currentURL > .fa-icon { + padding: 0 0.5rem; + } +#currentURL > .fa-icon:hover { + background-color: var(--surface-3); + } +#pastURLs { + background-color: var(--surface-0); + border: 1px solid var(--border-1); + display: none; + flex-direction: column; + font-size: var(--font-size-smaller); + position: absolute; + } +#pastURLs > span { + cursor: pointer; + overflow: hidden; + padding: 2px 4px; + text-overflow: ellipsis; + white-space: nowrap; + width: 75vw; + } +#pastURLs > span.selected { + font-weight: bold; + } +#pastURLs > span:hover { + background-color: var(--surface-1); + } +#content { + flex-grow: 1; + } + +.cm-href { + cursor: pointer; + } +.cm-href:hover { + text-decoration: underline; + } diff -Nru ublock-origin-1.46.0+dfsg/src/css/codemirror.css ublock-origin-1.67.0+dfsg/src/css/codemirror.css --- ublock-origin-1.46.0+dfsg/src/css/codemirror.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/codemirror.css 2025-10-25 19:32:51.000000000 +0000 @@ -3,6 +3,13 @@ overflow: hidden; position: relative; } +.codeMirrorContainer.cm-maximized { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + } .CodeMirror { background-color: var(--surface-0); box-sizing: border-box; @@ -23,8 +30,15 @@ } .CodeMirror-foldmarker { color: var(--cm-foldmarker-ink); - font-size: large; - text-shadow: none; + cursor: pointer; + font-family: sans-serif; + font-weight: bold; + } +.CodeMirror-foldgutter-folded::after { + content: '\25B6'; + } +.CodeMirror-foldgutter-open::after { + content: '\25BC'; } .CodeMirror-gutters { background-color: var(--cm-gutter-surface); @@ -68,59 +82,67 @@ word-break: break-all; } -.cm-s-default .cm-comment { +.cm-theme-override .cm-s-default .cm-comment { color: var(--sf-comment-ink); } -.cm-s-default .cm-def { +.cm-theme-override .cm-s-default .cm-def { color: var(--sf-def-ink); } -.cm-s-default .cm-directive { +.cm-theme-override .cm-s-default .cm-directive { color: var(--sf-directive-ink); font-weight: bold; } -.cm-s-default .cm-error { +.cm-theme-override .cm-s-default .cm-error { color: inherit; } -.cm-s-default .cm-error, +.cm-theme-override .cm-s-default .cm-error, .CodeMirror-linebackground.error { background-color: var(--sf-error-surface); - text-decoration: underline var(--sf-error-ink); - text-underline-position: under; + text-decoration: var(--sf-error-ink) dashed underline; } -.cm-s-default .cm-link { +.cm-theme-override .cm-s-default .cm-link { text-decoration: none; } -.cm-s-default .cm-link:hover { +.cm-theme-override .cm-s-default .cm-link:hover { color: var(--link-ink); } -.cm-s-default .cm-keyword { +.cm-theme-override .cm-s-default .cm-keyword { color: var(--sf-keyword-ink); } -.cm-s-default .cm-negative { +.cm-theme-override .cm-s-default .cm-negative { color: var(--cm-negative); } -.cm-s-default .cm-positive { +.cm-theme-override .cm-s-default .cm-positive { color: var(--cm-positive); } -.cm-s-default .cm-notice { - text-underline-position: under; +.cm-theme-override .cm-s-default .cm-notice { text-decoration-color: var(--sf-notice-ink); text-decoration-style: solid; text-decoration-line: underline; } -.cm-s-default .cm-tag { +.cm-theme-override .cm-s-default .cm-unicode { + text-decoration-color: var(--sf-unicode-ink); + text-decoration-style: dashed; + text-decoration-line: underline; + } +.cm-theme-override .cm-s-default .cm-tag { color: var(--sf-tag-ink); } -.cm-s-default .cm-value { color: var(--sf-value-ink); } -.cm-s-default .cm-variable { +.cm-theme-override .cm-s-default .cm-value { + color: var(--sf-value-ink); + } +.cm-theme-override .cm-s-default .cm-variable { color: var(--sf-variable-ink); } -.cm-s-default .cm-warning { +.cm-theme-override .cm-s-default .CodeMirror-activeline .cm-ext-js .cm-variable { + text-decoration: underline color-mix(in srgb, var(--sf-variable-ink) 30%, transparent) solid 3px; + text-decoration-skip-ink: none; + } +.cm-theme-override .cm-s-default .cm-warning { background-color: var(--sf-warning-surface); text-decoration: underline var(--sf-warning-ink); - text-underline-position: under; } -.cm-s-default .cm-readonly { +.cm-theme-override .cm-s-default .cm-readonly { color: var(--sf-readonly-ink); } @@ -142,58 +164,108 @@ } .cm-search-widget { - align-items: center; background-color: var(--cm-gutter-surface); border-bottom: 1px solid var(--cm-gutter-border); cursor: default; direction: ltr; display: flex; flex-shrink: 0; + flex-wrap: wrap; justify-content: space-between; - padding: 0.5em; + line-height: 1.5; + padding: var(--default-gap-xsmall); + row-gap: var(--default-gap-xsmall); user-select: none; -moz-user-select: none; -webkit-user-select: none; z-index: 1000; } +.cm-search-widget > * { + flex-grow: 1; + } +.cm-search-widget > :last-child { + text-align: end; + } + +.cm-search-widget .cm-maximize { + fill: none; + flex-grow: 0; + font-size: 130%; + height: 1em; + stroke-width: 3px; + stroke: var(--ink-0); + width: 1em; + } +.cm-search-widget .cm-maximize * { + pointer-events: none; + } +.codeMirrorContainer[data-maximizable="false"] .cm-search-widget .cm-maximize { + display: none; + } +.codeMirrorContainer .cm-search-widget .cm-maximize svg > path:nth-child(2), +.codeMirrorContainer.cm-maximized .cm-search-widget .cm-maximize svg > path:nth-child(1) { + display: none; + } +.codeMirrorContainer.cm-maximized .cm-search-widget .cm-maximize svg > path:nth-child(2) { + display: initial; + } +html:not(.mobile) .cm-search-widget .cm-maximize:hover { + transform: scale(1.2); + } + .cm-search-widget-input { display: inline-flex; flex-grow: 1; + flex-wrap: nowrap; } .cm-search-widget .fa-icon { - fill: var(--cm-gutter-ink); font-size: 140%; } -.cm-search-widget .fa-icon:not(.fa-icon-ro):hover { - fill: var(--ink-1); +html:not(.mobile) .cm-search-widget .fa-icon:not(.fa-icon-ro):hover { + transform: scale(1.2); } .cm-search-widget-input input { - border: 1px solid var(--cm-gutter-ink); - display: inline-flex; flex-grow: 1; - max-width: 16em; + max-width: min(16em, 40svw); } .cm-search-widget-count { align-items: center; display: inline-flex; flex-grow: 0; - font-size: 95%; - min-width: 6em; + font-size: var(--font-size-smaller); visibility: hidden; } -.cm-search-widget[data-query] .cm-search-widget-count:not(:empty) { +.cm-search-widget[data-query] .cm-search-widget-count { visibility: visible; } -.cm-search-widget .cm-search-widget-button:hover { - color: #000; +.cm-search-widget[data-query] .cm-search-widget-count:empty { + visibility: hidden; } .cm-search-widget .sourceURL[href=""] { display: none; } +:root.mobile .cm-search-widget .sourceURL[href=""] { + display: none; + } + +.cm-linter-widget { + align-items: center; + display: none; + flex-grow: 1; + } +.cm-linter-widget:not([data-lint="0"]) { + display: inline-flex; + } +.cm-linter-widget .cm-linter-widget-count { + color: var(--accent-surface-1); + fill: var(--accent-surface-1); + font-size: var(--font-size-smaller); + } + .cm-searching.cm-overlay { - background-color: var(--cm-searching-surface); + background-color: var(--cm-searching-surface) !important; border: 0; - color: var(--cm-searching-ink); + color: var(--cm-searching-ink) !important; } .CodeMirror-merge { @@ -239,3 +311,54 @@ .CodeMirror-activeline-background { background-color: var(--cm-active-line); } + +.CodeMirror-lintmarker { + height: calc(var(--font-size) - 2px); + margin-top: 1px; + position: relative; + } +.CodeMirror-lintmarker > * { + position: absolute; + } +.CodeMirror-lintmarker[data-error="y"] { + background-color: var(--sf-error-ink); + } +.CodeMirror-lintmarker .msg { + background-color: var(--surface-0); + border: 1px solid var(--sf-error-ink); + color: var(--ink-1); + display: none; + filter: drop-shadow(2px 2px 4px #0008); + left: 100%; + padding: var(--default-gap-xsmall); + top: -2px; + white-space: pre; + } +.CodeMirror-lintmarker svg { + height: 70%; + left: 15%; + top: 15%; + width: 70%; + } +.CodeMirror-lintmarker[data-error="y"] svg { + display: none; + } +.CodeMirror-lintmarker[data-fold="start"] { + fill: var(--cm-foldmarker-ink); + } +.CodeMirror-lintmarker[data-fold="start"].folded svg { + transform: rotate(-90deg); + } +.CodeMirror-lintmarker[data-fold="end"] { + fill: var(--border-2); + } +.CodeMirror-lintmarker[data-error="y"]:hover > span, +.CodeMirror-lintmarker[data-error="y"] > span:hover { + display: initial; + } + +/* https://github.com/uBlockOrigin/uBlock-issues/issues/3645 */ +.CodeMirror-vscrollbar { + pointer-events: initial !important; + } + diff -Nru ublock-origin-1.46.0+dfsg/src/css/common.css ublock-origin-1.67.0+dfsg/src/css/common.css --- ublock-origin-1.46.0+dfsg/src/css/common.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/common.css 2025-10-25 19:32:51.000000000 +0000 @@ -37,6 +37,7 @@ --default-gap-small: 12px; --default-gap-xsmall: 8px; --default-gap-xxsmall: 4px; + --button-font-size: max(calc(var(--font-size) * 0.875), 14px); } /* Common uBO styles */ @@ -52,11 +53,11 @@ margin: 0; padding: 0; } -a { +a:not(.fa-icon) { color: var(--link-ink); fill: var(--link-ink); } -a:hover { +a:not(.fa-icon):hover { color: var(--link-hover-ink); fill: var(--link-hover-ink); } @@ -79,13 +80,13 @@ appearance: none; -moz-appearance: none; -webkit-appearance: none; - border: 0; + border: var(--button-border-size) solid var(--ink-1); border-radius: var(--button-border-radius); background-color: var(--button-surface); color: var(--button-ink); display: inline-flex; fill: var(--button-ink); - font-size: 14px; + font-size: var(--button-font-size); justify-content: center; min-height: 36px; padding: 0 var(--font-size); @@ -174,14 +175,13 @@ - To have a single checkbox design across all platforms. */ .checkbox { - --margin-end: calc(var(--font-size) * 0.75); box-sizing: border-box; display: inline-flex; flex-shrink: 0; height: var(--checkbox-size); margin: 0; - margin-inline-end: var(--margin-end); - -webkit-margin-end: var(--margin-end); + margin-inline-end: var(--checkbox-margin-end); + -webkit-margin-end: var(--checkbox-margin-end); position: relative; width: var(--checkbox-size); } @@ -193,7 +193,7 @@ height: 100%; margin: 0; min-width: var(--checkbox-size); - opacity: 0; + opacity: var(--native-control-opacity); position: absolute; width: 100%; } @@ -204,6 +204,7 @@ box-sizing: border-box; fill: none; height: 100%; + opacity: calc(1 - var(--native-control-opacity)); pointer-events: none; position: absolute; stroke: none; @@ -219,6 +220,11 @@ .checkbox[disabled] ~ span { filter: var(--checkbox-disabled-filter); } +.checkbox.partial > input[type="checkbox"]:checked + svg { + background-color: var(--surface-1); + border-color: var(--checkbox-checked-ink); + stroke: var(--checkbox-checked-ink); + } .radio { --margin-end: calc(var(--font-size) * 0.75); @@ -237,7 +243,7 @@ height: 100%; margin: 0; min-width: var(--checkbox-size); - opacity: 0; + opacity: var(--native-control-opacity); position: absolute; width: 100%; } @@ -245,6 +251,7 @@ background-color: transparent; box-sizing: border-box; height: 100%; + opacity: calc(1 - var(--native-control-opacity)); pointer-events: none; position: absolute; width: 100%; @@ -267,6 +274,24 @@ padding: 2px; } +.searchfield { + align-items: center; + column-gap: var(--default-gap-xxsmall); + display: inline-flex; + position: relative; + } +.searchfield .fa-icon { + color: var(--ink-4); + fill: var(--ink-4); + font-size: 1em !important; + left: 2px; + position: absolute; + transform: none; + } +.searchfield input:not(:placeholder-shown) ~ .fa-icon { + display: none; + } + .hidden { display: none; height: 0; @@ -305,11 +330,18 @@ font-size: 1.2rem; padding: 0; } - button.iconified > [data-i18n] { + button.iconified:not(.dontshrink) > [data-i18n] { display: none; } } +.countryFlag { + height: var(--font-size); + position: relative; + top: calc(var(--font-size) / 7); + max-width: calc(var(--font-size) * 1.5); + } + .logo { align-items: center; display: inline-flex; @@ -320,6 +352,22 @@ width: 100%; } +.wikilink[href=""] { + display: none; + } +.wikilink.fa-icon { + color: var(--info0-ink); + fill: var(--info0-ink); + padding: var(--default-gap-xxsmall) var(--default-gap-xsmall); + } +.wikilink.fa-icon:hover { + transform: scale(1.2); + } +.wikilink.fa-icon > svg { + height: 1.25rem; + width: 1.25rem; + } + /* high dpi devices */ :root.hidpi button { font-family: Metropolis, sans-serif; diff -Nru ublock-origin-1.46.0+dfsg/src/css/dashboard-common.css ublock-origin-1.67.0+dfsg/src/css/dashboard-common.css --- ublock-origin-1.46.0+dfsg/src/css/dashboard-common.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/dashboard-common.css 2025-10-25 19:32:51.000000000 +0000 @@ -25,7 +25,7 @@ color: var(--info2-ink); fill: var(--info2-ink); } -.fa-icon.info.very-important { +.info.very-important { color: var(--info3-ink); fill: var(--info3-ink); } diff -Nru ublock-origin-1.46.0+dfsg/src/css/dashboard.css ublock-origin-1.67.0+dfsg/src/css/dashboard.css --- ublock-origin-1.46.0+dfsg/src/css/dashboard.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/dashboard.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,18 +1,25 @@ html, body { + background-color: var(--surface-0); display: flex; flex-direction: column; height: 100vh; + height: 100svh; justify-content: stretch; overflow: hidden; position: relative; width: 100vw; } +body.notReady { + display: none; + } #dashboard-nav { + align-items: center; + background-color: var(--surface-1); border: 0; border-bottom: 1px solid var(--border-1); display: flex; flex-shrink: 0; - flex-wrap: wrap; + justify-content: space-between; overflow-x: hidden; padding: 0; position: sticky; @@ -20,6 +27,11 @@ width: 100%; z-index: 10; } +#dashboard-nav > span { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + } .tabButton { background-color: transparent; border: 0; @@ -72,6 +84,7 @@ } #unsavedWarning > div:last-of-type { height: 100vh; + height: 100svh; position: absolute; width: 100vw; } @@ -102,11 +115,6 @@ border-bottom-color: var(--dashboard-tab-hover-border); } -/* touch-screen devices */ -:root.mobile #dashboard-nav { - flex-wrap: nowrap; - overflow-x: auto; - } :root.mobile #dashboard-nav .logo { display: none; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/devtools.css ublock-origin-1.67.0+dfsg/src/css/devtools.css --- ublock-origin-1.46.0+dfsg/src/css/devtools.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/devtools.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/document-blocked.css ublock-origin-1.67.0+dfsg/src/css/document-blocked.css --- ublock-origin-1.46.0+dfsg/src/css/document-blocked.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/document-blocked.css 2025-10-25 19:32:51.000000000 +0000 @@ -23,17 +23,26 @@ padding: var(--default-gap-xxlarge) var(--default-gap-small); justify-content: center; } +body.loading { + opacity: 0; + } :root.mobile body { padding: var(--default-gap-small); } #rootContainer { - width: min(100vw, 640px); + width: min(100%, 640px); } #rootContainer > * { margin: 0 0 var(--default-gap-xxlarge) 0; } +:root.mobile #rootContainer > * { + margin-bottom: var(--default-gap-xlarge); + } +p { + margin: 0.5em 0; + } a { text-decoration: none; } @@ -42,10 +51,14 @@ word-break: break-all; } #warningSign { + color: var(--accent-surface-1); + fill: var(--accent-surface-1); + font-size: 96px; + line-height: 1; width: 100%; } -#warningSign > a { - font-size: 96px; +:root.mobile #warningSign { + font-size: 64px; } #theURL { color: var(--ink-2); @@ -58,6 +71,14 @@ position: relative; z-index: 10; } +#theURL > p > span:first-of-type { + display: block; + max-height: 3lh; + overflow-y: auto; + } +:root.mobile #theURL > p > span:first-of-type { + max-height: 3lh; + } #theURL #toggleParse { background-color: transparent; top: 100%; @@ -110,15 +131,28 @@ font-weight: bold; } -#whyex a { +.why-extra a { white-space: nowrap; } -#whyex ul { +.why-extra ul { display: flex; flex-direction: column; margin: 0; padding-inline-start: var(--default-gap-xsmall); } +details > *:not(summary) { + margin-inline-start: 1em; + } + +#urlskip a { + display: block; + max-height: 3lh; + overflow-y: auto; + word-break: break-all; + } +:root.mobile #urlskip a { + max-height: 3lh; + } #actionContainer { display: flex; @@ -134,11 +168,14 @@ } .filterList { - display: flex; -} -.filterList .filterListSupport[href=""] { + white-space: nowrap; + } +.filterList .filterListSupport[href="#"] { display: none; } +.filterList .filterListSupport:not([href="#"]) { + margin-inline-start: 0.25em; + } /* Small-screen devices */ :root.mobile button { diff -Nru ublock-origin-1.46.0+dfsg/src/css/dom-inspector.css ublock-origin-1.67.0+dfsg/src/css/dom-inspector.css --- ublock-origin-1.46.0+dfsg/src/css/dom-inspector.css 1970-01-01 00:00:00.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/dom-inspector.css 2025-10-25 19:32:51.000000000 +0000 @@ -0,0 +1,41 @@ +html#ublock0-inspector, +#ublock0-inspector body { + background: transparent; + box-sizing: border-box; + height: 100vh; + height: 100svh; + margin: 0; + overflow: hidden; + width: 100vw; +} +#ublock0-inspector :focus { + outline: none; +} +#ublock0-inspector svg { + box-sizing: border-box; + height: 100%; + left: 0; + pointer-events: none; + position: fixed; + top: 0; + width: 100%; +} +#ublock0-inspector svg > path { + stroke-width: 1px; + } +#ublock0-inspector svg > path:nth-of-type(1) { + fill: rgba(255,0,0,0.2); + stroke: #F00; +} +#ublock0-inspector svg > path:nth-of-type(2) { + fill: rgba(0,255,0,0.2); + stroke: #0F0; +} +#ublock0-inspector svg > path:nth-of-type(3) { + fill: rgba(255,0,0,0.2); + stroke: #F00; +} +#ublock0-inspector svg > path:nth-of-type(4) { + fill: rgba(0,0,255,0.1); + stroke: #00F; +} diff -Nru ublock-origin-1.46.0+dfsg/src/css/dyna-rules.css ublock-origin-1.67.0+dfsg/src/css/dyna-rules.css --- ublock-origin-1.46.0+dfsg/src/css/dyna-rules.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/dyna-rules.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/epicker-ui.css ublock-origin-1.67.0+dfsg/src/css/epicker-ui.css --- ublock-origin-1.46.0+dfsg/src/css/epicker-ui.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/epicker-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,8 +1,13 @@ +:root { + --quit-button-size: max(4em, min(6em, calc(100vw / 8), calc(100vh / 8))); +} + html#ublock0-epicker, #ublock0-epicker body { background: transparent; cursor: not-allowed; height: 100vh; + height: 100svh; margin: 0; overflow: hidden; width: 100vw; @@ -13,29 +18,54 @@ #ublock0-epicker aside { background-color: var(--surface-1); border: 1px solid var(--border-2); - bottom: 2px; box-sizing: border-box; cursor: default; - display: none; - max-height: calc(100vh - 4px); - max-width: 36rem; - min-width: 24rem; + display: flex; + flex-direction: column; + max-width: min(32rem, 100vw - 4px); + min-width: min(24rem, 100vw - 4px); overflow-y: auto; - padding: 4px; position: fixed; - right: 2px; - width: calc(40% - 2px); + width: min(32rem, 100vw - 4px); + z-index: 100; } -/* https://github.com/uBlockOrigin/uBlock-issues/discussions/2114 */ -#ublock0-epicker aside { - min-width: min(24rem, 100vw - 4px); +#ublock0-epicker.zap aside { + bottom: unset !important; + min-width: unset !important; + top: 50%; + transform: translateY(-50%); + width: unset !important; +} +#ublock0-epicker.zap aside > section, +#ublock0-epicker.zap aside > ul, +#ublock0-epicker.zap aside > #windowbar > div:not(#quit) { + display: none; +} +#ublock0-epicker.zap aside > #windowbar > #quit { + width: var(--quit-button-size); + height: var(--quit-button-size); +} +#ublock0-epicker:not(.paused) aside, +#ublock0-epicker.minimized aside { + min-width: min(16rem, 100vw - 4px); + overflow: hidden; + width: min(16rem, 100vw - 4px); +} +#ublock0-epicker:not(.paused) aside > *:not(#windowbar), +#ublock0-epicker.minimized aside > *:not(#windowbar) { + display: none; } -#ublock0-epicker.paused:not(.zap) aside { - display: block; +#ublock0-epicker aside > *:not(:first-child) { + padding: 0 2px; } + #ublock0-epicker #toolbar { display: flex; + justify-content: space-between; } +#ublock0-epicker #toolbar button { + min-width: 5em; + } #ublock0-epicker ul { margin: 0.25em 0 0 0; } @@ -43,16 +73,6 @@ background-color: var(--button-preferred-surface); color: var(--button-preferred-ink); } -#ublock0-epicker #move { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAFElEQVQI12NgwAfKy8v/M5ANYLoBshgEyQo6H9UAAAAASUVORK5CYII='); - cursor: grab; - flex-grow: 1; - margin: 2px 4px; - opacity: 0.8; - } -#ublock0-epicker aside.moving #move { - cursor: grabbing; -} #ublock0-epicker section { border: 0; box-sizing: border-box; @@ -70,8 +90,8 @@ #ublock0-epicker section .codeMirrorContainer { border: none; box-sizing: border-box; - height: 8em; - max-height: 50vh; + height: 10em; + max-height: min(10em, 10vh); min-height: 1em; padding: 2px; width: 100%; @@ -129,8 +149,8 @@ ); display: inline-block; flex-shrink: 0; - height: 16px; - width: 16px; + height: 20px; + width: 20px; } .resultsetModifier > span > span:nth-of-type(3) { background-color: var(--surface-3); @@ -174,12 +194,9 @@ overflow: hidden; } #ublock0-epicker #candidateFilters { - max-height: 14em; + max-height: min(18em, 18vh); overflow-y: auto; } -#ublock0-epicker #candidateFilters > li:first-of-type { - margin-bottom: 0.5em; -} #ublock0-epicker .changeFilter > li > span:nth-of-type(1) { font-weight: bold; } @@ -187,6 +204,9 @@ font-size: smaller; color: gray; } +#ublock0-epicker #candidateFilters [data-i18n] { + font-size: 90%; +} #ublock0-epicker #candidateFilters .changeFilter { list-style-type: none; margin: 0 0 0 1em; @@ -207,36 +227,7 @@ background-color: var(--surface-2); } -/** - https://github.com/gorhill/uBlock/issues/3449 - https://github.com/uBlockOrigin/uBlock-issues/issues/55 -**/ -@keyframes startDialog { - 0% { opacity: 1.0; } - 60% { opacity: 1.0; } - 100% { opacity: 0.1; } -} -#ublock0-epicker.paused aside { - opacity: 0.1; - visibility: visible; - z-index: 100; -} -#ublock0-epicker.paused:not(.show):not(.hide) aside:not(:hover) { - animation-duration: 1.6s; - animation-name: startDialog; - animation-timing-function: linear; -} -#ublock0-epicker.paused aside:hover { - opacity: 1; -} -#ublock0-epicker.paused.show aside { - opacity: 1; -} -#ublock0-epicker.paused.hide aside { - opacity: 0.1; -} - -#ublock0-epicker svg { +#ublock0-epicker svg#sea { cursor: crosshair; box-sizing: border-box; height: 100%; @@ -245,26 +236,62 @@ top: 0; width: 100%; } -#ublock0-epicker.paused svg { +#ublock0-epicker.paused svg#sea { cursor: not-allowed; } -#ublock0-epicker svg > path:first-child { +#ublock0-epicker svg#sea > path:first-child { fill: rgba(0,0,0,0.5); fill-rule: evenodd; } -#ublock0-epicker svg > path + path { +#ublock0-epicker svg#sea > path + path { stroke: #F00; stroke-width: 0.5px; fill: rgba(255,63,63,0.20); } -#ublock0-epicker.zap svg > path + path { +#ublock0-epicker.zap svg#sea > path + path { stroke: #FF0; stroke-width: 0.5px; fill: rgba(255,255,63,0.20); } -#ublock0-epicker.preview svg > path { +#ublock0-epicker.preview svg#sea > path { fill: rgba(0,0,0,0.10); } -#ublock0-epicker.preview svg > path + path { +#ublock0-epicker.preview svg#sea > path + path { stroke: none; } + + +#ublock0-epicker #windowbar { + display: flex; +} +#ublock0-epicker #windowbar svg { + fill: none; + pointer-events: none; + stroke: var(--ink-1); + stroke-width: 3px; +} +#ublock0-epicker #windowbar #move { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAFElEQVQI12NgwAfKy8v/M5ANYLoBshgEyQo6H9UAAAAASUVORK5CYII='); + cursor: grab; + flex-grow: 1; + opacity: 0.8; +} +#ublock0-epicker aside.moving #windowbar #move { + cursor: grabbing; +} +#windowbar #quit, +#windowbar #minimize { + height: 2em; + width: 2em; +} +#windowbar #quit:hover, +#windowbar #minimize:hover { + background-color: var(--surface-2) +} +#ublock0-epicker.minimized #windowbar #minimize svg > path, +#windowbar #minimize svg > rect { + display: none; +} +#ublock0-epicker.minimized #windowbar #minimize svg > rect { + display: initial; +} diff -Nru ublock-origin-1.46.0+dfsg/src/css/fa-icons.css ublock-origin-1.67.0+dfsg/src/css/fa-icons.css --- ublock-origin-1.46.0+dfsg/src/css/fa-icons.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/fa-icons.css 2025-10-25 19:32:51.000000000 +0000 @@ -38,9 +38,19 @@ } .fa-icon.fa-icon-hflipped > svg { transform: scale(-1, 1); + transform-origin: 50%; } .fa-icon.fa-icon-vflipped > svg { transform: scale(1, -1); + transform-origin: 50%; + } +.fa-icon.fa-icon-rotright > svg { + transform: rotate(90deg); + transform-origin: 50%; + } +.fa-icon.fa-icon-rotleft > svg { + transform: rotate(-90deg); + transform-origin: 50%; } .fa-icon > svg { @@ -79,16 +89,21 @@ .fa-icon > .fa-icon_sun-o { width: calc(1em * 1708 / 1792); } +.fa-icon > .fa-icon_book, .fa-icon > .fa-icon_download-alt, .fa-icon > .fa-icon_font, .fa-icon > .fa-icon_search, .fa-icon > .fa-icon_spinner, .fa-icon > .fa-icon_unlink, .fa-icon > .fa-icon_upload-alt, +.fa-icon > .fa-icon_volume-up, .fa-icon > .fa-icon_zoom-in, .fa-icon > .fa-icon_zoom-out { width: calc(1em * 1664 / 1792); } +.fa-icon > .fa-icon_terminal { + width: calc(1em * 1651 / 1792); + } .fa-icon > .fa-icon_magic { width: calc(1em * 1637 / 1792); } Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/src/css/fonts/Inter/Inter-Regular.woff2 and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/rmJ2hduSsJ/ublock-origin-1.46.0+dfsg/src/css/fonts/Inter/Inter-SemiBold.woff2 and /srv/release.debian.org/tmp/8f08YrKL3z/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-SemiBold.woff2 differ diff -Nru ublock-origin-1.46.0+dfsg/src/css/logger-ui-inspector.css ublock-origin-1.67.0+dfsg/src/css/logger-ui-inspector.css --- ublock-origin-1.46.0+dfsg/src/css/logger-ui-inspector.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/logger-ui-inspector.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ #domInspector { display: none; + overflow: hidden; } #inspectors.dom #domInspector { display: flex; @@ -7,6 +8,12 @@ #domInspector .permatoolbar .highlightMode.invert { transform: rotate(180deg); } +#domInspector button.vExpandToggler > .fa-icon { + transform: scaleY(-1) + } +#domInspector button.vCompactToggler > .fa-icon { + transform: scaleY(1) + } #domInspector .vscrollable { overflow-x: auto; } @@ -84,7 +91,7 @@ display: none; } -#domInspector:not(.vExpanded) li:not(.hasCosmeticHide):not(.isCosmeticHide) { +#domInspector li:not(.hasCosmeticHide):not(.isCosmeticHide):not(.show) { display: none; } #domInspector #domTree > li { diff -Nru ublock-origin-1.46.0+dfsg/src/css/logger-ui.css ublock-origin-1.67.0+dfsg/src/css/logger-ui.css --- ublock-origin-1.46.0+dfsg/src/css/logger-ui.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/logger-ui.css 2025-10-25 19:32:51.000000000 +0000 @@ -2,13 +2,15 @@ display: flex; flex-direction: column; height: 100vh; - overflow: hidden; + height: 100svh; + overflow-y: hidden; width: 100vw; } textarea { box-sizing: border-box; direction: ltr; - resize: none; + min-height: 6rem; + resize: vertical; width: 100%; } .permatoolbar { @@ -61,22 +63,35 @@ => https://devhints.io/css-system-font-stack */ #inspectors { + display: flex; + flex-direction: column; flex-grow: 1; + flex-wrap: nowrap; font-family: "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + overflow: hidden; + position: relative; } .inspector { - border-top: 1px solid #ccc; + border-top: 1px solid var(--border-4); display: flex; flex-direction: column; + height: 100%; + } +.inspector .permatoolbar { + border-bottom: 1px solid var(--border-1); } .vscrollable { direction: ltr; flex-grow: 1; font-size: var(--font-size-smaller); + height: 1px; /* necessary for proper space allocation by flex boxes */ overflow-x: hidden; overflow-y: auto; } +#domInspector button.vExpandToggler > .fa-icon { + transform: scaleY(1) + } .inspector:not(.vExpanded) button.vCompactToggler > .fa-icon { transform: scaleY(-1) } @@ -100,7 +115,6 @@ } #netInspector #filterExprGroup { display: flex; - margin: 0 1em; position: relative; } #netInspector #filterButton { @@ -168,7 +182,7 @@ cursor: pointer; display: inline-flex; margin: 0 0.5em 0 0; - padding: 0.5em; + padding: 0.25em; white-space: nowrap; } #netInspector #filterExprPicker span[data-filtex]:last-of-type { @@ -178,8 +192,11 @@ background-color: rgb(var(--primary-70) / 25%); border: 1px solid rgb(var(--primary-70)); } -#netInspector #filterExprPicker span.on[data-filtex] { +#netInspector #filterExprPicker span.on[data-filtex], +#filterExprButton.active { background-color: rgb(var(--primary-70) / 40%); + } +#netInspector #filterExprPicker span.on[data-filtex] { border: 1px solid rgb(var(--primary-70)); } @@ -210,6 +227,7 @@ width: 100%; } #vwRenderer .logEntry { + background-color: var(--surface-1); display: block; left: 0; overflow: hidden; @@ -220,15 +238,19 @@ display: none; } #vwRenderer .logEntry > div { + border-bottom: 1px dotted var(--border-1); + box-sizing: border-box; + display: flex; height: 100%; + max-height: 200px; white-space: nowrap; } #vwRenderer .logEntry > div[data-status="1"], -#netFilteringDialog > .panes > .details > div[data-status="1"] { +.netFilteringDialog > .panes > .details > div[data-status="1"] { background-color: rgb(var(--popup-cell-block-surface-rgb) / 50%); } #vwRenderer .logEntry > div[data-status="1"][data-modifier], -#netFilteringDialog > .panes > .details > div[data-status="1"][data-modifier] { +.netFilteringDialog > .panes > .details > div[data-status="1"][data-modifier] { background-color: var(--logger-modified-surface); } #vwRenderer .logEntry > div[data-status="3"] { @@ -238,7 +260,7 @@ background-color: rgba(96, 96, 96, 0.1); } #vwRenderer .logEntry > div[data-status="2"], -#netFilteringDialog > .panes > .details > div[data-status="2"] { +.netFilteringDialog > .panes > .details > div[data-status="2"] { background-color: rgb(var(--popup-cell-allow-surface-rgb) / 50%); } #vwRenderer .logEntry > div[data-tabid="-1"] { @@ -248,6 +270,9 @@ #vwRenderer .logEntry > div.redirect { background-color: var(--logger-redirected-surface); } +#vwRenderer .logEntry > div.extendedRealm.scriptlet { + background-color: var(--logger-scriptlet-surface); + } :root.colorBlind #vwRenderer .logEntry > div.extendedRealm, :root.colorBlind #vwRenderer .logEntry > div.redirect { background-color: rgba(0, 19, 110, 0.1); @@ -260,10 +285,10 @@ color: white; } #vwRenderer .logEntry > div[data-type="error"] { - color: #800; + color: var(--cm-negative); } #vwRenderer .logEntry > div[data-type="info"] { - color: #008; + color: var(--sf-def-ink); } #vwRenderer .logEntry > div.voided { opacity: 0.5; @@ -272,147 +297,164 @@ opacity: 0.7; } -#vwRenderer .logEntry > div > span { - border: 1px dotted var(--border-1); - border-top: 0; - border-right: 0; +#vwRenderer .logEntry > .fields > span { + border-left: 1px dotted var(--border-1); box-sizing: border-box; display: inline-block; height: 100%; overflow: hidden; - padding: 0.2em; + padding: 2px; vertical-align: middle; white-space: nowrap; word-break: break-all; } -#vwRenderer .logEntry > div.canDetails:hover > span { +#vwRenderer .logEntry > div:hover > span { background-color: rgba(0,0,0,0.04); } -body[dir="ltr"] #vwRenderer .logEntry > div > span:first-child { +body[dir="ltr"] #vwRenderer .logEntry > .fields > span:first-child { border-left: 0; } -body[dir="rtl"] #vwRenderer .logEntry > div > span:first-child { +body[dir="rtl"] #vwRenderer .logEntry > .fields > span:first-child { border-right: 0; } #vwRenderer .logEntry > div > span:nth-of-type(1) { } #vwRenderer .logEntry > div > span:nth-of-type(2) { } -#vwRenderer #vwContent .logEntry > div > span:nth-of-type(2) { +#vwRenderer .logEntry > .fields > span:nth-of-type(2) { text-overflow: ellipsis; } -.vExpanded #vwRenderer #vwContent .logEntry > div > span:nth-of-type(2) { +#vwRenderer .logEntry > .fields.messageRealm > span:nth-of-type(2) ~ span { + display: none; + } +.vExpanded #vwRenderer #vwContent .logEntry > .fields > span:nth-of-type(2) { overflow-y: auto; white-space: pre-line; } -#vwRenderer .logEntry > div.messageRealm[data-type="tabLoad"] > span:nth-of-type(2) { +#vwRenderer .logEntry > .fields.messageRealm[data-type="tabLoad"] > span:nth-of-type(2) { text-align: center; } -#vwRenderer .logEntry > div.extendedRealm > span:nth-of-type(2) > span:first-of-type { +#vwRenderer .logEntry > .fields.extendedRealm > span:nth-of-type(2) > span:first-of-type { display: none; } -#vwRenderer .logEntry > div.extendedRealm > span:nth-of-type(2) > span:last-of-type { - pointer-events: none; - } -#vwRenderer .logEntry > div.extendedRealm.isException > span:nth-of-type(2) > span:last-of-type { +#vwRenderer .logEntry > .fields.extendedRealm.isException > span:nth-of-type(2) > span:last-of-type { text-decoration: line-through rgba(0,0,255,0.7); } -#vwRenderer .logEntry > div > span:nth-of-type(3) { - font: 12px monospace; +#vwRenderer .logEntry > .fields > span:nth-of-type(3) { + font-family: monospace; padding-left: 0.3em; padding-right: 0.3em; text-align: center; } -#vwRenderer .logEntry > div.canDetails:hover > span:nth-of-type(2), -#vwRenderer .logEntry > div.canDetails:hover > span:nth-of-type(3), -#vwRenderer .logEntry > div.canDetails:hover > span:nth-of-type(5) { - background: rgba(0, 0, 255, 0.1); - cursor: zoom-in; - } -#netInspector:not(.vExpanded) #vwRenderer .logEntry > div > span:nth-of-type(4) { - direction: rtl; +#netInspector:not(.vExpanded) #vwRenderer .logEntry > .fields > span:nth-of-type(4) { text-align: right; - unicode-bidi: plaintext; } -#vwRenderer #vwContent .logEntry > div > span:nth-of-type(4) { +#vwRenderer #vwContent .logEntry > .fields > span:nth-of-type(4) { text-overflow: ellipsis; } -.vExpanded #vwRenderer #vwContent .logEntry > div > span:nth-of-type(4) { +.vExpanded #vwRenderer #vwContent .logEntry > .fields > span:nth-of-type(4) { overflow-y: auto; text-overflow: clip; white-space: pre-line; } -#vwRenderer .logEntry > div > span:nth-of-type(5) { +#vwRenderer .logEntry > .fields > span:nth-of-type(5) { text-align: center; } -/* visual for tabless network requests */ -#vwRenderer .logEntry > div > span:nth-of-type(5) { - position: relative; - } -#vwRenderer .logEntry > div > span:nth-of-type(6) { - } -#vwRenderer #vwContent .logEntry > div > span:nth-of-type(6) { +#vwRenderer .logEntry > .fields > span:nth-of-type(3), +#vwRenderer .logEntry > .fields > span:nth-of-type(5), +#vwRenderer .logEntry > .fields > span:nth-of-type(7) { + white-space: nowrap !important; } -#vwRenderer .logEntry > div > span:nth-of-type(7) { +#vwRenderer .logEntry > .fields > span:nth-of-type(8) { position: relative; } -#vwRenderer #vwContent .logEntry > div > span:nth-of-type(7) { +#vwRenderer #vwContent .logEntry > .fields > span:nth-of-type(8) { text-overflow: ellipsis; } -.vExpanded #vwRenderer #vwContent .logEntry > div > span:nth-of-type(7) { +.vExpanded #vwRenderer #vwContent .logEntry > .fields > span:nth-of-type(8) { overflow-y: auto; white-space: pre-line; } -#vwRenderer .logEntry > div > span:nth-of-type(7) b { +#vwRenderer .logEntry > .fields > span:nth-of-type(8) b { font-weight: bold; } -#vwRenderer .logEntry > div[data-status="1"] > span:nth-of-type(7) b, -#netFilteringDialog > .panes > .details > div[data-status="1"] b { +#vwRenderer .logEntry > div[data-status="1"] > span:nth-of-type(8) b, +.netFilteringDialog > .panes > .details > div[data-status="1"] b { background-color: rgb(var(--popup-cell-block-surface-rgb) / 100%); } -#vwRenderer .logEntry > div[data-status="1"][data-modifier] > span:nth-of-type(7) b, -#netFilteringDialog > .panes > .details > div[data-status="1"][data-modifier] b { +#vwRenderer .logEntry > div[data-status="1"][data-modifier] > span:nth-of-type(8) b, +.netFilteringDialog > .panes > .details > div[data-status="1"][data-modifier] b { background-color: var(--logger-modified-em-surface); } -#vwRenderer .logEntry > div[data-status="3"] > span:nth-of-type(7) b { +#vwRenderer .logEntry > div[data-status="3"] > span:nth-of-type(8) b { background-color: rgba(108, 108, 108, 0.2); } -:root.colorBlind #vwRenderer .logEntry > div[data-status="3"] > span:nth-of-type(7) b { +:root.colorBlind #vwRenderer .logEntry > div[data-status="3"] > span:nth-of-type(8) b { background-color: rgba(96, 96, 96, 0.2); } -#vwRenderer .logEntry > div[data-status="2"] > span:nth-of-type(7) b, -#netFilteringDialog > .panes > .details > div[data-status="2"] b { +#vwRenderer .logEntry > div[data-status="2"] > span:nth-of-type(8) b, +.netFilteringDialog > .panes > .details > div[data-status="2"] b { background-color: rgb(var(--popup-cell-allow-surface-rgb) / 100%); } -#vwRenderer .logEntry > div > span:nth-of-type(7) a { +#vwRenderer .logEntry > .fields > span:nth-of-type(8) a { + align-items: center; background-color: dimgray; color: white; display: none; - height: 100%; - padding: 0 0.25em; + height: min(100%, 1.5em); + justify-content: center; + padding: 0.1em; opacity: 0.4; position: absolute; right: 0; text-decoration: none; top: 0; + width: 1.5em; } -#netInspector.vExpanded #vwRenderer .logEntry > div > span:nth-of-type(7) a { +#netInspector.vExpanded #vwRenderer .logEntry > .fields > span:nth-of-type(8) a { bottom: 0px; height: unset; - padding: 0.25em; + padding: 0.2em; top: unset; } -#vwRenderer .logEntry > div > span:nth-of-type(7) a::after { +#vwRenderer .logEntry > .fields > span:nth-of-type(8) a::after { content: '\2197'; } -#vwRenderer .logEntry > div.networkRealm > span:nth-of-type(7):hover a { - align-items: center; +#vwRenderer .logEntry > .fields.networkRealm > span:nth-of-type(8):hover a { display: inline-flex; } -#vwRenderer .logEntry > div > span:nth-of-type(7) a:hover { +#vwRenderer .logEntry > .fields > span:nth-of-type(8) a:hover { opacity: 1; } +@keyframes unrollRow { + to { + box-shadow: 0 2px 3px 0 #444; + height: auto; + max-height: 200px; + z-index: 1; + } +} +@keyframes unrollRowCell { + to { + height: auto; + overflow-y: auto; + white-space: pre-wrap; + } +} +#netInspector:not(.vExpanded) #vwRenderer .logEntry:hover { + animation-delay: 0.8s; + animation-fill-mode: forwards; + animation-name: unrollRow; + animation-timing-function: step-start; + } +#netInspector:not(.vExpanded) #vwRenderer .logEntry:hover > .fields > span { + animation-delay: 0.8s; + animation-fill-mode: forwards; + animation-name: unrollRowCell; + animation-timing-function: step-start; + } + #vwRenderer #vwBottom { background-color: #00F; height: 0; @@ -428,12 +470,63 @@ width: 100%; } +#inspectors .entryTools { + background-color: var(--surface-0); + flex-basis: 50%; + } +#inspectors .entryTools:empty { + display: none; + } + +.closeButton { + stroke: var(--ink-1); + stroke-width: 3px; + width: 1.6em; + height: 1.6em; + bottom: calc(100% + 2px); + } +body[dir="ltr"] .closeButton { + right: 0; + } +body[dir="rtl"] .closeButton { + left: 0; + } +.closeButton:hover { + background-color: var(--surface-2) !important; + } +.closeButton > * { + pointer-events: none; + } + +#inspectors #infoInspector { + flex-basis: 200%; + } +#inspectors:not(.console) #infoInspector { + display: none; + } +#inspectors #infoInspector .vscrollable { + font-family: monospace; + font-size: small; + } +#inspectors #infoInspector .vscrollable > div { + border-bottom: 1px dotted gray; + padding: 0.2em; + white-space: pre-wrap; + word-break: break-all; + } +#inspectors #infoInspector .vscrollable > div:first-of-type { + } +#inspectors #infoInspector .vscrollable > div[data-type="error"] { + color: var(--cm-negative); + } + #popupContainer { background-color: var(--surface-1); border: 1px solid gray; bottom: 0; display: none; - max-height: 70vh; + max-height: min(800px, calc(100vh - 2rem)); + max-height: min(800px, calc(100svh - 2rem)); min-width: 360px; overflow: hidden; position: fixed; @@ -464,7 +557,12 @@ #modalOverlay > div { position: relative; } -#modalOverlay > div > div:nth-of-type(1) { +#modalOverlay .closeButton { + background-color: var(--surface-1); + position: absolute; + } + +#modalOverlayContainer { background-color: var(--surface-1); border: 0; box-sizing: border-box; @@ -473,39 +571,19 @@ overflow-y: auto; width: 90vw; } -#modalOverlay > div > div:nth-of-type(2) { - stroke: var(--ink-1); - stroke-width: 3px; - position: absolute; - width: 1.6em; - height: 1.6em; - bottom: calc(100% + 2px); - background-color: var(--surface-1); - } -body[dir="ltr"] #modalOverlay > div > div:nth-of-type(2) { - right: 0; - } -body[dir="rtl"] #modalOverlay > div > div:nth-of-type(2) { - left: 0; - } -#modalOverlay > div > div:nth-of-type(2):hover { - background-color: var(--surface-2); - } -#modalOverlay > div > div:nth-of-type(2) > * { - pointer-events: none; - } -#netFilteringDialog { - font-size: 95%; +.netFilteringDialog { + font-size: var(--font-size-smaller); } -#netFilteringDialog a { +.netFilteringDialog a { text-decoration: none; } -#netFilteringDialog select { - max-width: 75%; +.netFilteringDialog select { + max-width: 50vw; outline: none; + text-overflow: ellipsis; } -#netFilteringDialog > .preview { +.netFilteringDialog > .preview { align-items: center; /* http://lea.verou.me/css3patterns/ */ background-color: #aaa; @@ -534,22 +612,24 @@ padding: 0.5em; text-align: center; } -#netFilteringDialog > .preview > * { +.netFilteringDialog > .preview > * { max-width: 100%; max-height: 20vh; } -#netFilteringDialog > .preview > span { +.netFilteringDialog > .preview > span { background-color: var(--surface-3); cursor: pointer; padding: 1em; } -#netFilteringDialog > .headers { +.netFilteringDialog > .headers { + align-items: center; border-bottom: 1px solid var(--border-4); + display: flex; + justify-content: space-between; line-height: 2; - position: relative; } -#netFilteringDialog > .headers > .header { +.netFilteringDialog > .headers .header { border: 1px solid var(--border-2); border-bottom: 1px solid var(--border-4); border-top-left-radius: 4px; @@ -557,110 +637,103 @@ color: var(--border-2); cursor: pointer; display: inline-block; + margin-inline-end: 4px; padding: 0 1em; position: relative; - text-align: center; top: 1px; } -#netFilteringDialog[data-pane="details"] > .headers > [data-pane="details"], -#netFilteringDialog[data-pane="dynamic"] > .headers > [data-pane="dynamic"], -#netFilteringDialog[data-pane="static"] > .headers > [data-pane="static"] { - background-color: var(--surface-1); +.netFilteringDialog[data-pane="details"] > .headers [data-pane="details"], +.netFilteringDialog[data-pane="dynamic"] > .headers [data-pane="dynamic"], +.netFilteringDialog[data-pane="static"] > .headers [data-pane="static"] { + background-color: var(--surface-0); border-color: var(--border-4); border-bottom: 1px solid transparent; color: var(--ink-1); } -#netFilteringDialog > .headers > .tools { +.netFilteringDialog > .headers > .tools { bottom: 0; display: flex; - position: absolute; - } -body[dir="ltr"] #netFilteringDialog > .headers > .tools { - right: 0; - } -body[dir="rtl"] #netFilteringDialog > .headers > .tools { - left: 0; + height: 100%; + margin-inline-start: 2rem; } -#netFilteringDialog > .headers > .tools > span { - color: var(--ink-4); - fill: var(--ink-4); +.netFilteringDialog > .headers > .tools > span { + color: var(--ink-3); + fill: var(--ink-3); cursor: pointer; font-size: 1.5em; padding: 0 0.25em; text-align: center; } -#netFilteringDialog > .headers > .tools > span:hover { +.netFilteringDialog > .headers > .tools > span:hover { color: var(--ink-1); fill: var(--ink-1); } -#netFilteringDialog.extendedRealm > .headers > .dynamic, -#netFilteringDialog.extendedRealm > .panes > .dynamic { +.netFilteringDialog.extendedRealm > .headers .dynamic, +.netFilteringDialog.extendedRealm > .panes > .dynamic { display: none; } -#netFilteringDialog.extendedRealm > .headers > .static, -#netFilteringDialog.extendedRealm > .panes > .static { +.netFilteringDialog.extendedRealm > .headers .static, +.netFilteringDialog.extendedRealm > .panes > .static { display: none; } -#netFilteringDialog > div.panes { - min-height: 40vh; +.netFilteringDialog > div.panes { overflow: hidden; overflow-y: auto; padding-top: 1em; } -#netFilteringDialog > div.panes > div { +.netFilteringDialog > div.panes > div { display: none; } -#netFilteringDialog[data-pane="details"] > .panes > [data-pane="details"], -#netFilteringDialog[data-pane="dynamic"] > .panes > [data-pane="dynamic"], -#netFilteringDialog[data-pane="static"] > .panes > [data-pane="static"] { +.netFilteringDialog[data-pane="details"] > .panes > [data-pane="details"], +.netFilteringDialog[data-pane="dynamic"] > .panes > [data-pane="dynamic"], +.netFilteringDialog[data-pane="static"] > .panes > [data-pane="static"] { display: flex; flex-direction: column; - padding: 0 var(--default-gap-xsmall); + padding: 0 var(--default-gap-xsmall) var(--default-gap-xsmall) var(--default-gap-xsmall); } -#netFilteringDialog > .panes > .details > div { +.netFilteringDialog > .panes > .details > div { align-items: stretch; background-color: var(--surface-2); border: 0; border-bottom: 1px solid var(--surface-0); display: flex; } -#netFilteringDialog > .panes > .details > div > span { +.netFilteringDialog > .panes > .details > div > span { padding: 0.5em; } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { border: 0; flex-grow: 0; flex-shrink: 0; text-align: right; width: 8em; } -body[dir="ltr"] #netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { +body[dir="ltr"] .netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { border-right: 1px solid var(--surface-0); } -body[dir="rtl"] #netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { +body[dir="rtl"] .netFilteringDialog > .panes > .details > div > span:nth-of-type(1) { border-left: 1px solid var(--surface-0); } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(2) { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(2) { flex-grow: 1; - max-height: 20vh; + max-height: 10vh; overflow: hidden auto; white-space: pre-line } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(2):not(.prose) { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(2):not(.prose) { word-break: break-all; } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .listEntry { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .listEntry { display: inline-flex; } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .fa-icon { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .fa-icon { font-size: 110%; opacity: 0.5; - vertical-align: bottom; } -#netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .fa-icon:hover { +.netFilteringDialog > .panes > .details > div > span:nth-of-type(2) .fa-icon:hover { opacity: 1; } -#netFilteringDialog > .panes > .details .exceptor { +.netFilteringDialog > .panes > .details .exceptor { align-items: center; border-left: 1px solid var(--surface-0); cursor: pointer; @@ -668,29 +741,29 @@ font-family: monospace; opacity: 0.8; } -#netFilteringDialog > .panes > .details .exceptor:hover { +.netFilteringDialog > .panes > .details .exceptor:hover { opacity: 1; } -#netFilteringDialog > .panes > .details .exceptored .filter { +.netFilteringDialog > .panes > .details .exceptored .filter { text-decoration: line-through; } -#netFilteringDialog > .panes > .details .exceptored .exceptor { +.netFilteringDialog > .panes > .details .exceptored .exceptor { background-color: rgb(var(--primary-50) / 50%); } -#netFilteringDialog > .panes > .details .exceptor::before { +.netFilteringDialog > .panes > .details .exceptor::before { content: '@@'; } -#netFilteringDialog.extendedRealm > .panes > .details .exceptor::before { +.netFilteringDialog.extendedRealm > .panes > .details .exceptor::before { content: '#@#'; } -#netFilteringDialog > div.panes > .dynamic > .toolbar { +.netFilteringDialog > div.panes > .dynamic > .toolbar { padding-bottom: 1em; } -#netFilteringDialog > div.panes > .dynamic .row { +.netFilteringDialog > div.panes > .dynamic .row { display: flex; min-height: 2.2em; } -#netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { +.netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { align-self: stretch; border: 0; display: inline-flex; @@ -699,17 +772,17 @@ text-align: center; width: 4.5em; } -body[dir="ltr"] #netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { +body[dir="ltr"] .netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { border-right: 1px solid var(--surface-0); } -body[dir="rtl"] #netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { +body[dir="rtl"] .netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(1) { border-left: 1px solid var(--surface-0); } -#netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(2) { +.netFilteringDialog > div.panes > .dynamic .row > span:nth-of-type(2) { align-self: center; padding: 0 0.5em; } -#netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules { +.netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules { background-color: #ffe; border: 1px solid #ddc; border-radius: 4px; @@ -719,29 +792,29 @@ visibility: hidden; width: 100%; } -body.dirty #netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules { +body.dirty .netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules { visibility: visible; } -#netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules:hover { +.netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules:hover { fill: black; } -#netFilteringDialog > div.panes > .dynamic > .toolbar .entry { +.netFilteringDialog > div.panes > .dynamic > .toolbar .entry { display: none; } -#netFilteringDialog > div.panes > .dynamic .entry { +.netFilteringDialog > div.panes > .dynamic .entry { background-color: var(--surface-2); border: 0; border-bottom: 1px solid var(--surface-0); } -#netFilteringDialog > div.panes > .dynamic .entry:hover { +.netFilteringDialog > div.panes > .dynamic .entry:hover { background-color: var(--surface-3); } -#netFilteringDialog > div.panes > .dynamic .entry > .action { +.netFilteringDialog > div.panes > .dynamic .entry > .action { background-color: transparent; border: 0; cursor: pointer; } -#netFilteringDialog > div.panes > .dynamic .entry > .action > span { +.netFilteringDialog > div.panes > .dynamic .entry > .action > span { background-color: transparent; border: 0; display: inline-block; @@ -750,80 +823,75 @@ visibility: hidden; width: 33.33%; } -#netFilteringDialog > div.panes > .dynamic .entry > .action.allow { +.netFilteringDialog > div.panes > .dynamic .entry > .action.allow { background-color: rgba(0, 160, 0, 0.3); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.allow { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.allow { background-color: rgba(255, 194, 57, 0.4); } -#netFilteringDialog > div.panes > .dynamic .entry > .action.noop { +.netFilteringDialog > div.panes > .dynamic .entry > .action.noop { background-color: rgba(108, 108, 108, 0.3); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.noop { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.noop { background-color: rgba(96, 96, 96, 0.4); } -#netFilteringDialog > div.panes > .dynamic .entry > .action.block { +.netFilteringDialog > div.panes > .dynamic .entry > .action.block { background-color: rgba(192, 0, 0, 0.3); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.block { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.block { background-color: rgba(0, 19, 110, 0.4); } -#netFilteringDialog > div.panes > .dynamic .entry > .action.own.allow { +.netFilteringDialog > div.panes > .dynamic .entry > .action.own.allow { background-color: rgba(0, 160, 0, 1); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.own.allow { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.own.allow { background-color: rgba(255, 194, 57, 1); } -#netFilteringDialog > div.panes > .dynamic .entry > .action.own.noop, -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.own.noop { +.netFilteringDialog > div.panes > .dynamic .entry > .action.own.noop, +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.own.noop { background-color: rgba(108, 108, 108, 1); } -#netFilteringDialog > div.panes > .dynamic .entry > .action.own.block { +.netFilteringDialog > div.panes > .dynamic .entry > .action.own.block { background-color: rgba(192, 0, 0, 1); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action.own.block { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action.own.block { background-color: rgba(0, 19, 110, 1); } -#netFilteringDialog > div.panes > .dynamic .entry > .action:not(.own):hover > span { +.netFilteringDialog > div.panes > .dynamic .entry > .action:not(.own):hover > span { opacity: 0.2; visibility: visible; } -#netFilteringDialog > div.panes > .dynamic .entry > .action:not(.own):hover > span:hover { +.netFilteringDialog > div.panes > .dynamic .entry > .action:not(.own):hover > span:hover { opacity: 0.75; } -#netFilteringDialog > div.panes > .dynamic .entry > .action > .allow { +.netFilteringDialog > div.panes > .dynamic .entry > .action > .allow { background-color: rgb(0, 160, 0); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action > .allow { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action > .allow { background-color: rgb(255, 194, 57); } -#netFilteringDialog > div.panes > .dynamic .entry > .action > .noop { +.netFilteringDialog > div.panes > .dynamic .entry > .action > .noop { background-color: rgb(108, 108, 108); } -#netFilteringDialog > div.panes > .dynamic .entry > .action > .block { +.netFilteringDialog > div.panes > .dynamic .entry > .action > .block { background-color: rgb(192, 0, 0); } -:root.colorBlind #netFilteringDialog > div.panes > .dynamic .entry > .action > .block { +:root.colorBlind .netFilteringDialog > div.panes > .dynamic .entry > .action > .block { background-color: rgb(0, 19, 110); } -#netFilteringDialog > div.panes > .dynamic .entry > .url { +.netFilteringDialog > div.panes > .dynamic .entry > .url { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -#netFilteringDialog > div.panes > div.static > div { +.netFilteringDialog > div.panes > div.static > div { line-height: 2; } -#netFilteringDialog > div.panes > div.static > div { - padding-bottom: 1em; - } -#netFilteringDialog > div.panes > div.static textarea { +.netFilteringDialog > div.panes > div.static textarea { height: 6em; - max-height: 20vh; - min-height: 10vh; word-break: break-all; } -#netFilteringDialog > div.panes > div.static > div:nth-of-type(2) { +.netFilteringDialog > div.panes > div.static > div:nth-of-type(2) { text-align: center; } @@ -913,10 +981,10 @@ background-color: rgb(var(--primary-70) / 40%); } #loggerExportDialog .output { - font: smaller mono; - height: 60vh; + font-size: small; + height: 80vh; padding: 0.5em; - white-space: pre; + white-space: pre-wrap; } #loggerSettingsDialog { diff -Nru ublock-origin-1.46.0+dfsg/src/css/popup-fenix.css ublock-origin-1.67.0+dfsg/src/css/popup-fenix.css --- ublock-origin-1.46.0+dfsg/src/css/popup-fenix.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/popup-fenix.css 2025-10-25 19:32:51.000000000 +0000 @@ -64,6 +64,7 @@ align-items: stretch; display: flex; justify-content: space-between; + margin: var(--popup-gap-extra-thin) 0; } #switch { color: var(--popup-power-ink); @@ -73,7 +74,7 @@ flex-grow: 1; font-size: 96px; justify-content: center; - margin: var(--popup-gap-thin) var(--popup-gap-thin) 0; + margin: var(--popup-gap) 0; padding: 0; stroke: none; stroke-width: 64; @@ -88,7 +89,7 @@ box-sizing: border-box; display: flex; flex-direction: column; - justify-content: space-evenly; + justify-content: space-between; width: 25%; } .rulesetTools [id] { @@ -113,8 +114,12 @@ visibility: visible; } #hostname { - margin: var(--popup-gap) var(--popup-gap-extra-thin); + background-color: var(--popup-toolbar-surface); + margin: 0; + padding: var(--popup-gap-thin) 0; text-align: center; + white-space: normal; + } #hostname > span { word-break: break-all; @@ -202,11 +207,11 @@ margin-top: 6px; text-align: center; } -body.mobile.no-tooltips .toolRibbon .tool { +:root.mobile.no-tooltips .toolRibbon .tool { font-size: 1.6em; } -#basicTools:not(.canPick) .needPick { +#basicTools .needPick:not(.canPick) { visibility: hidden; } @@ -228,6 +233,26 @@ visibility: visible; } +#unprocessedRequestWarning { + align-items: center; + background-color: #fc0; + color: rgb(var(--ink-80)); + stroke: rgb(var(--ink-80)); + display: none; + font-size: var(--font-size-smaller); + padding: var(--popup-gap-thin); + } +:root.warn #unprocessedRequestWarning { + display: flex; + } +#unprocessedRequestWarning > .dismiss { + flex-shrink: 0; + width: calc(var(--font-size) - 2px); + } +#unprocessedRequestWarning > .dismiss > svg { + width: 100%; + } + #moreOrLess { column-gap: 0; display: grid; @@ -267,6 +292,7 @@ max-width: 460px; min-width: var(--popup-firewall-min-width); padding: 0; + position: relative; overflow-y: auto; } :root.desktop #firewall { @@ -274,19 +300,85 @@ } :root.desktop body.vMin #firewall { max-height: 100vh; + max-height: 100svh; + } +#firewall > * { + direction: ltr; + } +#firewall > section { + align-items: flex-start; + display: flex; + left: 0; + position: absolute; + z-index: 50; + } +#firewall > section .fa-icon { + color: var(--ink-4); + fill: var(--ink-4); + font-size: 150%; + padding: var(--popup-gap-thin); + } +#firewall > section:hover .fa-icon { + color: var(--ink-1); + fill: var(--ink-1); + } +#firewall.showBlocked > section .fa-icon, +#firewall.showAllowed > section .fa-icon, +#firewall.hideBlocked > section .fa-icon, +#firewall.hideAllowed > section .fa-icon, +#firewall.show3pScript > section .fa-icon, +#firewall.show3pFrame > section .fa-icon, +#firewall.hide3pScript > section .fa-icon, +#firewall.hide3pFrame > section .fa-icon { + color: rgb(var(--primary-70)); + fill: rgb(var(--primary-70)); + } +#firewall > section .filterExpressions { + background-color: var(--surface-0); + border: 1px solid var(--border-4); + display: none; + } +#firewall > section:hover .filterExpressions { + display: flex; + flex-direction: column; + } +#firewall > section .filterExpressions div { + border-bottom: 1px dotted #ddd; + padding: 0.25em; + } +#firewall > section .filterExpressions div:last-of-type { + border-bottom: 0; + } +#firewall > section .filterExpressions span { + cursor: default; + display: inline-flex; + margin: 0 0.25em 0 0; + padding: 0.5em; + white-space: nowrap; + border: 1px solid var(--surface-0); + } +#firewall > section .filterExpressions span:last-of-type { + margin: 0; + } +:root:not(.mobile) #firewall > section .filterExpressions span:not(.on):hover { + background-color: rgb(var(--primary-70) / 15%); + border: 1px solid rgb(var(--primary-70)); + } +#firewall > section .filterExpressions span.on { + background-color: rgb(var(--primary-70) / 40%); + border: 1px solid rgb(var(--primary-70)); } #firewall > div { border: 0; - direction: ltr; display: flex; margin: 0; margin-top: 1px; padding: 0; } -#firewall > div:first-child { +#firewall > div:first-of-type { margin-top: 0; } -#firewall > div:first-child ~ div[data-des="*"] { +#firewall > div:first-of-type ~ div[data-des="*"] { display: none; } #firewall:not(.expanded) > div.isSubdomain:not(.expandException):not(.isRootContext), @@ -302,12 +394,20 @@ padding: 0.4em 0; position: relative; } -#firewall > div:first-of-type > span:first-of-type { +#firewall > div:first-of-type span[data-i18n] { cursor: pointer; flex-direction: unset; + flex-grow: 1; + } +#firewall > div:first-of-type span[data-i18n]::before { + color: var(--ink-3); + content: '+'; + padding-right: 0.25em; + } +#firewall.expanded > div:first-of-type span[data-i18n]::before { + content: '\2012'; } #firewall > div > span:first-of-type { - align-items: flex-end; flex-direction: column; flex-grow: 1; justify-content: flex-end; @@ -320,36 +420,34 @@ #firewall > div[data-des="*"] > span:first-of-type { flex-direction: row; } -#firewall > div[data-des="*"] > span:first-of-type > span.filter { - flex-grow: 1; - padding-inline-start: 2px; - -webkit-padding-start: 2px; - text-align: left; - } -#firewall:not(.has3pScript) > [data-type="3p-script"] .filter, -#firewall:not(.has3pFrame) > [data-type="3p-frame"] .filter { - display: none; - } -#firewall > [data-des="*"] .filter::after { - content: '\22EF'; - } -#firewall.show3pScript > [data-type="3p-script"] .filter::after, -#firewall.show3pFrame > [data-type="3p-frame"] .filter::after { - content: '\2191'; - } -#firewall.hide3pScript > [data-type="3p-script"] .filter::after, -#firewall.hide3pFrame > [data-type="3p-frame"] .filter::after { - content: '\2193'; - } -#firewall.show3pScript > div:not([data-des="*"]):not(.hasScript), -#firewall.show3pScript > div:not([data-des="*"]):not(.is3p), +#firewall.show3pScript:not(.show3pFrame) > div:not([data-des="*"]).is3p:not(.hasScript), +#firewall.show3pFrame:not(.show3pScript) > div:not([data-des="*"]).is3p:not(.hasFrame), +#firewall.show3pScript.show3pFrame > div:not([data-des="*"]).is3p:not(.hasScript):not(.hasFrame), #firewall.hide3pScript > div:not([data-des="*"]).is3p.hasScript, -#firewall.show3pFrame > div:not([data-des="*"]):not(.hasFrame), -#firewall.show3pFrame > div:not([data-des="*"]):not(.is3p), #firewall.hide3pFrame > div:not([data-des="*"]).is3p.hasFrame, -#firewall.show3pScript.show3pFrame > div:not([data-des="*"]).hasScript:not(.hasFrame), -#firewall.show3pScript.show3pFrame > div:not([data-des="*"]).hasFrame:not(.hasScript) { - opacity: 0.5; +#firewall.showBlocked > div:not([data-des="*"]).is3p:not(.totalBlocked):not(.blocked), +#firewall.showAllowed > div:not([data-des="*"]).is3p:not(.totalAllowed):not(.allowed), +#firewall.hideBlocked > div:not([data-des="*"]).is3p.totalBlocked, +#firewall.hideBlocked > div:not([data-des="*"]).is3p.blocked, +#firewall.hideAllowed > div:not([data-des="*"]).is3p.totalAllowed, +#firewall.hideAllowed > div:not([data-des="*"]).is3p.allowed { + max-height: 4px; + overflow-y: hidden; + pointer-events: none; + user-select: none; + } +#firewall.show3pScript:not(.show3pFrame) > div:not([data-des="*"]).is3p:not(.hasScript) *, +#firewall.show3pFrame:not(.show3pScript) > div:not([data-des="*"]).is3p:not(.hasFrame) *, +#firewall.show3pScript.show3pFrame > div:not([data-des="*"]).is3p:not(.hasScript):not(.hasFrame) *, +#firewall.hide3pScript > div:not([data-des="*"]).is3p.hasScript *, +#firewall.hide3pFrame > div:not([data-des="*"]).is3p.hasFrame *, +#firewall.showBlocked > div:not([data-des="*"]).is3p:not(.totalBlocked):not(.blocked) *, +#firewall.showAllowed > div:not([data-des="*"]).is3p:not(.totalAllowed):not(.allowed) *, +#firewall.hideBlocked > div:not([data-des="*"]).is3p.totalBlocked *, +#firewall.hideBlocked > div:not([data-des="*"]).is3p.blocked *, +#firewall.hideAllowed > div:not([data-des="*"]).is3p.totalAllowed *, +#firewall.hideAllowed > div:not([data-des="*"]).is3p.allowed * { + color: transparent !important; } #firewall > div.isCname > span:first-of-type { color: var(--popup-cell-cname-ink); @@ -386,16 +484,8 @@ pointer-events: auto; } #firewall > div.isDomain.hasSubdomains > span:first-of-type > span::before { - color: var(--ink-3); content: '\2026\A0'; - } -#firewall > div:first-of-type > span:first-of-type::before { - color: var(--ink-3); - content: '+'; - padding-right: 0.25em; - } -#firewall.expanded > div:first-of-type > span:first-of-type::before { - content: '\2012'; + opacity: 0.6; } #firewall > div[data-des="*"] > span:nth-of-type(3), #firewall > div.isSubdomain > span:nth-of-type(3), @@ -453,7 +543,7 @@ body.advancedUser #firewall > div > span:nth-of-type(2) { display: inline-flex; } -body.advancedUser #firewall > div:first-child ~ div[data-des="*"] { +body.advancedUser #firewall > div:first-of-type ~ div[data-des="*"] { display: flex; } body.advancedUser #firewall > div > span:first-of-type ~ span { @@ -631,7 +721,7 @@ } /* horizontally-constrained viewport */ -:root.portrait body { +:root.portrait:not(.desktop) body { overflow-y: auto; width: 100%; } @@ -647,7 +737,7 @@ min-width: unset; overflow-y: hidden; } -:root.portrait #firewall-vspacer { +:root.portrait body[data-more*="e"] #firewall-vspacer { display: block; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/settings.css ublock-origin-1.67.0+dfsg/src/css/settings.css --- ublock-origin-1.46.0+dfsg/src/css/settings.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/settings.css 2025-10-25 19:32:51.000000000 +0000 @@ -13,7 +13,7 @@ align-items: stretch; align-self: stretch; display: inline-flex; - justify-content: stretch + justify-content: stretch; user-select: none; } #themeMood > span { @@ -32,7 +32,7 @@ align-items: stretch; align-self: stretch; display: inline-flex; - justify-content: stretch + justify-content: stretch; position: relative; } #themePrimary > span { diff -Nru ublock-origin-1.46.0+dfsg/src/css/support.css ublock-origin-1.67.0+dfsg/src/css/support.css --- ublock-origin-1.46.0+dfsg/src/css/support.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/support.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,3 +1,8 @@ +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + body { margin-bottom: 6rem; } @@ -11,6 +16,7 @@ } .supportEntry { display: flex; + margin-block: 1em; } :root.mobile .supportEntry { flex-direction: column; @@ -48,6 +54,35 @@ display: none; } +body[data-should-update-lists]:not(.updated) .e .createEntry { + opacity: 0.25; + pointer-events: none; +} + +body:not([data-should-update-lists]) .shouldUpdate { + display: none; + } +body.updating { + pointer-events: none; + } +body.updating button { + filter: grayscale(1); + opacity: 0.5; + } +body.updated .shouldUpdate button { + display: none; + } +body.updating .shouldUpdate button .fa-icon svg { + animation: spin 1s linear infinite; + transform-origin: 50%; + } +body .shouldUpdate .updated { + align-self: center; + } +body:not(.updated) .shouldUpdate .updated { + display: none; + } + button { align-self: center; } @@ -56,6 +91,10 @@ cursor: pointer; } +#showSupportInfo { + cursor: pointer; + } + body.redacted #redactButton { display: none; } diff -Nru ublock-origin-1.46.0+dfsg/src/css/themes/default.css ublock-origin-1.67.0+dfsg/src/css/themes/default.css --- ublock-origin-1.46.0+dfsg/src/css/themes/default.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/themes/default.css 2025-10-25 19:32:51.000000000 +0000 @@ -35,6 +35,7 @@ --green-40: 84 255 189; --green-50: 63 225 176; --green-60: 42 195 162; + --green-65: 21 165 149; --green-70: 0 135 135; --green-80: 0 94 94; --ink-10: 57 52 115; @@ -127,8 +128,8 @@ * */ :root { --font-size: 14px; - --font-size-smaller: 13px; - --font-size-xsmall: 11px; + --font-size-smaller: calc(var(--font-size) - 1px); + --font-size-xsmall: calc(var(--font-size) - 3px); --font-size-larger: 15px; --font-family: Inter, sans-serif; --monospace-size: 12px; @@ -239,6 +240,8 @@ --dashboard-tab-focus-surface-rgb: var(--primary-90); --dashboard-highlight-surface-rgb: var(--primary-90); + --dashboard-happy-green: rgb(var(--green-65)); + /* popup panel */ --popup-cell-cname-ink: #0054d7; /* h260 S:100 Luv:40 */; --popup-cell-label-mixed-surface: #c29100; /* TODO: fix */ @@ -284,6 +287,7 @@ --sf-notice-ink: var(--ink-4); --sf-readonly-ink: var(--ink-3); --sf-tag-ink: #006e2e /* h:135 S:100 Luv:40 */; + --sf-unicode-ink: var(--ink-1); --sf-value-ink: #974900 /* h:30 S:100 Luv:40 */; --sf-variable-ink: var(--ink-1); --sf-warning-ink: #e49d00; /* h:50 S:100 Luv:70 */ @@ -296,8 +300,9 @@ /* logger */ --logger-modified-surface: #0000c010; - --logger-redirected-surface: rgb(var(--yellow-5) / 50%); --logger-modified-em-surface: #0000c028; + --logger-redirected-surface: rgb(var(--yellow-5) / 50%); + --logger-scriptlet-surface: rgb(var(--yellow-30) / 50%); } /* https://material.io/design/color/dark-theme.html */ @@ -373,12 +378,11 @@ /* logger */ --logger-modified-surface: #663efd60; --logger-redirected-surface: rgb(var(--yellow-5) / 40%); + --logger-scriptlet-surface: rgb(var(--yellow-30) / 40%); } -:root.dark input, -:root.dark select, -:root.dark textarea { - color-scheme: dark; +:root.dark { + color-scheme: dark light; } /* @@ -404,8 +408,11 @@ --fieldset-header-surface: transparent; --fieldset-header-ink: var(--ink-2); + --native-control-opacity: 0; + --button-ink: var(--ink-1); --button-surface: rgb(var(--button-surface-rgb)); + --button-border-size: 0; --button-border-radius: 5px; --button-preferred-ink: var(--accent-ink-1); --button-preferred-surface: var(--accent-surface-1); @@ -416,6 +423,7 @@ --checkbox-ink: var(--ink-3); --checkbox-checked-ink: var(--accent-surface-1); --checkbox-disabled-filter: opacity(50%); + --checkbox-margin-end: calc(var(--font-size) * 0.75); --notice-ink: var(--accent-ink-1); --notice-surface: var(--accent-surface-1); @@ -448,13 +456,20 @@ --popup-cell-block-surface: rgb(var(--popup-cell-block-surface-rgb)); --popup-power-ink: rgb(var(--popup-power-ink-rgb)); --popup-toolbar-surface: rgb(var(--primary-80) / 15%); - --popup-toolbar-surface-hover: rgb(var(--primary-80) / 20%); + --popup-toolbar-surface-hover: rgb(var(--primary-80) / 30%); --popup-ruleset-tool-ink: var(--ink-1); --popup-ruleset-tool-surface: rgb(var(--primary-80) / 15%); --popup-ruleset-tool-surface-hover: rgb(var(--primary-80) / 20%); --popup-ruleset-tool-shadow: transparent; } +@media (prefers-contrast: more) { + :root { + --native-control-opacity: 1; + --button-border-size: 1px; + } +} + /* * Rule colors * */ diff -Nru ublock-origin-1.46.0+dfsg/src/css/whitelist.css ublock-origin-1.67.0+dfsg/src/css/whitelist.css --- ublock-origin-1.46.0+dfsg/src/css/whitelist.css 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/css/whitelist.css 2025-10-25 19:32:51.000000000 +0000 @@ -1,5 +1,6 @@ html { height: 100vh; + height: 100svh; overflow: hidden; width: 100vw; } diff -Nru ublock-origin-1.46.0+dfsg/src/dashboard.html ublock-origin-1.67.0+dfsg/src/dashboard.html --- ublock-origin-1.46.0+dfsg/src/dashboard.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/dashboard.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,24 +3,30 @@ + - - - - + + + + + - + +
    - + + + + book
    @@ -31,16 +37,19 @@
    - + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/devtools.html ublock-origin-1.67.0+dfsg/src/devtools.html --- ublock-origin-1.46.0+dfsg/src/devtools.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/devtools.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,6 +3,7 @@ + uBlock — Dev tools @@ -29,8 +30,11 @@ + + +
    -
    +
    @@ -41,13 +45,14 @@ - - - - + + + + + diff -Nru ublock-origin-1.46.0+dfsg/src/document-blocked.html ublock-origin-1.67.0+dfsg/src/document-blocked.html --- ublock-origin-1.46.0+dfsg/src/document-blocked.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/document-blocked.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,14 +3,15 @@ + - + - +
    exclamation-triangle @@ -24,13 +25,9 @@
    -
    -

    _

    -

     

    - +
    + +
    @@ -42,18 +39,33 @@
    - -
    + + + + + - + diff -Nru ublock-origin-1.46.0+dfsg/src/dyna-rules.html ublock-origin-1.67.0+dfsg/src/dyna-rules.html --- ublock-origin-1.46.0+dfsg/src/dyna-rules.html 2023-01-23 21:00:41.000000000 +0000 +++ ublock-origin-1.67.0+dfsg/src/dyna-rules.html 2025-10-25 19:32:51.000000000 +0000 @@ -3,6 +3,7 @@ + uBlock — Dynamic filtering rules @@ -20,7 +21,7 @@
    -

    info-circle

    +

    @@ -40,7 +41,7 @@
    filter  double-angle-up
    -
    +
    - info-circle + +
    +
    + book
    @@ -34,9 +38,9 @@
    + -
    @@ -51,22 +55,33 @@ - + - + angle-up
    -
    +
    +
    + +
    css/fontimagemediascript
    +
    xhrframedomscriptletother
    +
    +
    +
    tabless
    +
    getheadpost
    +
    + + csppermissionsredirectremoveparamreplaceurlskip + +
    +
    -
    css/fontimagemediascript
    -
    xhrframedomother
    +
    infoerror
    -
    -
    @@ -85,32 +100,46 @@
    -
    00:00:00 ** 3,3inline-script 
    +
    00:00:00 ** 3,3optionsinline-script 
    +
    +
    +
    +
    + +   + +
    +
    +
    +
    +
    +
    -