i18n.ts 6.0 KB
Newer Older
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/**
 * 国际化 utils
 * @author LiQingSong
 */
import { LocaleMessages } from '@intlify/core-base';
import { VueMessageType } from "vue-i18n";

// window.localStorage 存储key
export const localeKey = 'locale';

// 默认语言
export const defaultLang = 'zh-CN';

/**
 * 验证语言命名规则 zh-CN
 * @returns boolen
 * @author LiQingSong
 */
export const localeNameExp = (lang: string): boolean => {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
    const localeExp = /^([a-z]{2})-?([A-Z]{2})?$/
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
    return localeExp.test(lang);
}

/**
 * 设置 html lang 属性值
 * @param lang 语言的 key
 * @author LiQingSong
 */
export const setHtmlLang = (lang: string): void => {
    /**
     * axios.defaults.headers.common['Accept-Language'] = locale
     */
    document.querySelector('html')?.setAttribute('lang', lang);
}

/**
 * 获取当前选择的语言
 * 获取的浏览器语言默认项目中有可能不支持,所以在config/i18n.ts中要加以判断
 * @returns string
 * @author LiQingSong
 */
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43
export const getLocale = (): string => {
    const lang = typeof window.localStorage !== 'undefined' ? window.localStorage.getItem(localeKey) : '';
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
44 45 46 47 48 49 50 51 52 53 54
    const isNavigatorLanguageValid = typeof navigator !== 'undefined' && typeof navigator.language === 'string';
    const browserLang = isNavigatorLanguageValid ? navigator.language.split('-').join('-') : '';
    return lang || browserLang || defaultLang;
};

/**
 * 切换语言
 * @param lang 语言的 key
 * @param realReload 是否刷新页面,默认刷新
 * @author LiQingSong
 */
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56
export const setLocale = (lang: string, callback: () => void, realReload = true): void => {

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
57 58 59 60 61 62 63 64
  if (lang !== undefined && !localeNameExp(lang)) {
    // for reset when lang === undefined
    throw new Error('setLocale lang format error');
  }
  if (getLocale() !== lang) {
    if (typeof window.localStorage !== 'undefined') {
      window.localStorage.setItem(localeKey, lang || '');
    }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
65

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    if (realReload) {
        window.location.reload();
    } else {
        setHtmlLang(lang);

        if(typeof callback === 'function') {
            callback();
        }
    }

  }
};

/**
 * 自动导入 框架自定义语言
 * @author LiQingSong
 */
export function importAllLocales(): LocaleMessages<VueMessageType> {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
84
    const modules: any = {};
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
85 86
    try {
        // 导入 @/views 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87
        const viewsRequireContext: __WebpackModuleApi.RequireContext = require.context('../views', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
88 89 90
        viewsRequireContext.keys().forEach(fileName => {
            // 获取内容
            const modulesConent = viewsRequireContext(fileName);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
91
            if(modulesConent.default) {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
92 93
                // 获取 PascalCase 命名
                const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
95 96 97 98 99 100
                if(modules[modulesName]) {
                    modules[modulesName] = {
                        ...modules[modulesName],
                        ...modulesConent.default
                    }
                } else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
                    modules[modulesName] = modulesConent.default;
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
102 103 104 105 106
                }

            }

        });
aaronchen2k2k's avatar
aaronchen2k2k 已提交
107

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
108
        // 导入 @/layouts 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109
        const layoutsRequireContext: __WebpackModuleApi.RequireContext = require.context('../layouts', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
110 111 112
        layoutsRequireContext.keys().forEach(fileName => {
            // 获取内容
            const modulesConent = layoutsRequireContext(fileName);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
113
            if(modulesConent.default) {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
114 115
                // 获取 PascalCase 命名
                const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
117 118 119 120 121 122
                if(modules[modulesName]) {
                    modules[modulesName] = {
                        ...modules[modulesName],
                        ...modulesConent.default
                    }
                } else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
                    modules[modulesName] = modulesConent.default;
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
124 125 126 127 128 129 130
                }

            }

        });

        // 导入 @/components 下文件,包含子目录,文件名为:[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
        const componentsRequireContext: __WebpackModuleApi.RequireContext = require.context('../components', true, /[/\\]locales[/\\]([a-z]{2})-?([A-Z]{2})?\.ts$/);
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
132 133 134
        componentsRequireContext.keys().forEach(fileName => {
            // 获取内容
            const modulesConent = componentsRequireContext(fileName);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
135
            if(modulesConent.default) {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
136 137
                // 获取 PascalCase 命名
                const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
aaronchen2k2k's avatar
aaronchen2k2k 已提交
138

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
139 140 141 142 143 144
                if(modules[modulesName]) {
                    modules[modulesName] = {
                        ...modules[modulesName],
                        ...modulesConent.default
                    }
                } else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
145
                    modules[modulesName] = modulesConent.default;
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
146 147 148 149 150 151 152
                }

            }

        });

        // 导入 @/locales 下文件,不包含子目录,文件名为:([a-z]{2})-?([A-Z]{2})?\.ts
aaronchen2k2k's avatar
aaronchen2k2k 已提交
153
        const localesRequireContext: __WebpackModuleApi.RequireContext = require.context('../locales', false, /([a-z]{2})-?([A-Z]{2})?\.ts$/);
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
154 155 156
        localesRequireContext.keys().forEach(fileName => {
            // 获取内容
            const modulesConent = localesRequireContext(fileName);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
157
            if(modulesConent.default) {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
158 159 160 161 162 163 164 165
                // 获取 PascalCase 命名
                const modulesName = fileName.replace(/(.*\/)*([^.]+).*/ig,"$2");
                if(modules[modulesName]) {
                    modules[modulesName] = {
                        ...modules[modulesName],
                        ...modulesConent.default
                    }
                } else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
166
                    modules[modulesName] = modulesConent.default;
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
167 168 169 170 171
                }

            }

        });
aaronchen2k2k's avatar
aaronchen2k2k 已提交
172 173


aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
174 175 176 177 178 179 180 181
    } catch (error) {
      // eslint-disable-next-line no-console
      console.log(error);
    }

    return modules;
}