X/Twitter Clean menu and sidebar (Supports multiple language)

hidden Menu,Grok,Premium subscription,Verified Orgs,Explore,Notifications,Messages,Bookmarks and Customizable Settings

当前为 2024-06-28 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name X/Twitter Clean menu and sidebar (Supports multiple language)
  3. // @name:ja X/Twitter きれいなメニューとサイドバー(多言語対応)
  4. // @name:zh-TW X/Twitter 乾淨的選單和側邊欄(支持多種語言)
  5. // @name:zh-cn X/Twitter 干净的选单和侧边栏(支持多种语言)
  6. // @version 1.3
  7. // @description hidden Menu,Grok,Premium subscription,Verified Orgs,Explore,Notifications,Messages,Bookmarks and Customizable Settings
  8. // @description:ja 清潔なメニュー、Grok、高度なサブスクリプション、認証済み組織、探索、通知、メッセージ、ブックマーク、およびカスタム設定
  9. // @description:zh-tw 乾淨的 選單、Grok、高級訂閱、已認證組織、探索、通知、訊息、書籤和可自訂設定
  10. // @description:zh-cn 干净的 选单、Grok、高级订阅、已认证组织、探索、通知、私信、书签和可自订设定
  11. // @license MIT
  12. // @author movwei
  13. // @match https://x.com/*
  14. // @match https://twitter.com/*
  15. // @grant GM_registerMenuCommand
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_addStyle
  19. // @namespace https://greasyfork.org/users/1041101
  20. // ==/UserScript==
  21.  
  22. (function() {
  23. 'use strict';
  24.  
  25. const defaultSettings = {
  26. hideGrok: true,
  27. hidePremiumSignUp: true,
  28. hideSelectors: true,
  29. hideVerifiedOrgs: true,
  30. hideExplore: false,
  31. hideNotifications: false,
  32. hideBookmarks: false,
  33. hideMessages: false,
  34. };
  35.  
  36. const settings = {
  37. hideGrok: GM_getValue('hideGrok', defaultSettings.hideGrok),
  38. hidePremiumSignUp: GM_getValue('hidePremiumSignUp', defaultSettings.hidePremiumSignUp),
  39. hideSelectors: GM_getValue('hideSelectors', defaultSettings.hideSelectors),
  40. hideVerifiedOrgs: GM_getValue('hideVerifiedOrgs', defaultSettings.hideVerifiedOrgs),
  41. hideExplore: GM_getValue('hideExplore', defaultSettings.hideExplore),
  42. hideNotifications: GM_getValue('hideNotifications', defaultSettings.hideNotifications),
  43. hideBookmarks: GM_getValue('hideBookmarks', defaultSettings.hideBookmarks),
  44. hideMessages: GM_getValue('hideMessages', defaultSettings.hideMessages)
  45. };
  46.  
  47. // 多語言支持
  48. const language = navigator.language || navigator.userLanguage;
  49. const languages = {
  50. 'en': {
  51. 'hideGrok': 'Hide Grok',
  52. 'hidePremiumSignUp': 'Hide Premium Sign-up',
  53. 'hideSelectors': 'Hide Subscribe Message',
  54. 'hideVerifiedOrgs': 'Hide Verified Orgs',
  55. 'hideExplore': 'Hide Explore',
  56. 'hideNotifications': 'Hide Notifications',
  57. 'hideMessages': 'Hide Messages',
  58. 'hideBookmarks': 'Hide Bookmarks',
  59. 'settings': 'Settings',
  60. 'saveRefresh': 'Save & refresh',
  61. 'close': 'Close'
  62. },
  63. 'zh-TW': {
  64. 'hideGrok': '隱藏 Grok',
  65. 'hidePremiumSignUp': '隱藏 高級訂閱',
  66. 'hideSelectors': '隱藏 訂閱訊息',
  67. 'hideVerifiedOrgs': '隱藏 已認證組織',
  68. 'hideExplore': '隱藏 探索',
  69. 'hideNotifications': '隱藏 通知',
  70. 'hideMessages': '隱藏 訊息',
  71. 'hideBookmarks': '隱藏 書籤',
  72. 'settings': '設定',
  73. 'saveRefresh': '保存並刷新',
  74. 'close': '關閉'
  75. },
  76. 'zh-CN': {
  77. 'hideGrok': '隐藏 Grok',
  78. 'hidePremiumSignUp': '隐藏 高级订阅',
  79. 'hideSelectors': '隐藏 订阅消息',
  80. 'hideVerifiedOrgs': '隐藏 已认证组织',
  81. 'hideExplore': '隐藏 探索',
  82. 'hideNotifications': '隐藏 通知',
  83. 'hideMessages': '隐藏 私信',
  84. 'hideBookmarks': '隐藏 书签',
  85. 'settings': '设置',
  86. 'saveRefresh': '保存并刷新',
  87. 'close': '关闭'
  88. },
  89. 'ja': {
  90. 'hideGrok': 'Grokを非表示',
  91. 'hidePremiumSignUp': 'プレミアムサインアップを非表示',
  92. 'hideSelectors': 'サブスクライブメッセージを非表示',
  93. 'hideVerifiedOrgs': '認証済み組織を非表示',
  94. 'hideExplore': '話題を検索を非表示',
  95. 'hideNotifications': '通知を非表示',
  96. 'hideMessages': 'メッセージを非表示',
  97. 'hideBookmarks': 'ブックマークを非表示',
  98. 'settings': '設定',
  99. 'saveRefresh': '保存してリフレッシュ',
  100. 'close': '閉じる'
  101. },
  102. };
  103.  
  104. const currentLanguage = languages[language] || languages['en'];
  105.  
  106. function createSettingsPanel() {
  107. const panel = document.createElement('div');
  108. panel.id = 'settingsPanel';
  109. panel.innerHTML = `
  110. <div id="settingsPanelContent">
  111. <h2>${currentLanguage['settings']}</h2>
  112. <label><input type="checkbox" id="hideGrokCheckbox" ${settings.hideGrok ? 'checked' : ''}> ${currentLanguage['hideGrok']}</label><br>
  113. <label><input type="checkbox" id="hidePremiumSignUpCheckbox" ${settings.hidePremiumSignUp ? 'checked' : ''}> ${currentLanguage['hidePremiumSignUp']}</label><br>
  114. <label><input type="checkbox" id="hideSelectorsCheckbox" ${settings.hideSelectors ? 'checked' : ''}> ${currentLanguage['hideSelectors']}</label><br>
  115. <label><input type="checkbox" id="hideVerifiedOrgsCheckbox" ${settings.hideVerifiedOrgs ? 'checked' : ''}> ${currentLanguage['hideVerifiedOrgs']}</label><br>
  116. <label><input type="checkbox" id="hideExploreCheckbox" ${settings.hideExplore ? 'checked' : ''}> ${currentLanguage['hideExplore']}</label><br>
  117. <label><input type="checkbox" id="hideNotificationsCheckbox" ${settings.hideNotifications ? 'checked' : ''}> ${currentLanguage['hideNotifications']}</label><br>
  118. <label><input type="checkbox" id="hideMessagesCheckbox" ${settings.hideMessages ? 'checked' : ''}> ${currentLanguage['hideMessages']}</label><br>
  119. <label><input type="checkbox" id="hideBookmarksCheckbox" ${settings.hideBookmarks ? 'checked' : ''}> ${currentLanguage['hideBookmarks']}</label><br>
  120. <button id="saveSettingsButton">${currentLanguage['saveRefresh']}</button>
  121. <button id="closeSettingsButton">${currentLanguage['close']}</button>
  122. </div>
  123. `;
  124. document.body.appendChild(panel);
  125.  
  126. document.getElementById('saveSettingsButton').addEventListener('click', saveSettings);
  127.  
  128. document.getElementById('closeSettingsButton').addEventListener('click', () => {
  129. document.getElementById('settingsPanel').style.display = 'none';
  130. });
  131. }
  132.  
  133. function saveSettings() {
  134. settings.hideGrok = document.getElementById('hideGrokCheckbox').checked;
  135. settings.hidePremiumSignUp = document.getElementById('hidePremiumSignUpCheckbox').checked;
  136. settings.hideSelectors = document.getElementById('hideSelectorsCheckbox').checked;
  137. settings.hideVerifiedOrgs = document.getElementById('hideVerifiedOrgsCheckbox').checked;
  138. settings.hideExplore = document.getElementById('hideExploreCheckbox').checked;
  139. settings.hideNotifications = document.getElementById('hideNotificationsCheckbox').checked;
  140. settings.hideBookmarks = document.getElementById('hideBookmarksCheckbox').checked;
  141. settings.hideMessages = document.getElementById('hideMessagesCheckbox').checked;
  142.  
  143. GM_setValue('hideGrok', settings.hideGrok);
  144. GM_setValue('hidePremiumSignUp', settings.hidePremiumSignUp);
  145. GM_setValue('hideSelectors', settings.hideSelectors);
  146. GM_setValue('hideVerifiedOrgs', settings.hideVerifiedOrgs);
  147. GM_setValue('hideExplore', settings.hideExplore);
  148. GM_setValue('hideNotifications', settings.hideNotifications);
  149. GM_setValue('hideBookmarks', settings.hideBookmarks);
  150. GM_setValue('hideMessages', settings.hideMessages);
  151. location.reload();
  152. }
  153.  
  154. GM_addStyle(`
  155. #settingsPanel {
  156. width: 250px;
  157. position: fixed;
  158. top: 50%;
  159. left: 50%;
  160. transform: translate(-50%, -50%);
  161. background-color: white;
  162. border: 1px solid #ccc;
  163. padding: 20px;
  164. z-index: 10000;
  165. display: none;
  166. box-shadow: 0 4px 8px rgba(0,0,0,0.1);
  167. border-radius: 8px;
  168. }
  169.  
  170. #settingsPanelContent {
  171. display: flex;
  172. flex-direction: column;
  173. align-items: flex-start;
  174. width: 100%;
  175. }
  176.  
  177. #settingsPanel h2 {
  178. margin: 0 0 15px 0;
  179. font-size: 18px;
  180. color: #333;
  181. text-align: center;
  182. width: 100%;
  183. }
  184.  
  185. #settingsPanel label {
  186. margin: 5px 0;
  187. font-size: 14px;
  188. color: #333;
  189. }
  190.  
  191. #settingsPanel button {
  192. margin-top: 10px;
  193. padding: 8px 15px;
  194. font-size: 14px;
  195. color: white;
  196. background-color: #007BFF;
  197. border: none;
  198. border-radius: 4px;
  199. cursor: pointer;
  200. width: 100%;
  201. }
  202.  
  203. #settingsPanel button#closeSettingsButton {
  204. background-color: #6c757d;
  205. }
  206. `);
  207.  
  208. createSettingsPanel();
  209. GM_registerMenuCommand(currentLanguage['settings'], () => {
  210. const panel = document.getElementById('settingsPanel');
  211. panel.style.display = 'block';
  212. });
  213.  
  214. function addGlobalStyle(css) {
  215. var head, style;
  216. head = document.getElementsByTagName('head')[0];
  217. if (!head) { return; }
  218. style = document.createElement('style');
  219. style.type = 'text/css';
  220. style.innerHTML = css;
  221. head.appendChild(style);
  222. }
  223.  
  224. var cssRules = '';
  225. if (settings.hideSelectors) {
  226. cssRules += '.css-175oi2r.r-1habvwh.r-eqz5dr.r-uaa2di.r-1mmae3n.r-3pj75a.r-bnwqim { display: none !important; }';
  227. }
  228. if (settings.hideGrok) {
  229. cssRules += 'a[href="/i/grok"] { display: none !important; }';
  230. }
  231. if (settings.hidePremiumSignUp) {
  232. cssRules += 'a[href="/i/premium_sign_up"] { display: none !important; }';
  233. }
  234. if (settings.hideVerifiedOrgs) {
  235. cssRules += 'a[href="/i/verified-orgs-signup"] { display: none !important; }';
  236. }
  237. if (settings.hideExplore) {
  238. cssRules += 'a[href="/explore"] { display: none !important; }';
  239. }
  240. if (settings.hideNotifications) {
  241. cssRules += 'a[href="/notifications"] { display: none !important; }';
  242. }
  243. if (settings.hideBookmarks) {
  244. cssRules += 'a[href="/i/bookmarks"] { display: none !important; }';
  245. }
  246. if (settings.hideMessages) {
  247. cssRules += 'a[href="/messages"] { display: none !important; }';
  248. }
  249.  
  250. addGlobalStyle(cssRules);
  251. })();