browser-extension-settings 0.6.1 → 0.6.2

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/lib/common.ts CHANGED
@@ -1,4 +1,4 @@
1
- export const besVersion = 55
1
+ export const besVersion = 62
2
2
  export const openButton = `<svg viewBox="0 0 60.2601318359375 84.8134765625" version="1.1" xmlns="http://www.w3.org/2000/svg" class=" glyph-box" style="height: 9.62969px; width: 6.84191px;"><g transform="matrix(1 0 0 1 -6.194965820312518 77.63671875)"><path d="M66.4551-35.2539C66.4551-36.4746 65.9668-37.5977 65.0391-38.4766L26.3672-76.3672C25.4883-77.1973 24.4141-77.6367 23.1445-77.6367C20.6543-77.6367 18.7012-75.7324 18.7012-73.1934C18.7012-71.9727 19.1895-70.8496 19.9707-70.0195L55.5176-35.2539L19.9707-0.488281C19.1895 0.341797 18.7012 1.41602 18.7012 2.68555C18.7012 5.22461 20.6543 7.12891 23.1445 7.12891C24.4141 7.12891 25.4883 6.68945 26.3672 5.81055L65.0391-32.0312C65.9668-32.959 66.4551-34.0332 66.4551-35.2539Z"></path></g></svg>`
3
3
  export const openInNewTabButton = `<svg viewBox="0 0 72.127685546875 72.2177734375" version="1.1" xmlns="http://www.w3.org/2000/svg" class=" glyph-box" style="height: 8.19958px; width: 8.18935px;"><g transform="matrix(1 0 0 1 -12.451127929687573 71.3388671875)"><path d="M84.5703-17.334L84.5215-66.4551C84.5215-69.2383 82.7148-71.1914 79.7852-71.1914L30.6641-71.1914C27.9297-71.1914 26.0742-69.0918 26.0742-66.748C26.0742-64.4043 28.1738-62.4023 30.4688-62.4023L47.4609-62.4023L71.2891-63.1836L62.207-55.2246L13.8184-6.73828C12.9395-5.85938 12.4512-4.73633 12.4512-3.66211C12.4512-1.31836 14.5508 0.878906 16.9922 0.878906C18.1152 0.878906 19.1895 0.488281 20.0684-0.439453L68.5547-48.877L76.6113-58.0078L75.7324-35.2051L75.7324-17.1387C75.7324-14.8438 77.7344-12.6953 80.127-12.6953C82.4707-12.6953 84.5703-14.6973 84.5703-17.334Z"></path></g></svg>`
4
4
  export const settingButton = `<svg viewBox="0 0 16 16" version="1.1">
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Einstellungen",
3
3
  "settings.otherExtensions": "Andere Erweiterungen",
4
4
  "settings.locale": "Sprache",
5
+ "settings.systemLanguage": "Systemsprache",
5
6
  "settings.displaySettingsButtonInSideMenu": "Einstellungsschaltfläche im Seitenmenü anzeigen",
6
7
  "settings.menu.settings": "⚙️ Einstellungen",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Benutzer-Tags zu Links hinzufügen",
@@ -2,6 +2,7 @@ const messages = {
2
2
  "settings.title": "Settings",
3
3
  "settings.otherExtensions": "Other Extensions",
4
4
  "settings.locale": "Language",
5
+ "settings.systemLanguage": "System Language",
5
6
  "settings.displaySettingsButtonInSideMenu": "Display Settings Button in Side Menu",
6
7
  "settings.menu.settings": "⚙️ Settings",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Add usertags to links",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Configuración",
3
3
  "settings.otherExtensions": "Otras extensiones",
4
4
  "settings.locale": "Idioma",
5
+ "settings.systemLanguage": "Idioma del sistema",
5
6
  "settings.displaySettingsButtonInSideMenu": "Mostrar botón de configuración en el menú lateral",
6
7
  "settings.menu.settings": "⚙️ Configuración",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Agregar etiquetas de usuario a los enlaces",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "Paramètres",
3
3
  "settings.otherExtensions": "Autres extensions",
4
4
  "settings.locale": "Langue",
5
- "settings.displaySettingsButtonInSideMenu": "Afficher le bouton des paramètres dans le menu latéral",
5
+ "settings.systemLanguage": "Langue du système",
6
+ "settings.displaySettingsButtonInSideMenu": "Afficher le bouton de paramètres dans le menu latéral",
6
7
  "settings.menu.settings": "⚙️ Paramètres",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Ajouter des balises utilisateur aux liens",
8
9
  "settings.extensions.links-helper.title": "🔗 Assistant de liens",
@@ -1,4 +1,4 @@
1
- import { initAvailableLocales, initI18n, extractLocaleFromNavigator } from "browser-extension-i18n"
1
+ import { initAvailableLocales, initI18n, getPrefferedLocale } from "browser-extension-i18n"
2
2
  import messagesEn from "./en.js"
3
3
  import messagesZh from "./zh-cn.js"
4
4
  import messagesZhHk from "./zh-hk.js"
@@ -15,42 +15,70 @@ import messagesVi from "./vi.js"
15
15
 
16
16
  const localeMap = {
17
17
  en: messagesEn,
18
- "en-US": messagesEn,
18
+ "en-us": messagesEn,
19
19
  zh: messagesZh,
20
- "zh-CN": messagesZh,
21
- "zh-HK": messagesZhHk,
22
- "zh-TW": messagesZhTw,
20
+ "zh-cn": messagesZh,
21
+ "zh-hk": messagesZhHk,
22
+ "zh-tw": messagesZhTw,
23
23
  ru: messagesRu,
24
- "ru-RU": messagesRu,
24
+ "ru-ru": messagesRu,
25
25
  ko: messagesKo,
26
- "ko-KR": messagesKo,
26
+ "ko-kr": messagesKo,
27
27
  ja: messagesJa,
28
- "ja-JP": messagesJa,
28
+ "ja-jp": messagesJa,
29
29
  fr: messagesFr,
30
- "fr-FR": messagesFr,
30
+ "fr-fr": messagesFr,
31
31
  de: messagesDe,
32
- "de-DE": messagesDe,
32
+ "de-de": messagesDe,
33
33
  it: messagesIt,
34
- "it-IT": messagesIt,
34
+ "it-it": messagesIt,
35
35
  es: messagesEs,
36
- "es-ES": messagesEs,
36
+ "es-es": messagesEs,
37
37
  pt: messagesPt,
38
- "pt-PT": messagesPt,
39
- "pt-BR": messagesPt,
38
+ "pt-pt": messagesPt,
39
+ "pt-br": messagesPt,
40
40
  vi: messagesVi,
41
- "vi-VN": messagesVi,
41
+ "vi-vn": messagesVi,
42
+ }
43
+
44
+ // Language display names for each locale code
45
+ export const localeNames = {
46
+ en: "English",
47
+ "en-us": "English (US)",
48
+ zh: "中文",
49
+ "zh-cn": "中文 (简体)",
50
+ "zh-hk": "中文 (香港)",
51
+ "zh-tw": "中文 (台灣)",
52
+ ru: "Русский",
53
+ "ru-ru": "Русский",
54
+ ko: "한국어",
55
+ "ko-kr": "한국어",
56
+ ja: "日本語",
57
+ "ja-jp": "日本語",
58
+ fr: "Français",
59
+ "fr-fr": "Français",
60
+ de: "Deutsch",
61
+ "de-de": "Deutsch",
62
+ it: "Italiano",
63
+ "it-it": "Italiano",
64
+ es: "Español",
65
+ "es-es": "Español",
66
+ pt: "Português",
67
+ "pt-pt": "Português",
68
+ "pt-br": "Português (Brasil)",
69
+ vi: "Tiếng Việt",
70
+ "vi-vn": "Tiếng Việt",
42
71
  }
43
72
 
44
73
  const locales = Object.keys(localeMap)
45
74
 
46
75
  initAvailableLocales(locales)
47
76
 
48
- export const prefferedLocale = extractLocaleFromNavigator() || "en"
49
- console.log("[settings] prefferedLocale:", prefferedLocale)
77
+ console.log("[settings] prefferedLocale:", getPrefferedLocale())
50
78
  // eslint-disable-next-line import/no-mutable-exports
51
- export let i = initI18n(localeMap, prefferedLocale)
79
+ export let i = initI18n(localeMap, getPrefferedLocale())
52
80
 
53
81
  export function resetI18n(locale?: string) {
54
- console.log("[settings] prefferedLocale:", prefferedLocale, "locale:", locale)
55
- i = initI18n(localeMap, locale || prefferedLocale)
82
+ console.log("[settings] prefferedLocale:", getPrefferedLocale(), "locale:", locale)
83
+ i = initI18n(localeMap, locale || getPrefferedLocale())
56
84
  }
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "Impostazioni",
3
3
  "settings.otherExtensions": "Altre estensioni",
4
4
  "settings.locale": "Lingua",
5
- "settings.displaySettingsButtonInSideMenu": "Mostra il pulsante delle impostazioni nel menu laterale",
5
+ "settings.systemLanguage": "Lingua del sistema",
6
+ "settings.displaySettingsButtonInSideMenu": "Mostra pulsante impostazioni nel menu laterale",
6
7
  "settings.menu.settings": "⚙️ Impostazioni",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Aggiungi tag utente ai collegamenti",
8
9
  "settings.extensions.links-helper.title": "🔗 Assistente collegamenti",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "その他の拡張機能",
4
4
  "settings.locale": "言語",
5
+ "settings.systemLanguage": "システム言語",
5
6
  "settings.displaySettingsButtonInSideMenu": "サイドメニューに設定ボタンを表示",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - リンクにユーザータグを追加",
@@ -1,7 +1,8 @@
1
1
  export const messages = {
2
2
  "settings.title": "설정",
3
- "settings.otherExtensions": "다른 확장 프로그램",
3
+ "settings.otherExtensions": "기타 확장 프로그램",
4
4
  "settings.locale": "언어",
5
+ "settings.systemLanguage": "시스템 언어",
5
6
  "settings.displaySettingsButtonInSideMenu": "사이드 메뉴에 설정 버튼 표시",
6
7
  "settings.menu.settings": "⚙️ 설정",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - 링크에 사용자 태그 추가",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Configurações",
3
3
  "settings.otherExtensions": "Outras extensões",
4
4
  "settings.locale": "Idioma",
5
+ "settings.systemLanguage": "Idioma do sistema",
5
6
  "settings.displaySettingsButtonInSideMenu": "Exibir botão de configurações no menu lateral",
6
7
  "settings.menu.settings": "⚙️ Configurações",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Adicionar tags de usuário aos links",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Настройки",
3
3
  "settings.otherExtensions": "Другие расширения",
4
4
  "settings.locale": "Язык",
5
+ "settings.systemLanguage": "Системный язык",
5
6
  "settings.displaySettingsButtonInSideMenu": "Показать кнопку настроек в боковом меню",
6
7
  "settings.menu.settings": "⚙️ Настройки",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Добавить пользовательские теги к ссылкам",
@@ -2,6 +2,7 @@ export const messages = {
2
2
  "settings.title": "Cài đặt",
3
3
  "settings.otherExtensions": "Tiện ích mở rộng khác",
4
4
  "settings.locale": "Ngôn ngữ",
5
+ "settings.systemLanguage": "Ngôn ngữ hệ thống",
5
6
  "settings.displaySettingsButtonInSideMenu": "Hiển thị nút cài đặt trong menu bên",
6
7
  "settings.menu.settings": "⚙️ Cài đặt",
7
8
  "settings.extensions.utags.title": "🏷️ UTags - Thêm thẻ người dùng vào liên kết",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "设置",
3
3
  "settings.otherExtensions": "其他扩展",
4
4
  "settings.locale": "语言",
5
- "settings.displaySettingsButtonInSideMenu": "在侧边栏菜单中显示设置按钮",
5
+ "settings.systemLanguage": "系统语言",
6
+ "settings.displaySettingsButtonInSideMenu": "在侧边菜单中显示设置按钮",
6
7
  "settings.menu.settings": "⚙️ 设置",
7
8
  "settings.extensions.utags.title": "🏷️ 小鱼标签 (UTags) - 为链接添加用户标签",
8
9
  "settings.extensions.links-helper.title": "🔗 链接助手",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "其他擴充功能",
4
4
  "settings.locale": "語言",
5
- "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
5
+ "settings.systemLanguage": "系統語言",
6
+ "settings.displaySettingsButtonInSideMenu": "在側邊選單中顯示設定按鈕",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結添加用戶標籤",
8
9
  "settings.extensions.links-helper.title": "🔗 連結助手",
@@ -2,7 +2,8 @@ export const messages = {
2
2
  "settings.title": "設定",
3
3
  "settings.otherExtensions": "其他擴充功能",
4
4
  "settings.locale": "語言",
5
- "settings.displaySettingsButtonInSideMenu": "在側邊欄選單中顯示設定按鈕",
5
+ "settings.systemLanguage": "系統語言",
6
+ "settings.displaySettingsButtonInSideMenu": "在側邊選單中顯示設定按鈕",
6
7
  "settings.menu.settings": "⚙️ 設定",
7
8
  "settings.extensions.utags.title": "🏷️ 小魚標籤 (UTags) - 為連結新增使用者標籤",
8
9
  "settings.extensions.links-helper.title": "🔗 連結助手",
package/lib/settings.ts CHANGED
@@ -17,7 +17,12 @@ import {
17
17
  runWhenDomReady,
18
18
  runWhenHeadExists,
19
19
  } from "browser-extension-utils"
20
+ // @ts-expect-error - data-text import for build system
20
21
  import styleText from "data-text:./style.scss"
22
+ import {
23
+ initAvailableLocales,
24
+ getPrefferedLocale,
25
+ } from "browser-extension-i18n"
21
26
  import { createSwitchOption } from "./switch.js"
22
27
  import {
23
28
  createExtensionList,
@@ -27,7 +32,15 @@ import {
27
32
  deactiveExtensionList,
28
33
  } from "./extension-list.js"
29
34
  import { besVersion, settingButton } from "./common.js"
30
- import { i, prefferedLocale, resetI18n } from "./messages/index.js"
35
+ import { i, resetI18n, localeNames } from "./messages/index.js"
36
+
37
+ // Declare GM global variable for userscript environment
38
+ // eslint-disable-next-line @typescript-eslint/naming-convention
39
+ declare const GM:
40
+ | {
41
+ registerMenuCommand?: (name: string, function_: () => void) => void
42
+ }
43
+ | undefined
31
44
 
32
45
  const prefix = "browser_extension_settings_"
33
46
 
@@ -36,12 +49,13 @@ type SettingsOptions = {
36
49
  title: string
37
50
  footer?: string
38
51
  settingsTable?: SettingsTable
52
+ availableLocales?: readonly string[]
39
53
  onValueChange?: () => void
40
54
  onViewUpdate?: (settingsMainView: HTMLElement) => void
41
55
  relatedExtensions?: RelatedExtension[]
42
56
  }
43
57
 
44
- type SettingsTable = Record<
58
+ export type SettingsTable = Record<
45
59
  string,
46
60
  | SettingsSwitchItem
47
61
  | SettingsInputItem
@@ -337,13 +351,13 @@ function createSettingsElement() {
337
351
  class: `${prefix}main thin_scrollbar`,
338
352
  })
339
353
 
340
- addElement(settingsMain, "a", {
341
- textContent: i("settings.title"),
342
- class: "navigation_go_previous",
343
- onclick() {
344
- activeExtensionList()
345
- },
346
- })
354
+ // addElement(settingsMain, "a", {
355
+ // textContent: i("settings.title"),
356
+ // class: "navigation_go_previous",
357
+ // onclick() {
358
+ // activeExtensionList()
359
+ // },
360
+ // })
347
361
 
348
362
  if (settingsOptions.title) {
349
363
  addElement(settingsMain, "h2", { textContent: settingsOptions.title })
@@ -577,30 +591,26 @@ function addCommonSettings(settingsTable: SettingsTable) {
577
591
  settingsTable.locale = {
578
592
  title: i("settings.locale"),
579
593
  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
- },
594
+ defaultValue: "",
595
+ options: {},
588
596
  group: ++maxGroup,
589
597
  } as SettingsSelectItem
590
598
 
591
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
592
- settingsTable.displaySettingsButtonInSideMenu = {
593
- title: i("settings.displaySettingsButtonInSideMenu"),
594
- defaultValue: !(
595
- typeof GM === "object" && typeof GM.registerMenuCommand === "function"
596
- ),
597
- group: ++maxGroup,
598
- } as SettingsSwitchItem
599
+ // // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
600
+ // settingsTable.displaySettingsButtonInSideMenu = {
601
+ // title: i("settings.displaySettingsButtonInSideMenu"),
602
+ // defaultValue: !(
603
+ // typeof GM === "object" && typeof GM?.registerMenuCommand === "function"
604
+ // ),
605
+ // group: ++maxGroup,
606
+ // } as SettingsSwitchItem
599
607
  }
600
608
 
601
609
  function handleShowSettingsUrl() {
602
- if (location.hash === "#bes-show-settings") {
610
+ const hashString = `#!show-settings-${settingsOptions.id}`
611
+ if (location.hash === hashString) {
603
612
  setTimeout(showSettings, 100)
613
+ history.replaceState({}, "", location.href.replace(hashString, ""))
604
614
  }
605
615
  }
606
616
 
@@ -613,51 +623,86 @@ export async function showSettings() {
613
623
 
614
624
  addEventListener(document, "click", onDocumentClick, true)
615
625
  addEventListener(document, "keydown", onDocumentKeyDown, true)
616
- activeExtension(settingsOptions.id)
617
- deactiveExtensionList()
626
+ // activeExtension(settingsOptions.id)
627
+ // deactiveExtensionList()
618
628
  }
619
629
 
620
- export const initSettings = async (options: SettingsOptions) => {
630
+ let lastLocale: string | undefined
631
+
632
+ // Reset settings UI on init and locale change
633
+ // eslint-disable-next-line @typescript-eslint/naming-convention
634
+ const resetSettingsUI = (optionsProvider: () => SettingsOptions) => {
635
+ lastLocale =
636
+ (getSettingsValue("locale") as string | undefined) || getPrefferedLocale()
637
+ resetI18n(lastLocale)
638
+
639
+ const options = optionsProvider()
621
640
  settingsOptions = options
622
641
  settingsTable = options.settingsTable || {}
623
642
  addCommonSettings(settingsTable)
643
+ const availableLocales = options.availableLocales
644
+ if (availableLocales?.length) {
645
+ initAvailableLocales(availableLocales)
646
+ const localeSelect = settingsTable.locale as SettingsSelectItem
647
+ localeSelect.options = {
648
+ [i("settings.systemLanguage")]: "",
649
+ }
650
+ for (const locale of availableLocales) {
651
+ // Use language display name from localeNames, fallback to locale code if not found
652
+ const lowerCaseLocale = locale.toLowerCase()
653
+ const displayName =
654
+ localeNames[lowerCaseLocale as keyof typeof localeNames] || locale
655
+ localeSelect.options[displayName] = locale
656
+ }
657
+ }
658
+
659
+ // runWhenDomReady(() => {
660
+ // initExtensionList()
661
+ // addSideMenu()
662
+ // })
663
+ }
664
+
665
+ export const initSettings = async (optionsProvider: () => SettingsOptions) => {
624
666
  addValueChangeListener(storageKey, async () => {
625
667
  settings = await getSettings()
626
668
  // console.log(JSON.stringify(settings, null, 2))
627
669
  await updateOptions()
628
- addSideMenu()
670
+ // addSideMenu()
629
671
 
630
672
  const newLocale =
631
- (getSettingsValue("locale") as string | undefined) || prefferedLocale
673
+ (getSettingsValue("locale") as string | undefined) || getPrefferedLocale()
632
674
  console.log("lastLocale:", lastLocale, "newLocale:", newLocale)
633
675
  if (lastLocale !== newLocale) {
634
676
  const isShown = isSettingsShown()
635
677
  destroySettings()
636
678
  resetI18n(newLocale)
637
679
  lastLocale = newLocale
680
+
681
+ setTimeout(() => {
682
+ resetSettingsUI(optionsProvider)
683
+ }, 50)
684
+
638
685
  if (isShown) {
639
686
  setTimeout(showSettings, 100)
640
687
  }
641
688
  }
642
689
 
643
- if (typeof options.onValueChange === "function") {
644
- options.onValueChange()
690
+ if (typeof settingsOptions.onValueChange === "function") {
691
+ settingsOptions.onValueChange()
645
692
  }
646
693
  })
647
694
 
648
695
  settings = await getSettings()
649
696
 
650
- let lastLocale =
651
- (getSettingsValue("locale") as string | undefined) || prefferedLocale
652
- resetI18n(lastLocale)
697
+ resetSettingsUI(optionsProvider)
698
+ // Wait until extension intialized
699
+ setTimeout(() => {
700
+ resetSettingsUI(optionsProvider)
701
+ }, 50)
653
702
 
654
703
  runWhenHeadExists(() => {
655
704
  addStyle(getSettingsStyle())
656
705
  })
657
- runWhenDomReady(() => {
658
- initExtensionList()
659
- addSideMenu()
660
- })
661
706
 
662
707
  registerMenuCommand(i("settings.menu.settings"), showSettings, "o")
663
708
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-extension-settings",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "Settings module for developing browser extensions and userscripts",
5
5
  "type": "module",
6
6
  "main": "./lib/index.ts",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "homepage": "https://github.com/utags/browser-extension-settings#readme",
32
32
  "dependencies": {
33
- "browser-extension-i18n": "^0.1.2",
33
+ "browser-extension-i18n": "^0.1.3",
34
34
  "browser-extension-storage": "^0.1.2",
35
35
  "browser-extension-utils": "^0.2.0"
36
36
  },