1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Boersenfeger

Beiträge von Boersenfeger

  • Frage zum aktuellen Nightly (v140)

    • Boersenfeger
    • 25. Mai 2025 um 11:48
    Zitat von 2002Andreas

    Teste mal damit

    So ist alles fein! :)

  • Mozilla stellt Pocket und Fakespot ein

    • Boersenfeger
    • 24. Mai 2025 um 16:09

    .. genau so handhabe ich das seit eh und je. Artikel, über die ich stolpere, aber aktuell nicht lesen möchte/kann, werden als Lesezeichen in einem speziellen Ordner abgespeichert. Wenn dann mal sonst nicht zu tun ist, rufe ich die gespeicherten Seiten auf, lese und lösche das Lesezeichen oder sortiere es in meine sonstige Ordnerstruktur ein.

  • Frage zu Thunderbird Zertifikat

    • Boersenfeger
    • 24. Mai 2025 um 15:52

    Penyelam Da ich deinen Mailprovider nicht nutze, kann ichs auch nicht probieren. Aber gut, das du meine Vermutung aufgeklärt hast. :thumbup:

  • Mozilla stellt Pocket und Fakespot ein

    • Boersenfeger
    • 23. Mai 2025 um 19:18

    Vielen Dank!

  • Frage zum aktuellen Nightly (v140)

    • Boersenfeger
    • 23. Mai 2025 um 19:17
    Zitat von 2002Andreas
    Zitat von FuchsFan
    CSS
    menupopup[needsgutter] {
      @media (-moz-platform: linux) or (-moz-platform: windows) {
        & > :is(menu, menuitem) > .menu-icon {
          display: none !important;
        }
      }
    }

    Passt hier, allerdings zerhaut es mir im Menü LESEZEICHEN mein dortiges Icon.

    Dieses wird durch diesen CSS eingeblendet:

    CSS
    /*Standard Ordner Icon*/
    #placesList treechildren::-moz-tree-image(container),
    #bookmarks-view treechildren::-moz-tree-image(container),
    #historyTree treechildren::-moz-tree-image(container),
    #placeContent treechildren::-moz-tree-image(container, title),
    #editBMPanel_folderTree treechildren::-moz-tree-image(container),
    .bookmark-item[container] {
      list-style-image: url("file:///g:/Boersenfeger/A_INSTALLATIONSDATEIEN/Downloads/Icons/Standardordner.png") !important;
    }
  • Mozilla stellt Pocket und Fakespot ein

    • Boersenfeger
    • 23. Mai 2025 um 18:46

    Da ich in meiner user.js Pocket abgestellt habe....
    user_pref("extensions.pocket.enabled",false); /* Pocket abstellen */

    Wenn dann der Zeitpunkt gekommen ist, werden dann alle entsprechenden Einträge aus about:config automatisch entfernt oder muss ich mir einen Kalendereintrag machen?

  • Frage zu Thunderbird Zertifikat

    • Boersenfeger
    • 23. Mai 2025 um 18:36

    Irgendwie riecht das für mich nach Werbung.... :/

  • Mozilla stellt Pocket und Fakespot ein

    • Boersenfeger
    • 23. Mai 2025 um 18:19

    Wer ist Kevin... muss man den kennen?

  • Mozilla stellt Pocket und Fakespot ein

    • Boersenfeger
    • 23. Mai 2025 um 16:41

    Schade, auch ich werde Fakespot vermissen. Pocket allerdings habe auch ich nicht benutzt. So langsam muss man sich wohl Gedanken machen, ob es Firefox in einigen Jahren noch gibt. =O

  • extras_config_menu.uc.js in Fx 139 keine Funktion mehr

    • Boersenfeger
    • 20. Mai 2025 um 18:32

    Teste diese Version

    JavaScript
    /*
    // ==UserScript==
    // @name           extras_config_menu.uc.js
    // @compatibility  Firefox 135*.*
    // @include        main
    // @version        1.0.20250112
    // @edit           @aborix 7/21 CSS Dateien als Untermenü eingefügt 
    // @edit           @2002Andreas 8/21 Shadow CSS Dateien als Untermenü + Ordner eingefügt
    // @edit 	   @BrokenHeart	1/25 Anpass. wg. Änderung der Sicherheitsrichtlinien bei 'inlineEvents'
    // ==/UserScript==
    */
    var uProfMenu = {
      // Beginn der Konfiguration
      // In der folgenden Zeile (11) den Pfad zum Texteditor eintragen (unter Ubuntu 10.04 z.B.: '/usr/bin/gedit'). Bei Fehleintrag wird view_source.editor.path ausgelesen:
      //TextOpenExe: 'C:\\Program Files (x86)\\Notepad++\\notepad++.exe',
      TextOpenExe: 'H:\\Notepad++\\notepad++.exe',
      // Falls gewuenscht, in Zeile 15 einen Dateimanager eintragen (komplett leer lassen fuer Dateimanager des Systems) Beispiele:
      // vFileManager: 'E:\\Total Commander\\Totalcmd.exe',
      // vFileManager: 'C:\\Program Files (x86)\\FreeCommander\\FreeCommander.exe'
      vFileManager: 'H:\\TotalCommander\\TOTALCMD64.exe',
      // In der folgenden Zeile (19) 'menu' eintragen, damit es unter "Extras" als Menue erscheint, sonst die id des gewuenschten
      // Elements *nach* dem der Button erscheinen soll (z.B. 'urlbar', 'searchbar', 'undoclosetab-button','abp-toolbarbutton')
      // Bitte nicht so etwas wie die Menue- oder Navigationsleiste (sondern einen Menuepunkt oder einen Button mit id auf diesen Leisten) eintragen:
      warpmenuto: 'back-Button',
      // Unter Linux sollte/kann versucht werden, die userChromeJS-Skripte zu sortieren, unter Windows ist das evtl. nicht noetig (die Sortierung wird Gross- und Kleinschreibung *nicht* beruecksichtigen - dazu wird die sort()-Funktion entsprechend mit einer Vergleichsfunktion aufgerufen)
      sortScripts: 0,   // 1 zum Erzwingen der Sortierung
      // Einbindung GM-Skripte-Ordner (0: nein, 1: Greasemonkey [Profil-Verzeichnis], 2: UserScriptLoader [Chrome-Verzeichnis], 3: Scriptish [Profil-Verzeichnis]):
      gmOrdner: 0,
      // Einbindung CSS-Ordner (0: nein, 1: UserCSSLoader-Ordner im Chrome-Verzeichnis):
      cssOrdner: 1,
      // In Zeile 30 gueltige about:Adressen eintragen, die ebenfalls aufgerufen werden sollen.
      // - Zum Ausblenden: abouts: [],
      // - Damit die about:-Seiten nicht als Untermenue, sondern direkt als Menuepunkte aufgefuehrt werden, muss das erste Element '0' sein:
      // abouts: ['0','about:about','about:addons','about:cache','about:config','about:support'],
      abouts: ['about:about','about:addons','about:cache','about:config','about:crashes','about:downloads','about:home','about:logins','about:memory','about:support','about:preferences','about:performance','about:profiles'],
      // Die normalen Firefox-Einstellungen auch zur Verfuegung stellen (0: nein, 1: ja):
      showNormalPrefs: 1,
      // Stellt "Skriptliste in Zwischenablage" zur Verfuegung (1: ja, 2: mit getrennter Nummerierung, 3: mit gemeinsamer Nummerierung) oder nicht (0):
      enableScriptsToClip: 1,
      // Um den Eintrag "Neustart" zu erzwingen (falls z.B. das andere Skript zu spaet eingebunden und nicht erkannt wird), auf 1 setzen:
      enableRestart: 0,
      // Ende der Konfiguration
    
      init: function() {
    	      if (location.href !== 'chrome://browser/content/browser.xhtml') return;
        if (this.warpmenuto.toLowerCase() == 'menu') {
          // aufgrund des gewaehlten warpmenuto als Untermenue von Extras anlegen
          var zielmenu = document.getElementById('menu_ToolsPopup');
          if (zielmenu==null) {
            userChrome.log("extras_config_menu.uc.js findet Zielmenue nicht, evtl. weil ein anderes Fenster als das Hauptfenster " +
                           "geoeffnet wurde. Falls dieser Fehler auch im Hauptfenster auftritt, bitte die vorgehende Definition " +
                           "von 'zielmenu' kontrollieren.");
           return
          }
          var menu = zielmenu.appendChild(this.createME("menu","Config Men\u00FC",0,0,"ExtraConfigMenu"));
          menu.setAttribute("class","menu-iconic");
          menu.setAttribute("ondblclick","openTrustedLinkIn('about:config', 'tab');");
         } else {
    		 
    	 // als verschiebbaren Button anlegen
          if (window.__SSi == "window0") {
            CustomizableUI.createWidget({
              id: "ExtraConfigMenu-button",
              defaultArea: CustomizableUI.AREA_NAVBAR,
              label: "Extra Config Menü",
              tooltiptext: "Extra Config Menü\nRechtsklick \öffnet about:config"
            });
    		
          }
          var menu = document.getElementById("ExtraConfigMenu-button");
          menu.setAttribute("type", "menu");
    	  menu.addEventListener('click', function(event) {
    			if (event.button == 2 && !this.open) { 
    				openTrustedLinkIn("about:config", "tab");
    				event.preventDefault();
    			};
    	 },true);
    	  
        }
    	
        //ab hier ist alles gleich, egal ob Button oder Menue
        var css = " \
          #ExtraConfigMenu, #ExtraConfigMenu-button { \
            list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACnElEQVR4Xm2RzYtbZRSHn/fr3pvJzTB3qiNM2k2pMBUGhEHaqsUqdeFGQalCobgREaFu/B/cqCtxVSjoQhBEQRBmIfWDKgNGJUPt0Nhah9JJ4iSd5E6+bu5972tAO4SS5/DjXZ1znsMrNiq1eikMQqYYJCmjxNH5+zdW777L0J5KKl9VPmnf+ut9KWkwhbheuzNcOVYOmGKc5iRO0r1ykeXCx0h7kt4fC3z5wfqbQnAJwQHa5S7jAZSRuJ0mkf81cheobhBXZa+ri1uptQjHAZoZCEC1PiPgDuwxCfwerBU7b73zXn//3usCcdt4HkZ7SGZg431U51NUCgwlO3cV/bVXhR/6p9ut+nP9QYeNn7/n8qUPZxvQ/Q6VVWHk4ZqWRvlJjpx9hcGfW2wO95N2q8m3618A2WwDt/0RplSAXsBed57eyossHl5GYdHacG3zGpADM06wjQ1UUIN+CLHPvfAxojPnKLiE+bDE1R9+5GatAmgPeGCAteQ7l5GBhGSyuROyd/gFouUyWkqEErR2mwXAAA8BRS0AgMQBjSra30ZkEeDzz9Dn4ZcvMO51SMcJcTdGChmA0ABA6cAgzyG3I8jLEBylV4fWoaeIc0V7t0Uv7pFbC+CA+28mp/8+SwXKnMVmz1O9HpE+eobMZdjcoY1GIHD/NwIdoH1fBaNguzlg88pVyoUi4vTbFI8eJxsNAIfSkrliESllH/L0v0jktNNomFGv1TFrL3Fo9QSMR3jaEEXzLC09gjaKp595No0WjyCEB4zRclICUMDxtRMce/wJ1MIi2SglXShhfI/cOjxPoZRmbq4gXzt/gVrtBrdvbiG+Wf+p/mvll1BpiVAGhCDPxuAUDotz4HKHlIJON6bRbL4hhPjcMx5mkn8BBLEUrsVZbq0AAAAASUVORK5CYII=);  \
    		 margin-top: 0px !important; \);  \
    		 margin-top: 0px !important; \
    		 opacity: 1 !important;\
          } \
          #ExtraConfigMenu-button > dropmarker, #ExtraConfigMenu-button > hbox > .toolbarbutton-menu-dropmarker { \
            display: none !important; \
          }";
        var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
        var uri = makeURI('data:text/css;charset=UTF=8,' + encodeURIComponent(css));
        sss.loadAndRegisterSheet(uri,sss.AGENT_SHEET);
    	menu.addEventListener('popupshowing', function(event) {
    			uProfMenu.getScripts(0);
    			uProfMenu.getCss(3);
    			uProfMenu.getCss(4);
    			uProfMenu.getCss(5);
    	 },true);
    	
        var menupopup = menu.appendChild(this.createME("menupopup",0,0,0,"ExtraConfigMenu-popup"));
        // Anlegen von Untermenues fuer userChromeJS-Skripte und CSS-Dateien (befuellen spaeter)
        var submenu = menupopup.appendChild(this.createME("menu","Meine Scripte",0,0,"submenu-ucjs"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucjs-items"));
        // var submenu = menupopup.appendChild(this.createME("menu","uc.xul",0,0,"submenu-ucxul"));
        // var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-ucxul-items"));
        var submenu = menupopup.appendChild(this.createME("menu","Meine CSS-Dateien",0,0,"submenu-css"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-css-items"));
        //var submenu = menupopup.appendChild(this.createME("menu","CSSShadow",0,0,"submenu-CSSShadow"));
        //var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-CSSShadow-items"));
        //var submenu = menupopup.appendChild(this.createME("menu","cssweb",0,0,"submenu-cssweb"));
        var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-cssweb-items"));
        if (this.enableScriptsToClip) menupopup.appendChild(this.createME("menuitem","Skriptliste in Zwischenablage","uProfMenu.getScripts(1)","uProfMenu_clipboard",0));
        // Ende Anlegen von Untermenues
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Konfigdateien
        //menupopup.appendChild(this.createME("menuitem","Bild Url","uProfMenu.edit(0,'Bild Url.css');","uProfMenu_edit",0));
        //menupopup.appendChild(this.createME("menuitem","config Einträge.css","uProfMenu.edit(0,'config Einträge.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChrome.css","uProfMenu.edit(0,'userChrome.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userChromeShadow.css","uProfMenu.edit(0,'userChromeShadow.css');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","userContent.css","uProfMenu.edit(0,'userContent.css');","uProfMenu_edit",0));
        //menupopup.appendChild(this.createME("menuitem","userChrome.js","uProfMenu.edit(0,'userChrome.js');","uProfMenu_edit",0));
        //menupopup.appendChild(this.createME("menuitem","prefs.js","uProfMenu.edit(1,'prefs.js');","uProfMenu_edit",0));
        menupopup.appendChild(this.createME("menuitem","user.js","uProfMenu.edit(1,'user.js');","uProfMenu_edit"),0);
    
        // Ende Einbindung von Konfigdateien
        menupopup.appendChild(document.createXULElement('menuseparator'));
        // Einbindung von Ordnern
        switch (this.gmOrdner) {
          case 1:
            menupopup.appendChild(this.createME("menuitem","GM-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'gm_scripts');","uProfMenu_folder"),0);
            break;
          case 2:
            menupopup.appendChild(this.createME("menuitem","USL-skripty","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'UserScriptLoader');","uProfMenu_folder"),0);
            break;
          case 3:
            menupopup.appendChild(this.createME("menuitem","Skripty Scriptish","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'scriptish_scripts');","uProfMenu_folder"),0);
            break;
        }
    
        menupopup.appendChild(this.createME("menuitem","CSS-Ordner ","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'css');","uProfMenu_folder"),0);
        //menupopup.appendChild(this.createME("menuitem","CSSShadow-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSShadow');","uProfMenu_folder"),0);
        //menupopup.appendChild(this.createME("menuitem","CSSWeb-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'CSSWeb');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Chromeordner","uProfMenu.prefDirOpen('UChrm');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Profilordner","uProfMenu.prefDirOpen('ProfD');","uProfMenu_folder"),0);
        //menupopup.appendChild(this.createME("menuitem","Icons-Ordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'Icons');","uProfMenu_folder"),0);
        //menupopup.appendChild(this.createME("menuitem","Installationsordner","uProfMenu.prefDirOpen('CurProcD');","uProfMenu_folder"),0);
        //menupopup.appendChild(this.createME("menuitem","Addonordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfD')+uProfMenu.getDirSep()+'extensions');","uProfMenu_folder"),0);
        menupopup.appendChild(this.createME("menuitem","Startup-Cacheordner","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('ProfLD')+uProfMenu.getDirSep()+'startupCache');","uProfMenu_folder"),0);
      /*   menupopup.appendChild(this.createME("menuitem","Ordner about","uProfMenu.dirOpen(uProfMenu.getPrefDirectoryPath('UChrm')+uProfMenu.getDirSep()+'about');","uProfMenu_folder"),0); */
        // Ende Einbindung von Ordnern
    	
        // Einbindung von abouts
        if (this.abouts.length>0) {
          menupopup.appendChild(document.createXULElement('menuseparator'));
          // falls der erste Eintrag des Arrays = '0' ist, dann kein Untermenue anlegen, sondern direkt als Menuepunkte einbinden
          if (this.abouts[0]=='0') {
            for (var i = 1; i < this.abouts.length; i++) {
            menupopup.appendChild(this.createME("menuitem",this.abouts[i],"openTrustedLinkIn('"+this.abouts[i]+"','tab')","uProfMenu_about"),0);
            }
           } else {
            // der erste Eintrag des arrays ist ungleich '0', deshalb als Untermenue einrichten
            var submenu = menupopup.appendChild(this.createME("menu","uc.js",0,0,"submenu-about"));
            var submenupopup = submenu.appendChild(this.createME("menupopup",0,0,0,"submenu-about-items"));
            this.fillMenu("submenu-about","submenu-about-items", "about:",this.abouts,"uProfMenu_about",1);
          }
        }
        // Ende Einbindung von abouts
        // Separator, falls dieser nicht schon durch abouts generiert wurde und weitere Menuepunkte folgen werden
        if (this.abouts.length==0 && (this.showNormalPrefs || typeof(ToolRstartMod) != "undefined")) menupopup.appendChild(document.createXULElement('menuseparator'));
        // Falls gewuenscht (s. Konfigurationsabschnitt), Zugriff auf die normalen Einstellungen
        if (this.showNormalPrefs) menupopup.appendChild(this.createME("menuitem","Einstellungen","try{openOptionsDialog();}catch(e){openPreferences();}","uProfMenu_prefs"),0);
        // Falls addRestartButton installiert ist, Neustart zur Verfuegung stellen (addRestartButton 1.0.20120105mod erforderlich)
        if(this.enableRestart) menupopup.appendChild(this.createME("menuitem","Neustart",
        "Services.appinfo.invalidateCachesOnRestart(); Services.startup.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit,0);"));
        },
    
      getDirSep:function() {
        // Betriebssystem nach https://developer.mozilla.org/en/Code_snippets/Miscellaneous ermitteln
        var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
        var dirsep = "/";
        switch(osString) {
          case "WINNT":
            dirsep = "\\";
            break;
          case "Linux":
            dirsep = "/";
            break;
          case "Darwin":
            dirsep = "/";
            break;
        }
        return dirsep;
      },
    
      edit:function(OpenMode,Filename){
        var Path = "";
        var dSep = this.getDirSep();  // die Trennzeichen zwischen Ordnern abhaengig vom Betriebssystem machen
        switch (OpenMode){
          //Current is Chrome Directory
          case 0:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + Filename;
            break;
          //Current is Profile Directory
          case 1:
            var Path = this.getPrefDirectoryPath("ProfD") + dSep + Filename;
            break;
          //Current is Root
          case 2:
            var Path = Filename;
            break;
          //Current is CSS folder
          case 3:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSS" + dSep + Filename;
            break;
          //Current is CSSWeb folder
          case 4:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSWeb" + dSep + Filename;
            break;
    		//Current is CSSShadow folder
          case 5:
            var Path = this.getPrefDirectoryPath("UChrm") + dSep + "CSSShadow" + dSep + Filename;
            break;
        }
        this.launch(this.TextOpenExe,Path);
      },
    
      dirOpen:function(Path){
        if (this.vFileManager.length != 0) {
          var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
          var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
          var args = [Path];
          file.initWithPath(this.vFileManager);
          process.init(file);
          // Verzeichnis mit anderem Dateimanager oeffnen
          process.run(false, args, args.length);
         } else {
          // Verzeichnis mit Dateimanager des Systems oeffnen
          var dir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
          dir.initWithPath(Path);
          dir.launch();
        }
      },
    
      prefDirOpen:function(prefDir){
        Path = this.getPrefDirectoryPath(prefDir);
        this.dirOpen(Path);
      },
    
      getPrefDirectoryPath:function(str){
        // get profile directory
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get(str, Components.interfaces.nsIFile);
        if (str == 'CurProcD') {
          file = file.parent;
        };
        return file.path;
      },
    
      launch:function(RanPath,OpenPath){
        var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
        var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
        var args = [OpenPath];
        file.initWithPath(RanPath);
        // falls der im Konfigurationsabschnitt definierte Editor nicht gefunden wird, auf Einstellung in about:config ausweichen:
        if (!file.exists()) {
          var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
          RanPath = pref.getCharPref("view_source.editor.path");
          file.initWithPath(RanPath);
        }
        proc.init(file);
        proc.run(false, args, args.length);
      },
    
      stringComparison:function(a, b){
        a = a.toLowerCase();
        a = a.replace(/ä/g,"a");
        a = a.replace(/ö/g,"o");
        a = a.replace(/ü/g,"u");
        a = a.replace(/ß/g,"s");
        b = b.toLowerCase();
        b = b.replace(/ä/g,"a");
        b = b.replace(/ö/g,"o");
        b = b.replace(/ü/g,"u");
        b = b.replace(/ß/g,"s");
        return(a==b)?0:(a>b)?1:-1;
      },
    
      getScripts:function(iType) {
        // Arrays (jeweils ein Array fuer uc.js und uc.xul) nehmen Namen der gefundenen Skripte auf
        let ucJsScripts = [];
        let ucXulScripts = [];
        // Suchmuster, also die Dateierweiterungen uc.js und uc.xul
        let extjs = /\.uc\.js$/i;
        //let extxul = /\.uc\.xul$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
        // files mit Eintraegen im Chrome-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // keine gewuenschte Datei, deshalb continue
          //if (!extjs.test(file.leafName) && !extxul.test(file.leafName)) continue;
          // uc.js gefunden -> im Array ablegen
          if (extjs.test(file.leafName)) ucJsScripts.push(file.leafName);
          // uc.xul gefunden -> im Array ablegen
          //if (extxul.test(file.leafName)) ucXulScripts.push(file.leafName);
        }
        if (this.sortScripts) {
          ucJsScripts.sort(this.stringComparison);
          //ucXulScripts.sort(this.stringComparison);
        }
        // Aufruf der naechsten Methoden um die beiden Untermenues oder die Zwischenablage zu befuellen
        if (iType==0) {
          this.fillMenu("submenu-ucjs","submenu-ucjs-items", "Meine Scripte",ucJsScripts,"uProfMenu_ucjs",0);
          //this.fillMenu("submenu-ucxul","submenu-ucxul-items", "uc.xul",ucXulScripts,"uProfMenu_ucxul",0);
         } else {
          var result = this.fillClipboardValue(ucJsScripts,ucXulScripts);
          Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(result);
        }
      },
    
      getCss:function(iType) {
        // Array nimmt Namen der gefundenen css-Dateien auf
        let cssFiles = [];
        // Suchmuster, also die Dateierweiterung css
        let extcss = /\.css$/i;
        let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
        if (iType==3) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSS");
         } else if (iType==4) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSWeb");
        }  else if (iType==5) {
          aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path+this.getDirSep()+"CSSShadow");
        }
        // files mit Eintraegen im CSS- bzw. CSSWeb-Ordner befuellen
        let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
        // Ordner bzw. files durchlaufen und kontrollieren, ob gesuchte Dateien dabei sind
        while (files.hasMoreElements()) {
          let file = files.getNext().QueryInterface(Ci.nsIFile);
          // css gefunden -> im Array ablegen
          if (extcss.test(file.leafName)) cssFiles.push(file.leafName);
        }
        if (this.sortScripts) {
          cssFiles.sort(this.stringComparison);
        }
        // Untermenue befuellen
        if (iType==3) {
          this.fillMenu("submenu-css","submenu-css-items","Meine CSS-Dateien",cssFiles,"uProfMenu_css",3);
         } else if (iType==4) {
          this.fillMenu("submenu-cssweb","submenu-cssweb-items","Meine CSSWeb-Dateien",cssFiles,"uProfMenu_css",4);
        }  else if (iType==5) {
          this.fillMenu("submenu-CSSShadow","submenu-CSSShadow-items","Meine CSSShadow-Dateien",cssFiles,"uProfMenu_css",5);
        }
      },
    
      fillMenu:function(whichsubmenu, whichsubmenuitems, strlabel, scriptArray,sClass,sTyp) {
        // Beschriftung des Untermenues mit Anzahl der gefundenen Dateien ergaenzen
        var e = document.getElementById(whichsubmenu);
        e.setAttribute('label',strlabel + ' (' + scriptArray.length + ')');
        var popup = document.getElementById(whichsubmenuitems);
        // zunaechst Untermenue zuruecksetzen
        while(popup.hasChildNodes()){
          popup.removeChild(popup.firstChild);
        }
        // Untermenue endlich befuellen
        for (var i = scriptArray.length-1; i > -1; i--) {
          // Typunterscheidung (userChromeJS-Skript oder about: oder css)
          if (sTyp==0){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(0,'"+scriptArray[i]+"')",sClass,0);
    		mitem.addEventListener('click', function(event) {
    			uProfMenu.openAtGithub(event,'"+scriptArray[i]+"');
    			event.preventDefault();
    		},true);
    		
            mitem.setAttribute("tooltiptext"," Linksklick: Bearbeiten,\n Mittelklick: https://github.com/.../"+this.cleanFileName(scriptArray[i])+" oeffnen,\n Rechtsklick: Suche auf GitHub");
           } else if (sTyp==1){
            var mitem = this.createME("menuitem",scriptArray[i],"openTrustedLinkIn('"+scriptArray[i]+"','tab')",sClass,0);
           } else if (sTyp==3){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(3,'"+scriptArray[i]+"')",sClass,0);
           } else if (sTyp==4){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(4,'"+scriptArray[i]+"')",sClass,0);
          }
    	  else if (sTyp==5){
            var mitem = this.createME("menuitem",scriptArray[i],"uProfMenu.edit(5,'"+scriptArray[i]+"')",sClass,0);
          }
          popup.insertBefore(mitem, popup.firstChild);
        }
      },
    
      fillClipboardValue:function(sArray,xArray) {
        var retValue;
        var s = 0;
        var x = 0;
        s = sArray.length;
        x = xArray.length;
        switch(this.enableScriptsToClip) {
          case 1:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------\n"+sArray.join("\n")+
                       "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------\n"+xArray.join("\n");
            break;
          default:
            retValue = "userChromeJS/uc.js ("+s+"):\n------------------------";
            for (var i = 0; i < s ; i++) {
              j = i + 1;
              retValue = retValue + "\n" + j + ". " + sArray[i];
            }
            retValue = retValue + "\n\nuserChromeJS/uc.xul ("+x+"):\n-------------------------";
            if (this.enableScriptsToClip==2) s = 0;
            for (var i = 0; i < x ; i++) {
              j = i + s + 1;
              retValue = retValue + "\n" + j + ". " + xArray[i];
            }
            break;
        }
        return retValue;
      },
    
      createME:function(sTyp,sLabel,sCommand,sClass,sId) {
        // Anlegen von menuitem, menu oder menupop - fuer bestimmte Typen nicht eingesetzte Parameter werden als 0 uebergeben
        const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
        var m = document.createElementNS(XUL_NS, sTyp);
        switch (sTyp) {
          case "menuitem":
            // this.createME("menuitem","Label des Items","ZuzuweisenderCodeFueroncommand","GewuenschteKlasseDesItems",0)
            m.setAttribute('label', sLabel);
            m.setAttribute('class',sClass);
    		m.addEventListener('command', function(event) {
    			Function(sCommand)();
    		}, true);
    		
            break;
          case "menu":
            // this.createME("menu","Label des Menues",0,0,"GewuenschteIdDesMenues")
            m.setAttribute('label', sLabel);
            m.setAttribute('id', sId);
            break;
          case "menupopup":
            //this.createME("menupopup",0,0,0,"GewuenschteIdDesMenupopups");
            m.setAttribute('id', sId);
            break;
        }
        return m;
      },
    
      openAtGithub:function(e,sScript) {
        if (e.button==1){
          // Mittelklick - Seite auf GitHub oeffnen (funktioniert nur, wenn Ordner- und bereinigter Dateiname [ohne Erweiterung] uebereinstimmen):
          var sUrl = "https://github.com/ardiman/userChrome.js/tree/master/"+this.cleanFileName(sScript);
          openWebLinkIn(sUrl, 'tab');
        }
        if (e.button==2){
          // Rechtsklick - Suche auf GitHub starten (funktioniert nur, wenn der Dateiname im Code hinterlegt ist):
          e.preventDefault();
          var sUrl = "https://github.com/search?langOverride=&language=&q="+sScript+"&repo=&start_value=1&type=Code";
          openWebLinkIn(sUrl, 'tab');
        }
      },
    
      cleanFileName:function(sName) {
        sName = sName.toLowerCase();
        /* Das folgende Array enthaelt regulaere Ausdruecke, um ungueltige Zeichenfolgen entfernen:
        /Datei-Erweiterungen am Ende/, /"ucjs_" am Anfang/, /"_"gefolgtVonZahlUndDanachBeliebigenZeichen/
        / "_fx"gefolgtVonZahl(en)/, /"-" oder "+" oder "."/, /"_v"gefolgtVonZahlen
        */
        var regs = [/\.uc\.js$/,/\.uc\.xul$/,/^ucjs_/,/_\d.+/,/_fx\d+/,/[-+\.]/g,/_v\d+/];
        for (var i = 0; i < regs.length; i++) {
          sName = sName.replace(regs[i],"");
        }
        return sName;
      }
    
    };
    
    uProfMenu.init();
    Alles anzeigen
  • Firefox 138 - Script "F12 schließt Tab" geht nicht mehr

    • Boersenfeger
    • 15. Mai 2025 um 14:40

    // Deine angegebene Firefoxversion kann nicht stimmen: Aktuell für Windows wäre 138.0.3

  • Entwicklung Firefox

    • Boersenfeger
    • 12. Mai 2025 um 14:37

    Da war ich noch im Urlaub..... ;)

    Stromboli mit Sonnenuntergang :love:

  • Entwicklung Firefox

    • Boersenfeger
    • 11. Mai 2025 um 12:15

    Also hier klappt es eigentlich die ganze Woche reibungslos: Derzeit...

    https://hg.mozilla.org/mozilla-central/rev/f98105932398981396c357a26626fa60bc5c2a39
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 ID:20250510210452

  • Der Glückwunsch-Thread

    • Boersenfeger
    • 8. Mai 2025 um 17:37

    ..auch von mir ;)

  • Diskussion über neues Unterforum nur für Skripte

    • Boersenfeger
    • 8. Mai 2025 um 17:35

    Ein Problem, was ich dabei sehe:

    Es gibt Scripte, die werden hier zur Diskussion gestellt, haben aber keine Bezeichnung....

    Wenn man sich hier darauf verständigt, dass zur Diskussion gestellte Scripte ungefähr so angelegt sind:

    JavaScript
    // ==UserScript==
    // @name				Change Password
    // @namespace	http://space.geocities.yahoo.co.jp/gl/alice0775
    // @description	
    // @include			chrome://passwordmgr/content/passwordManager.xhtml
    // @compatibility  14.0.*
    // @author         Alice0775
    // @version		   2019/12/19 17:00 Anpassungen .xul nach .xhtml
    // @version        2008/12/08 18:10 
    // @version        2008/12/07 18:00 
    // @version        2008/12/07 16:00 filter
    // @version        2008/12/06 19:00 Firefox 3.0, 3.1, 3.2a1pre
    // @version        2008/02/21 20:00
    // ==/UserScript==
    Alles anzeigen

    .. würde dies ein Nachverfolgen schon mal erleichtern.

    Viele sind aber ganz persönlich angepasst, wenn auch nur in Nuancen.
    Das Ziel wird ja sicher auch nicht sein, dass ein Script für alle User haarklein genau gleich aussieht...

  • "Firefox: Nutzerzahlen geben weiter nach" bei Caschys Blog

    • Boersenfeger
    • 7. Mai 2025 um 12:20

    ..dito... ebenso meide ich die sog. sozialen Medien.

    Und um mal ein Loblied zu singen: Ich nutze Firefox schon seit Phoenix-Zeiten, er bietet mir alles, was ich benötige. Ich habe ihn mir mit Erweiterungen, User-Scripten, user.uc.js-Scripten, CSS-Codes angepasst, habe die inneren Einstellmöglichkeiten genutzt und schließlich bin ich mit der Nightly-Version immer einen Schritt voraus. Dies war mir auch nur durch die Mitglieder dieses tollen Forums möglich. Dafür an dieser Stelle mal ein kräftiges

    DANKESCHÖN! :P:thumbup::!:

    Abschließend noch der Hinweis, dass, wenn der Firefox mal nicht mehr verfügbar sein sollte, ich mit Vivaldi weiter im Internet unterwegs sein werde. Aber bis dahin vergeht hoffentlich noch eine seeeehr lange Zeit. ;)

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Boersenfeger
    • 27. April 2025 um 11:12
    Zitat von Horstmann

    Ein grosser Unterschied wäre noch die Möglichkeit, separate CSS Dateien live editieren und speichern zu können in den Browser Werkzeugen, und auch sofort ein Ergebnis zu sehen.

    Geht wohl fast hiermit:

    JavaScript
    // cssLive.uc.js
    
    (function() {
    	    if (location.href !== 'chrome://browser/content/browser.xhtml') return;
    	//if (location !=AppConstants.BROWSER_CHROME_URL) {
    //		return;
    	
    
    
    	/*** OPTIONEN START *******************************************************/
    	
    	var cssLiveOptions = {
    		/* Falls sich die Testdatei in einem Unterverzeichnis von "chrome" 
    		befindet, bitte hier zwischen Anführungszeichen eintragen, ansonsten
    		nur die Anführungszeichen */
    		subdir: 'css',
    		/* Name der Testdatei */
    		file: 'Test.css'
    	};
    
    	/*** OPTIONEN ENDE ********************************************************/
    	
    	var buttonPath = '';
    	var testFile = Services.dirsvc.get('UChrm', Ci.nsIFile);
    	if( cssLiveOptions.subdir != '' ) {
    		testFile.append( cssLiveOptions.subdir );
    		buttonPath += cssLiveOptions.subdir + "/";
    	}
    	testFile.append( cssLiveOptions.file );
    	buttonPath += cssLiveOptions.file;
    	var buttonTxt_1 = buttonPath + " aufrufen";
    	var buttonTxt_2 = buttonPath + " ausführen";
    	var errorTxt = "Die Datei \n" + testFile.path + "\n existiert nicht.";
    
    	ChromeUtils.importESModule("resource:///modules/CustomizableUI.sys.mjs");
    
    	try {
    		CustomizableUI.createWidget({
    			id: "fp-get-css-file",
    			defaultArea: CustomizableUI.AREA_NAVBAR,
    			removable: true,
    			label: buttonTxt_1,
    			tooltiptext: buttonTxt_1,
    			onClick: function() {
    				if( testFile.exists() ) {
    					testFile.launch();
    				} else {
    					alert( errorTxt );
    				}
    			},
    			onCreated: function(aNode) {
    				aNode.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADJklEQVR4Xi3Pb0yVdRjG8e/ze57ncDrAOWwRhDQ7xYAMlAgIBW2txaio5TvMzZa68oWtzRdKbXbIpWyOzcWLWqXkFjUtsIksW72wuTVx+EJHCxhkSCNoKLYDwuH8e66eNV98dr24t/u+LwsAoKsucqg4tFS4kiTtge4PFAkRksADGdsyua4JXJ7ITH0yQw+ABTB3sHGipGNjJX8MgzGw6oEBQi5kPYinQBYEbDDAX5PEulJXPhqn2bQE2Fayfa2S8THOfu/wzTkDzmOQV8nAkOHMoIFgmS9K3w/i5DmP1fwqdrbRFIR6euqJ6btc2Y4jsGWM0emOWrU2FAtQRTSiid7n9EJtkQCVlebrUle9lnuLVA3v09/G8diLCFxp+DVprF2a2KHqsrACtqVbQy9L8T2qq4goaKOpz5uka22Kn1yn2gBHOPMSx9o3obJokbS8R/p3txTfK918Q+2tjwrQYPcWaW6Xdj5fKkB9B2uks+v1VICYSWXQjia4eWuB8z2/0//pGMMD04yP3qFzfzXBoE3sszGmR27Tubuc3KDDsf4ZsME2iO4GjuqXQh1orxDwv1OxBsX2VQlQcWGObnzdog/3bhCg0uIHNPLFVqnf/8DlA2ctDSTgxNFnOHFgE7jAg7kQcjnS8TRgQcCiprGQzncrIZ0i/u0so7lLODlgsh6QSMNCAix8BhJJNH6b5NwyFNhwLwWuB/NxEoemudi9wMT8Cq4LBrDwgLUULK/BPR9+jC4ytPUC17/8DR6CpYEplt+eJTX7OH9HbEL5NvKwjGvj4AHprC8DSZ+/zHJgI+uI+xdvbL9E+JRLJr+Sr5LXKd8foqY8QjqN7fxzlzhaAy8LGYHnQTxJ3hNhFlptCi4XsP7PEoaD4mr4KlveeZjNG4qYvDbKyipJolCXOI70U630Y6uvRfrZzyuvSKOvavK9Kp2OFqv3zagWLzb7s21aubBZ519HFjzrg8NP8utbu2hWMIyyHpYBYwyOa2Hn2cwuJAiHAthp+e087s4n6e5LjwzeodECAKiAffk5PJLOkJKFACzLZ8B27jfMYgUM7mKSuzPwMcB/6Jh/V5xUni0AAAAASUVORK5CYII=)';
    				return aNode;
    			}
    		});
    	} catch (e) {
    		Components.utils.reportError(e);
    	};
    
    
    	try {
    		CustomizableUI.createWidget({
    			id: "fp-register-css-file",
    			defaultArea: CustomizableUI.AREA_NAVBAR,
    			removable: true,
    			label: buttonTxt_2,
    			tooltiptext: buttonTxt_2,
    			onClick: function() {
    				if( testFile.exists() ) {
    					var CI = Components.interfaces;
    					var CC = Components.classes;
    					let sss = CC["@mozilla.org/content/style-sheet-service;1"].getService( CI.nsIStyleSheetService );
    					let ios = CC["@mozilla.org/network/io-service;1"].getService( CI.nsIIOService );
    					let fileURL = Services.io.getProtocolHandler( 'file' ).QueryInterface( Ci.nsIFileProtocolHandler ).getURLSpecFromFile( testFile );
    					let uri = ios.newURI( fileURL , null , null );
    					sss.loadAndRegisterSheet( uri , sss.AGENT_SHEET );
    				} else {
    					alert( errorTxt );
    				}
    			},
    			onCreated: function(aNode) {
    				aNode.style.listStyleImage = 'url(data:image/gif;base64,R0lGODlhEAAQAPcAAAQCVISChMTCtOTizNTSxERCRAQCZJSW1MzGzNTW1Ozq7CwqdKyqlMzKxERCjMTCxNzavLy6vMzKzPz67HRypCQiJJyahAQCdOTe1CQinLy65Pz2/PT23NTSzNzW3Ly6tExGnMTGxMS+xMzK1JSWpAQCXMTGvOzmzAQCbMTC1Nza1DQ2dKyqnNTOxExOfOTezLy+vMzOzPz+7Hx+rDQyNKSehAQCfCwqlPz+/NzWzMzGxAD/AOQA2C8A6iQAEgAAAACAAAAAAAAAAAAAAAACAAAAAAAAAAAAAADMAkPpACYSAAAAAKAVCC+LACQ/AAB3AADQhADq7QASEgAAAACwTkPqACYSAAAAAOgACAcAACgACgAAAACwnADqjAASPwAAd/8CBP8AAP8AAAAAAABwAADqAAASAAAAADB6QwSBAAA/OgB3AIQSXAGSAAE/UAF3ABDUcugdABITbwB3AHQAZ40AADQAcnYAAMwIYfsCABIAbQAAAPo4X5m1jDknN3cAdlQASLoA7z8AnAAB1f4sAP/pAP8SAP8AABIAB3UAAD8AAHcAAEWEAHXtAD8SAHcAAABOAAAAEABQKAAAAACwAENDACYmAAAAAAD+AEP/ACb/AAD/AHA4AGbqAD8SAHcAADQAAAAAAAAAAMAAAAQANOoBiBIAuQAAo29l/ogm/zQ0/3Z2/wA4XwDqjCQSNwAAdgBPJQAgAAA0AAB2APhcJULqACYSAAAAAAAAoAABuwAAUAAAAGVl/yYm/zQ0/3Z2/wAAAAEAAAAAAAAAAKAYZB0A6xMAEncAAADnRgAlgyQ0TAB2AAAARAAA6wAAEgAAAKRgdwPrUCQSTwAAAEgieAEm6yQ0EgB2AA/U5wBsJQBPNAAAdh7gHQB37QBPEgAAAHQA2QEB/yQA/wAAfy1c+ADq7AASEgAAAEgAAAEBACQAAAAAAABD5wAmJQA0NAB2dg4BAAAAAAAAAAAAAAAAPAAA7wAAnAAB1Ui4GAHtFCQSKAAAAFP6AQCZLQA5SAB3ACH5BAAAAAAALAAAAAAQABAABwi3AAsEGEiwYEEaARQk8MCQ4UIPCxNsEJhABIwIGE08wAhDxAMFFB/gGCkjhkgcEwh8DEkBQIkSAkzMcPlhZYAEDwjguLCCgw4cIGrgBBnAwwMRAzKggNBCgwsVIWxWzDkCBQkcNxhIeCCV6wMZBlDgKIEhqgiiUx+8OIBiAYsOXoka5dogBQoHJhDEpejxQYgTNizk8NrVK4EcH6JyPRuyb9/FXIluUEC5smXKOArQKMC5s2fPFQICADs=)';
    				return aNode;
    			}
    		});
    	} catch (e) {
    		Components.utils.reportError(e);
    	}
    
    })();
    Alles anzeigen
  • Grafik in Thunderbird-mail einfügen

    • Boersenfeger
    • 25. April 2025 um 14:57

    Die Anfrage wurde vom Nutzer dort gestellt und von mir beantwortet.

  • Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen

    • Boersenfeger
    • 17. April 2025 um 16:31

    Nein, so wie abgebildet, stört mich aber auch nicht. :)

  • Nach Installaton von win 11 funktionieren Scripte nicht mehr

    • Boersenfeger
    • 17. April 2025 um 16:28

    Es sind ggf. Ergänzungen in einem neuen Profil und Programmordner nötig. Ob die einfach so übernommen werden?

    Thema

    Videoanleitung für userChrome.css, userContent.css, Vorbereitung Skripte

    Nur zur Info, wer es braucht kann es gerne verlinken.

    Ich habe 3 ausführliche Videos erstellt

    1. wie man eine userChrome.css erstellt und einen Beispiel Code einfügt

    https://mozhelp.ddnss.de/dateien/forum/…e-erstellen.mp4

    2. wie man eine userContent.css erstellt und einen Beispiel Code einfügt

    https://mozhelp.ddnss.de/dateien/forum/…t-erstellen.mp4

    3. Vorbereitung von Skripten ausgehend von https://github.com/Endor8/userChrome.js/

    https://mozhelp.ddnss.de/dateien/forum/…ung-skripte.mp4

    Vielleicht hilft…
    Zitronella
    5. Juni 2021 um 14:43

    Scroll mal im Beitrag nach unten zum Zitatekasten

Unterstütze uns!

Jährlich (2025)

82,4 %

82,4% (535,86 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon