@kuankuan/assist-2026 0.1.3 → 0.1.4

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/dist/i18n.d.ts CHANGED
@@ -1,15 +1,18 @@
1
- import { Ref } from 'vue';
2
- export declare const languageName: {
3
- _auto: import("vue").ComputedRef<string>;
4
- 'zh-cn': string;
5
- 'en-us': string;
6
- };
7
- export declare const languageList: {
8
- id: string;
9
- name: string | import("vue").ComputedRef<string>;
10
- }[];
11
- export declare const localSettingLanguage: Ref<string, string>;
12
- export declare const language: import("vue").WritableComputedRef<string, string>;
13
- export declare const i18n: import("vue-i18n").I18n<any, {}, {}, string, false>;
14
- export declare function t(key: string): string;
15
- export declare function tRef(key: string): import("vue").ComputedRef<string>;
1
+ import { I18n } from 'vue-i18n';
2
+ import { type Ref } from 'vue';
3
+ export default class I18nInstance {
4
+ readonly messages: unknown;
5
+ readonly langs: string[];
6
+ private readonly localSettingLanguage;
7
+ private readonly browserLanguage;
8
+ readonly languageList: {
9
+ name: Ref<string>;
10
+ id: string;
11
+ }[];
12
+ readonly language: Ref<string>;
13
+ readonly i18n: I18n<any, Record<string, unknown>, Record<string, unknown>, string, false>;
14
+ constructor(messages: unknown, langs: string[], storageKey?: string);
15
+ t(key: string): string;
16
+ tRef(key: string): import("vue").ComputedRef<string>;
17
+ languageName(lan: string): Ref<string, string> | import("vue").ComputedRef<string>;
18
+ }
package/dist/i18n.js CHANGED
@@ -1,19 +1,15 @@
1
1
  import { createI18n } from 'vue-i18n';
2
2
  import { computed, ref, watch } from 'vue';
3
- import messages, { langs } from 'virtual:k-i18n-config:main';
4
3
  import storageRef from './ref/storageRef';
5
- export const languageName = {
6
- _auto: computed(() => `Auto (${languageName[browserLanguage.value]})`),
7
- 'zh-cn': '简体中文',
8
- 'en-us': 'English',
9
- };
10
- export const languageList = ['_auto', ...langs].map((i) => ({
11
- id: i,
12
- name: languageName[i],
13
- }));
14
- const LOCALSTORAGE_KEY = '_vue_i18n_main_locale';
15
4
  function getBrowserLanguage() {
16
- const languages = (navigator?.languages || []).map((i) => i.toLowerCase());
5
+ return (navigator?.languages || [navigator.language]).map((i) => i.toLowerCase());
6
+ }
7
+ const browserLanguageSetting = ref(getBrowserLanguage());
8
+ window.addEventListener('languagechange', () => {
9
+ browserLanguageSetting.value = getBrowserLanguage();
10
+ });
11
+ function getBrowserLanguageInLangs(langs) {
12
+ const languages = browserLanguageSetting.value;
17
13
  const _langsOnly = langs.map((i) => i.split('-')[0]);
18
14
  for (const i of languages) {
19
15
  if (langs.includes(i)) {
@@ -25,39 +21,63 @@ function getBrowserLanguage() {
25
21
  }
26
22
  return langs[0] || 'en-us';
27
23
  }
28
- const browserLanguage = ref(getBrowserLanguage());
29
- export const localSettingLanguage = storageRef(LOCALSTORAGE_KEY, '_auto');
30
- if (localSettingLanguage.value !== '_auto' && !langs.includes(localSettingLanguage.value)) {
31
- localSettingLanguage.value = '_auto';
32
- }
33
- export const language = computed({
34
- get: () => {
35
- const currentBrowserLanguage = browserLanguage.value;
36
- if (localSettingLanguage.value === '_auto') {
37
- return currentBrowserLanguage;
38
- }
39
- return localSettingLanguage.value;
40
- },
41
- set: (newValue) => {
42
- localSettingLanguage.value = newValue;
43
- },
44
- });
45
- watch(language, (value) => {
46
- i18n.global.locale.value = value;
47
- });
48
- export const i18n = createI18n({
49
- legacy: false,
50
- locale: language.value,
51
- fallbackLocale: 'en-us',
24
+ export default class I18nInstance {
25
+ messages;
26
+ langs;
27
+ localSettingLanguage;
28
+ browserLanguage;
29
+ languageList;
30
+ language;
52
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- messages: messages,
54
- });
55
- window.addEventListener('languagechange', () => {
56
- browserLanguage.value = getBrowserLanguage();
57
- });
58
- export function t(key) {
59
- return i18n.global.t(key);
60
- }
61
- export function tRef(key) {
62
- return computed(() => i18n.global.t(key));
32
+ i18n;
33
+ constructor(messages, langs, storageKey = '_vue_i18n_main_locale') {
34
+ this.messages = messages;
35
+ this.langs = langs;
36
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
37
+ const now = this;
38
+ this.languageList = ['_auto', ...langs].map((i) => ({
39
+ id: i,
40
+ name: this.languageName(i),
41
+ }));
42
+ this.localSettingLanguage = storageRef(storageKey, '_auto');
43
+ this.browserLanguage = computed(() => getBrowserLanguageInLangs(browserLanguageSetting.value));
44
+ watch(() => now.localSettingLanguage.value, (newValue) => {
45
+ if (newValue !== '_auto' && !now.langs.includes(newValue)) {
46
+ now.localSettingLanguage.value = '_auto';
47
+ }
48
+ });
49
+ this.language = computed({
50
+ get() {
51
+ const currentBrowserLanguage = now.browserLanguage.value;
52
+ if (now.localSettingLanguage.value === '_auto') {
53
+ return currentBrowserLanguage;
54
+ }
55
+ return now.localSettingLanguage.value;
56
+ },
57
+ set(newValue) {
58
+ now.localSettingLanguage.value = newValue;
59
+ },
60
+ });
61
+ this.i18n = createI18n({
62
+ legacy: false,
63
+ locale: this.language.value,
64
+ fallbackLocale: 'en-us',
65
+ messages: this.messages,
66
+ });
67
+ watch(() => now.language.value, (newValue) => {
68
+ now.i18n.global.locale.value = newValue;
69
+ });
70
+ }
71
+ t(key) {
72
+ return this.i18n.global.t(key);
73
+ }
74
+ tRef(key) {
75
+ return computed(() => this.t(key));
76
+ }
77
+ languageName(lan) {
78
+ if (lan === '_auto') {
79
+ return computed(() => `Auto-${this.languageName(this.browserLanguage.value)}`);
80
+ }
81
+ return ref(new Intl.DisplayNames([lan], { type: 'language' }).of(lan) || lan);
82
+ }
63
83
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuankuan/assist-2026",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "A toolset from kuankuan",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/i18n.ts CHANGED
@@ -1,24 +1,18 @@
1
- import { createI18n } from 'vue-i18n';
2
- import { computed, ref, watch, Ref } from 'vue';
3
- import messages, { langs } from 'virtual:k-i18n-config:main';
1
+ import { createI18n, I18n } from 'vue-i18n';
2
+ import { computed, ref, watch, type Ref } from 'vue';
4
3
  import storageRef from './ref/storageRef';
5
4
 
6
- export const languageName = {
7
- _auto: computed(
8
- (): string => `Auto (${languageName[browserLanguage.value as keyof typeof languageName]})`
9
- ),
10
- 'zh-cn': '简体中文',
11
- 'en-us': 'English',
12
- };
5
+ function getBrowserLanguage() {
6
+ return (navigator?.languages || [navigator.language]).map((i) => i.toLowerCase());
7
+ }
13
8
 
14
- export const languageList = ['_auto', ...langs].map((i) => ({
15
- id: i,
16
- name: languageName[i as keyof typeof languageName],
17
- }));
9
+ const browserLanguageSetting = ref<string[]>(getBrowserLanguage());
10
+ window.addEventListener('languagechange', () => {
11
+ browserLanguageSetting.value = getBrowserLanguage();
12
+ });
18
13
 
19
- const LOCALSTORAGE_KEY = '_vue_i18n_main_locale';
20
- function getBrowserLanguage() {
21
- const languages = (navigator?.languages || []).map((i) => i.toLowerCase());
14
+ function getBrowserLanguageInLangs(langs: string[]) {
15
+ const languages = browserLanguageSetting.value;
22
16
  const _langsOnly = langs.map((i: string) => i.split('-')[0]);
23
17
  for (const i of languages) {
24
18
  if (langs.includes(i)) {
@@ -30,40 +24,72 @@ function getBrowserLanguage() {
30
24
  }
31
25
  return langs[0] || 'en-us';
32
26
  }
33
- const browserLanguage = ref(getBrowserLanguage());
34
- export const localSettingLanguage = storageRef(LOCALSTORAGE_KEY, '_auto');
35
- if (localSettingLanguage.value !== '_auto' && !langs.includes(localSettingLanguage.value)) {
36
- localSettingLanguage.value = '_auto';
37
- }
38
- export const language = computed({
39
- get: () => {
40
- const currentBrowserLanguage = browserLanguage.value;
41
- if (localSettingLanguage.value === '_auto') {
42
- return currentBrowserLanguage;
43
- }
44
- return localSettingLanguage.value;
45
- },
46
- set: (newValue) => {
47
- localSettingLanguage.value = newValue;
48
- },
49
- });
50
- watch(language, (value) => {
51
- (i18n.global.locale as unknown as Ref<string>).value = value;
52
- });
53
27
 
54
- export const i18n = createI18n({
55
- legacy: false,
56
- locale: language.value,
57
- fallbackLocale: 'en-us',
28
+ export default class I18nInstance {
29
+ private readonly localSettingLanguage: Ref<string>;
30
+ private readonly browserLanguage: Ref<string>;
31
+
32
+ public readonly languageList: { name: Ref<string>; id: string }[];
33
+ public readonly language: Ref<string>;
58
34
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
- messages: messages as any,
60
- });
61
- window.addEventListener('languagechange', () => {
62
- browserLanguage.value = getBrowserLanguage();
63
- });
64
- export function t(key: string) {
65
- return i18n.global.t(key);
66
- }
67
- export function tRef(key: string) {
68
- return computed(() => i18n.global.t(key));
35
+ public readonly i18n: I18n<any, Record<string, unknown>, Record<string, unknown>, string, false>;
36
+
37
+ constructor(
38
+ public readonly messages: unknown,
39
+ public readonly langs: string[],
40
+ storageKey: string = '_vue_i18n_main_locale'
41
+ ) {
42
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
43
+ const now = this;
44
+ this.languageList = ['_auto', ...langs].map((i) => ({
45
+ id: i,
46
+ name: this.languageName(i),
47
+ }));
48
+ this.localSettingLanguage = storageRef(storageKey, '_auto');
49
+ this.browserLanguage = computed(() => getBrowserLanguageInLangs(browserLanguageSetting.value));
50
+ watch(
51
+ () => now.localSettingLanguage.value,
52
+ (newValue) => {
53
+ if (newValue !== '_auto' && !now.langs.includes(newValue)) {
54
+ now.localSettingLanguage.value = '_auto';
55
+ }
56
+ }
57
+ );
58
+ this.language = computed({
59
+ get() {
60
+ const currentBrowserLanguage = now.browserLanguage.value;
61
+ if (now.localSettingLanguage.value === '_auto') {
62
+ return currentBrowserLanguage;
63
+ }
64
+ return now.localSettingLanguage.value;
65
+ },
66
+ set(newValue) {
67
+ now.localSettingLanguage.value = newValue;
68
+ },
69
+ });
70
+ this.i18n = createI18n({
71
+ legacy: false,
72
+ locale: this.language.value,
73
+ fallbackLocale: 'en-us',
74
+ messages: this.messages as never,
75
+ });
76
+ watch(
77
+ () => now.language.value,
78
+ (newValue) => {
79
+ now.i18n.global.locale.value = newValue;
80
+ }
81
+ );
82
+ }
83
+ t(key: string) {
84
+ return this.i18n.global.t(key);
85
+ }
86
+ tRef(key: string) {
87
+ return computed(() => this.t(key));
88
+ }
89
+ languageName(lan: string) {
90
+ if (lan === '_auto') {
91
+ return computed((): string => `Auto-${this.languageName(this.browserLanguage.value)}`);
92
+ }
93
+ return ref(new Intl.DisplayNames([lan], { type: 'language' }).of(lan) || lan);
94
+ }
69
95
  }