helper.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import type { LocaleType } from '#/config';
  2. import { set } from 'lodash-es';
  3. import { deepMerge } from '@/utils';
  4. export const loadLocalePool: LocaleType[] = [];
  5. export function setHtmlPageLang(locale: LocaleType) {
  6. document.querySelector('html')?.setAttribute('lang', locale);
  7. }
  8. export function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) {
  9. cb(loadLocalePool);
  10. }
  11. export function genMessage(langs: Record<string, Record<string, any>>, prefix = 'lang') {
  12. const obj: Recordable = {};
  13. Object.keys(langs).forEach((key) => {
  14. const langFileModule = langs[key].default;
  15. let fileName = key.replace(`./${prefix}/`, '').replace(/^\.\//, '');
  16. const lastIndex = fileName.lastIndexOf('.');
  17. fileName = fileName.substring(0, lastIndex);
  18. const keyList = fileName.split('/');
  19. const moduleName = keyList.shift();
  20. const objKey = keyList.join('.');
  21. if (moduleName) {
  22. if (objKey) {
  23. set(obj, moduleName, obj[moduleName] || {});
  24. set(obj[moduleName], objKey, langFileModule);
  25. } else {
  26. set(obj, moduleName, langFileModule || {});
  27. }
  28. }
  29. });
  30. return obj;
  31. }
  32. export const generateModuleMessage = (langs: Record<string, Record<string, any>>) => {
  33. let result: Recordable = {};
  34. Object.keys(langs).forEach((key) => {
  35. const langModule = langs[key].default;
  36. if (langModule.trans) {
  37. result = deepMerge(result, transferI18n(langModule));
  38. } else {
  39. result = deepMerge(result, langModule);
  40. }
  41. });
  42. return result;
  43. };
  44. export type I18nTransfer = {
  45. trans: boolean;
  46. key: string;
  47. data: { [index: string]: any };
  48. };
  49. /**
  50. * 转换国际化信息
  51. */
  52. export const transferI18n = (data: I18nTransfer | any) => {
  53. if (!data.trans) {
  54. return data;
  55. }
  56. const keySplit = data.key.split('.');
  57. let object = {};
  58. for (let i = keySplit.length - 1; i >= 0; i--) {
  59. const key = keySplit[i];
  60. const itemData: any = {};
  61. if (i === keySplit.length - 1) {
  62. itemData[key] = data.data;
  63. } else {
  64. itemData[key] = object;
  65. }
  66. object = itemData;
  67. }
  68. return object;
  69. };