browser-extension-settings 0.5.6 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,6 +19,4 @@ Copyright (c) 2023 [Pipecraft](https://www.pipecraft.net). Licensed under the [M
19
19
  ## >\_
20
20
 
21
21
  [![Pipecraft](https://img.shields.io/badge/site-pipecraft-brightgreen)](https://www.pipecraft.net)
22
- [![UTags](https://img.shields.io/badge/site-UTags-brightgreen)](https://utags.pipecraft.net)
23
- [![DTO](https://img.shields.io/badge/site-DTO-brightgreen)](https://dto.pipecraft.net)
24
- [![BestXTools](https://img.shields.io/badge/site-bestxtools-brightgreen)](https://www.bestxtools.com)
22
+ [![UTags](https://img.shields.io/badge/site-UTags-brightgreen)](https://utags.link)
@@ -7,8 +7,8 @@ import {
7
7
  createHTML,
8
8
  removeClass,
9
9
  } from "browser-extension-utils"
10
- import { openButton, openInNewTabButton } from "./common"
11
- import { i } from "./messages"
10
+ import { openButton, openInNewTabButton } from "./common.js"
11
+ import { i } from "./messages/index.js"
12
12
 
13
13
  type InstalledExtension = {
14
14
  id: string
package/lib/index.ts CHANGED
@@ -5,4 +5,4 @@ export {
5
5
  getSettingsValue,
6
6
  saveSettingsValues,
7
7
  resetSettingsValues,
8
- } from "./settings"
8
+ } from "./settings.js"
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Einstellungen",
3
+ "settings.otherExtensions": "Andere Erweiterungen",
4
+ "settings.locale": "Sprache",
5
+ "settings.displaySettingsButtonInSideMenu": "Einstellungsschaltfläche im Seitenmenü anzeigen",
6
+ "settings.menu.settings": "⚙️ Einstellungen",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Benutzer-Tags zu Links hinzufügen",
8
+ "settings.extensions.links-helper.title": "🔗 Link-Assistent",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX Minimalistischer Stil",
11
+ "settings.extensions.replace-ugly-avatars.title": "Hässliche Avatare ersetzen",
12
+ "settings.extensions.more-by-pipecraft.title": "Weitere nützliche Benutzerskripte finden",
13
+ }
14
+
15
+ export default messages
@@ -1,6 +1,7 @@
1
1
  const messages = {
2
2
  "settings.title": "Settings",
3
3
  "settings.otherExtensions": "Other Extensions",
4
+ "settings.locale": "Language",
4
5
  "settings.displaySettingsButtonInSideMenu": "Display Settings Button in Side Menu",
5
6
  "settings.menu.settings": "⚙️ Settings",
6
7
  "settings.extensions.utags.title": "🏷️ UTags - Add usertags to links",
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Configuración",
3
+ "settings.otherExtensions": "Otras extensiones",
4
+ "settings.locale": "Idioma",
5
+ "settings.displaySettingsButtonInSideMenu": "Mostrar botón de configuración en el menú lateral",
6
+ "settings.menu.settings": "⚙️ Configuración",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Agregar etiquetas de usuario a los enlaces",
8
+ "settings.extensions.links-helper.title": "🔗 Asistente de enlaces",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - Estilo minimalista V2EX",
11
+ "settings.extensions.replace-ugly-avatars.title": "Reemplazar avatares feos",
12
+ "settings.extensions.more-by-pipecraft.title": "Encontrar más scripts de usuario útiles",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Paramètres",
3
+ "settings.otherExtensions": "Autres extensions",
4
+ "settings.locale": "Langue",
5
+ "settings.displaySettingsButtonInSideMenu": "Afficher le bouton des paramètres dans le menu latéral",
6
+ "settings.menu.settings": "⚙️ Paramètres",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Ajouter des balises utilisateur aux liens",
8
+ "settings.extensions.links-helper.title": "🔗 Assistant de liens",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - Style minimaliste V2EX",
11
+ "settings.extensions.replace-ugly-avatars.title": "Remplacer les avatars laids",
12
+ "settings.extensions.more-by-pipecraft.title": "Trouver plus de scripts utilisateur utiles",
13
+ }
14
+
15
+ export default messages
@@ -1,8 +1,56 @@
1
- import { initI18n } from "browser-extension-i18n"
2
- import messagesEn from "./en"
3
- import messagesZh from "./zh-cn"
4
-
5
- export const i = initI18n({
6
- "en,en-US": messagesEn,
7
- "zh,zh-CN": messagesZh,
8
- })
1
+ import { initAvailableLocales, initI18n, extractLocaleFromNavigator } from "browser-extension-i18n"
2
+ import messagesEn from "./en.js"
3
+ import messagesZh from "./zh-cn.js"
4
+ import messagesZhHk from "./zh-hk.js"
5
+ import messagesZhTw from "./zh-tw.js"
6
+ import messagesRu from "./ru.js"
7
+ import messagesKo from "./ko.js"
8
+ import messagesJa from "./ja.js"
9
+ import messagesFr from "./fr.js"
10
+ import messagesDe from "./de.js"
11
+ import messagesIt from "./it.js"
12
+ import messagesEs from "./es.js"
13
+ import messagesPt from "./pt.js"
14
+ import messagesVi from "./vi.js"
15
+
16
+ const localeMap = {
17
+ en: messagesEn,
18
+ "en-US": messagesEn,
19
+ zh: messagesZh,
20
+ "zh-CN": messagesZh,
21
+ "zh-HK": messagesZhHk,
22
+ "zh-TW": messagesZhTw,
23
+ ru: messagesRu,
24
+ "ru-RU": messagesRu,
25
+ ko: messagesKo,
26
+ "ko-KR": messagesKo,
27
+ ja: messagesJa,
28
+ "ja-JP": messagesJa,
29
+ fr: messagesFr,
30
+ "fr-FR": messagesFr,
31
+ de: messagesDe,
32
+ "de-DE": messagesDe,
33
+ it: messagesIt,
34
+ "it-IT": messagesIt,
35
+ es: messagesEs,
36
+ "es-ES": messagesEs,
37
+ pt: messagesPt,
38
+ "pt-PT": messagesPt,
39
+ "pt-BR": messagesPt,
40
+ vi: messagesVi,
41
+ "vi-VN": messagesVi,
42
+ }
43
+
44
+ const locales = Object.keys(localeMap)
45
+
46
+ initAvailableLocales(locales)
47
+
48
+ export const prefferedLocale = extractLocaleFromNavigator() || "en"
49
+ console.log("[settings] prefferedLocale:", prefferedLocale)
50
+ // eslint-disable-next-line import/no-mutable-exports
51
+ export let i = initI18n(localeMap, prefferedLocale)
52
+
53
+ export function resetI18n(locale?: string) {
54
+ console.log("[settings] prefferedLocale:", prefferedLocale, "locale:", locale)
55
+ i = initI18n(localeMap, locale || prefferedLocale)
56
+ }
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Impostazioni",
3
+ "settings.otherExtensions": "Altre estensioni",
4
+ "settings.locale": "Lingua",
5
+ "settings.displaySettingsButtonInSideMenu": "Mostra il pulsante delle impostazioni nel menu laterale",
6
+ "settings.menu.settings": "⚙️ Impostazioni",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Aggiungi tag utente ai collegamenti",
8
+ "settings.extensions.links-helper.title": "🔗 Assistente collegamenti",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - Stile minimalista V2EX",
11
+ "settings.extensions.replace-ugly-avatars.title": "Sostituisci avatar brutti",
12
+ "settings.extensions.more-by-pipecraft.title": "Trova più script utente utili",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "設定",
3
+ "settings.otherExtensions": "その他の拡張機能",
4
+ "settings.locale": "言語",
5
+ "settings.displaySettingsButtonInSideMenu": "サイドメニューに設定ボタンを表示",
6
+ "settings.menu.settings": "⚙️ 設定",
7
+ "settings.extensions.utags.title": "🏷️ UTags - リンクにユーザータグを追加",
8
+ "settings.extensions.links-helper.title": "🔗 リンクヘルパー",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX ミニマルスタイル",
11
+ "settings.extensions.replace-ugly-avatars.title": "醜いアバターを置き換える",
12
+ "settings.extensions.more-by-pipecraft.title": "より便利なユーザースクリプトを見つける",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "설정",
3
+ "settings.otherExtensions": "다른 확장 프로그램",
4
+ "settings.locale": "언어",
5
+ "settings.displaySettingsButtonInSideMenu": "사이드 메뉴에 설정 버튼 표시",
6
+ "settings.menu.settings": "⚙️ 설정",
7
+ "settings.extensions.utags.title": "🏷️ UTags - 링크에 사용자 태그 추가",
8
+ "settings.extensions.links-helper.title": "🔗 링크 도우미",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX 미니멀 스타일",
11
+ "settings.extensions.replace-ugly-avatars.title": "못생긴 아바타 교체",
12
+ "settings.extensions.more-by-pipecraft.title": "더 유용한 사용자 스크립트 찾기",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Configurações",
3
+ "settings.otherExtensions": "Outras extensões",
4
+ "settings.locale": "Idioma",
5
+ "settings.displaySettingsButtonInSideMenu": "Exibir botão de configurações no menu lateral",
6
+ "settings.menu.settings": "⚙️ Configurações",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Adicionar tags de usuário aos links",
8
+ "settings.extensions.links-helper.title": "🔗 Assistente de links",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - Estilo minimalista V2EX",
11
+ "settings.extensions.replace-ugly-avatars.title": "Substituir avatares feios",
12
+ "settings.extensions.more-by-pipecraft.title": "Encontrar mais scripts de usuário úteis",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Настройки",
3
+ "settings.otherExtensions": "Другие расширения",
4
+ "settings.locale": "Язык",
5
+ "settings.displaySettingsButtonInSideMenu": "Показать кнопку настроек в боковом меню",
6
+ "settings.menu.settings": "⚙️ Настройки",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Добавить пользовательские теги к ссылкам",
8
+ "settings.extensions.links-helper.title": "🔗 Помощник ссылок",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX Минималистичный стиль",
11
+ "settings.extensions.replace-ugly-avatars.title": "Заменить некрасивые аватары",
12
+ "settings.extensions.more-by-pipecraft.title": "Найти больше полезных пользовательских скриптов",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "Cài đặt",
3
+ "settings.otherExtensions": "Tiện ích mở rộng khác",
4
+ "settings.locale": "Ngôn ngữ",
5
+ "settings.displaySettingsButtonInSideMenu": "Hiển thị nút cài đặt trong menu bên",
6
+ "settings.menu.settings": "⚙️ Cài đặt",
7
+ "settings.extensions.utags.title": "🏷️ UTags - Thêm thẻ người dùng vào liên kết",
8
+ "settings.extensions.links-helper.title": "🔗 Trợ lý liên kết",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - Phong cách tối giản V2EX",
11
+ "settings.extensions.replace-ugly-avatars.title": "Thay thế avatar xấu",
12
+ "settings.extensions.more-by-pipecraft.title": "Tìm thêm script người dùng hữu ích",
13
+ }
14
+
15
+ export default messages
@@ -1,6 +1,7 @@
1
1
  export const messages = {
2
2
  "settings.title": "设置",
3
3
  "settings.otherExtensions": "其他扩展",
4
+ "settings.locale": "语言",
4
5
  "settings.displaySettingsButtonInSideMenu": "在侧边栏菜单中显示设置按钮",
5
6
  "settings.menu.settings": "⚙️ 设置",
6
7
  "settings.extensions.utags.title": "🏷️ 小鱼标签 (UTags) - 为链接添加用户标签",
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "設定",
3
+ "settings.otherExtensions": "其他擴充功能",
4
+ "settings.locale": "語言",
5
+ "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
6
+ "settings.menu.settings": "⚙️ 設定",
7
+ "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結添加用戶標籤",
8
+ "settings.extensions.links-helper.title": "🔗 連結助手",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX 極簡風格",
11
+ "settings.extensions.replace-ugly-avatars.title": "賜你個頭像吧",
12
+ "settings.extensions.more-by-pipecraft.title": "更多有趣的腳本",
13
+ }
14
+
15
+ export default messages
@@ -0,0 +1,15 @@
1
+ export const messages = {
2
+ "settings.title": "設定",
3
+ "settings.otherExtensions": "其他擴充功能",
4
+ "settings.locale": "語言",
5
+ "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
6
+ "settings.menu.settings": "⚙️ 設定",
7
+ "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結新增使用者標籤",
8
+ "settings.extensions.links-helper.title": "🔗 連結助手",
9
+ "settings.extensions.v2ex.rep.title": "V2EX.REP - 专注提升 V2EX 主题回复浏览体验",
10
+ "settings.extensions.v2ex.min.title": "v2ex.min - V2EX 極簡風格",
11
+ "settings.extensions.replace-ugly-avatars.title": "替換醜陋的頭像",
12
+ "settings.extensions.more-by-pipecraft.title": "更多有趣的腳本",
13
+ }
14
+
15
+ export default messages
package/lib/settings.ts CHANGED
@@ -18,16 +18,16 @@ import {
18
18
  runWhenHeadExists,
19
19
  } from "browser-extension-utils"
20
20
  import styleText from "data-text:./style.scss"
21
- import { createSwitchOption } from "./switch"
21
+ import { createSwitchOption } from "./switch.js"
22
22
  import {
23
23
  createExtensionList,
24
24
  addCurrentExtension,
25
25
  activeExtension,
26
26
  activeExtensionList,
27
27
  deactiveExtensionList,
28
- } from "./extension-list"
29
- import { besVersion, settingButton } from "./common"
30
- import { i } from "./messages"
28
+ } from "./extension-list.js"
29
+ import { besVersion, settingButton } from "./common.js"
30
+ import { i, prefferedLocale, resetI18n } from "./messages/index.js"
31
31
 
32
32
  const prefix = "browser_extension_settings_"
33
33
 
@@ -82,9 +82,9 @@ type SettingsSelectItem = {
82
82
  title: string
83
83
  icon?: string
84
84
  type: "select"
85
- options: { string: { string: any } }
85
+ options: Record<string, string | number>
86
86
  group?: number
87
- defaultValue?: any
87
+ defaultValue?: string | number
88
88
  }
89
89
 
90
90
  type SettingsTipItem = {
@@ -181,6 +181,23 @@ export function hideSettings() {
181
181
  closeModal()
182
182
  }
183
183
 
184
+ function destroySettings() {
185
+ closeModal()
186
+ const settingsContainer = getSettingsContainer()
187
+ if (settingsContainer) {
188
+ settingsContainer.remove()
189
+ }
190
+ }
191
+
192
+ function isSettingsShown() {
193
+ const settingsContainer = getSettingsContainer()
194
+ if (settingsContainer) {
195
+ return settingsContainer.style.display === "block"
196
+ }
197
+
198
+ return false
199
+ }
200
+
184
201
  const onDocumentClick = (event: Event) => {
185
202
  const target = event.target as HTMLElement
186
203
  if (target?.closest(`.${prefix}container`)) {
@@ -321,7 +338,7 @@ function createSettingsElement() {
321
338
  })
322
339
 
323
340
  addElement(settingsMain, "a", {
324
- textContent: "Settings",
341
+ textContent: i("settings.title"),
325
342
  class: "navigation_go_previous",
326
343
  onclick() {
327
344
  activeExtensionList()
@@ -483,7 +500,11 @@ function createSettingsElement() {
483
500
  })
484
501
  break
485
502
  }
503
+
486
504
  // No default
505
+ default: {
506
+ break
507
+ }
487
508
  }
488
509
  }
489
510
  }
@@ -551,13 +572,30 @@ function addCommonSettings(settingsTable: SettingsTable) {
551
572
  }
552
573
  }
553
574
 
575
+ // Switch locale
576
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
577
+ settingsTable.locale = {
578
+ title: i("settings.locale"),
579
+ type: "select",
580
+ defaultValue: prefferedLocale,
581
+ options: {
582
+ // eslint-disable-next-line @typescript-eslint/naming-convention
583
+ English: "en",
584
+ 中文: "zh",
585
+ // eslint-disable-next-line @typescript-eslint/naming-convention
586
+ Русский: "ru",
587
+ },
588
+ group: ++maxGroup,
589
+ } as SettingsSelectItem
590
+
591
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
554
592
  settingsTable.displaySettingsButtonInSideMenu = {
555
593
  title: i("settings.displaySettingsButtonInSideMenu"),
556
594
  defaultValue: !(
557
595
  typeof GM === "object" && typeof GM.registerMenuCommand === "function"
558
596
  ),
559
- group: maxGroup + 1,
560
- }
597
+ group: ++maxGroup,
598
+ } as SettingsSwitchItem
561
599
  }
562
600
 
563
601
  function handleShowSettingsUrl() {
@@ -588,12 +626,31 @@ export const initSettings = async (options: SettingsOptions) => {
588
626
  // console.log(JSON.stringify(settings, null, 2))
589
627
  await updateOptions()
590
628
  addSideMenu()
629
+
630
+ const newLocale =
631
+ (getSettingsValue("locale") as string | undefined) || prefferedLocale
632
+ console.log("lastLocale:", lastLocale, "newLocale:", newLocale)
633
+ if (lastLocale !== newLocale) {
634
+ const isShown = isSettingsShown()
635
+ destroySettings()
636
+ resetI18n(newLocale)
637
+ lastLocale = newLocale
638
+ if (isShown) {
639
+ setTimeout(showSettings, 100)
640
+ }
641
+ }
642
+
591
643
  if (typeof options.onValueChange === "function") {
592
644
  options.onValueChange()
593
645
  }
594
646
  })
595
647
 
596
648
  settings = await getSettings()
649
+
650
+ let lastLocale =
651
+ (getSettingsValue("locale") as string | undefined) || prefferedLocale
652
+ resetI18n(lastLocale)
653
+
597
654
  runWhenHeadExists(() => {
598
655
  addStyle(getSettingsStyle())
599
656
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-extension-settings",
3
- "version": "0.5.6",
3
+ "version": "0.6.1",
4
4
  "description": "Settings module for developing browser extensions and userscripts",
5
5
  "type": "module",
6
6
  "main": "./lib/index.ts",
@@ -30,16 +30,19 @@
30
30
  },
31
31
  "homepage": "https://github.com/utags/browser-extension-settings#readme",
32
32
  "dependencies": {
33
- "browser-extension-i18n": "^0.0.6",
33
+ "browser-extension-i18n": "^0.1.2",
34
34
  "browser-extension-storage": "^0.1.2",
35
- "browser-extension-utils": "^0.1.18"
35
+ "browser-extension-utils": "^0.2.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/chrome": "^0.0.243",
38
+ "@types/chrome": "^0.1.4",
39
+ "@vitest/coverage-v8": "^3.2.4",
40
+ "jsdom": "^26.1.0",
39
41
  "npm-run-all": "^4.1.5",
40
- "prettier": "^3.0.2",
41
- "typescript": "^5.1.6",
42
- "xo": "^0.56.0"
42
+ "prettier": "^3.6.2",
43
+ "typescript": "^5.9.2",
44
+ "vitest": "^3.2.4",
45
+ "xo": "^0.60.0"
43
46
  },
44
47
  "files": [
45
48
  "lib/",
@@ -47,12 +50,13 @@
47
50
  "README.md"
48
51
  ],
49
52
  "engines": {
50
- "node": "^14.13.1 || >=16.0.0"
53
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
51
54
  },
52
55
  "xo": {
53
56
  "space": 2,
54
57
  "prettier": true,
55
58
  "globals": [
59
+ "GM",
56
60
  "document"
57
61
  ],
58
62
  "rules": {