X/Twitter 干净的选单和侧边栏(支持多种语言)

干净的 选单、Grok、高级订阅、已认证组织、#Paris2024、探索、通知、私信、书签和可自订设定

目前为 2024-07-26 提交的版本。查看 最新版本

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