{"version":3,"file":"index.mjs","sources":["../../../../../packages/hooks/use-locale/index.ts"],"sourcesContent":["import { computed, getCurrentInstance, inject, provide, ref } from 'vue'\nimport English from '@element-plus/locale/lang/en'\nimport { buildProp, definePropType } from '@element-plus/utils/props'\nimport type { InjectionKey, Ref } from 'vue'\nimport type { Language } from '@element-plus/locale'\n\nexport const useLocaleProps = {\n  locale: buildProp({\n    type: definePropType<Language>(Object),\n  }),\n}\n\ntype Translator = (...args: any[]) => string\n\nexport type LocaleContext = {\n  locale: Ref<Language>\n  lang: Ref<string>\n  t: Translator\n}\n\nexport const LocaleInjectionKey =\n  'ElLocaleInjection' as unknown as InjectionKey<LocaleContext>\n\n// this is meant to fix global methods like `ElMessage(opts)`, this way we can inject current locale\n// into the component as default injection value.\n// refer to: https://github.com/element-plus/element-plus/issues/2610#issuecomment-887965266\nlet localeObjCache: LocaleContext\n\nfunction translate(path, option, current) {\n  const paths = path.split('.')\n  let value\n  for (let i = 0, j = paths.length; i < j; i++) {\n    const property = paths[i]\n    value = current[property]\n    if (i === j - 1) return template(value, option)\n    if (!value) return ''\n    current = value\n  }\n}\n\nexport const useLocale = () => {\n  const vm = getCurrentInstance()!\n  const props = vm.props as {\n    locale: Language\n  }\n\n  const locale = computed(() => props.locale || English)\n  const lang = computed(() => locale.value.name)\n\n  const _translator = (...args: any[]) => {\n    const [path, option] = args\n    return translate(path, option, locale.value)\n  }\n\n  const t = (...args: any[]) => {\n    return _translator(...args)\n  }\n\n  const provides = {\n    locale,\n    lang,\n    t,\n  } as LocaleContext\n\n  // this could be broken if someone tries to do following:\n\n  /**\n   * <config-provider :locale=\"lang1\">\n   *   <config-provider :locale=\"lang2\">\n   *     Something calls modal component.\n   *   </config-provider>\n   * </config-provider>\n   */\n  localeObjCache = provides\n  provide(LocaleInjectionKey, provides)\n}\n\nfunction template(str: string, option) {\n  if (!str || !option) return str\n  return str.replace(/\\{(\\w+)\\}/g, (_, key) => {\n    return option[key]\n  })\n}\n\nexport const localeProviderMaker = (locale = English) => {\n  const lang = ref(locale.name)\n  const localeRef = ref(locale)\n  return {\n    lang,\n    locale: localeRef,\n    t: (...args: any[]) => {\n      const [path, option] = args\n      return translate(path, option, localeRef.value)\n    },\n  }\n}\n\nexport const useLocaleInject = () => {\n  return inject(\n    LocaleInjectionKey,\n    localeObjCache || {\n      lang: ref(English.name),\n      locale: ref(English),\n      t: (...args) => {\n        const [path, option] = args\n        return translate(path, option, English)\n      },\n    }\n  )\n}\n"],"names":["English"],"mappings":";;;;MAMa,iBAAiB;AAAA,EAC5B,QAAQ,UAAU;AAAA,IAChB,MAAM,eAAyB;AAAA;AAAA;MAYtB,qBACX;AAKF,IAAI;AAEJ,mBAAmB,MAAM,QAAQ,SAAS;AACxC,QAAM,QAAQ,KAAK,MAAM;AACzB,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,UAAM,WAAW,MAAM;AACvB,YAAQ,QAAQ;AAChB,QAAI,MAAM,IAAI;AAAG,aAAO,SAAS,OAAO;AACxC,QAAI,CAAC;AAAO,aAAO;AACnB,cAAU;AAAA;AAAA;MAID,YAAY,MAAM;AAC7B,QAAM,KAAK;AACX,QAAM,QAAQ,GAAG;AAIjB,QAAM,SAAS,SAAS,MAAM,MAAM,UAAUA;AAC9C,QAAM,OAAO,SAAS,MAAM,OAAO,MAAM;AAEzC,QAAM,cAAc,IAAI,SAAgB;AACtC,UAAM,CAAC,MAAM,UAAU;AACvB,WAAO,UAAU,MAAM,QAAQ,OAAO;AAAA;AAGxC,QAAM,IAAI,IAAI,SAAgB;AAC5B,WAAO,YAAY,GAAG;AAAA;AAGxB,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA;AAYF,mBAAiB;AACjB,UAAQ,oBAAoB;AAAA;AAG9B,kBAAkB,KAAa,QAAQ;AACrC,MAAI,CAAC,OAAO,CAAC;AAAQ,WAAO;AAC5B,SAAO,IAAI,QAAQ,cAAc,CAAC,GAAG,QAAQ;AAC3C,WAAO,OAAO;AAAA;AAAA;MAIL,sBAAsB,CAAC,SAASA,gBAAY;AACvD,QAAM,OAAO,IAAI,OAAO;AACxB,QAAM,YAAY,IAAI;AACtB,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,GAAG,IAAI,SAAgB;AACrB,YAAM,CAAC,MAAM,UAAU;AACvB,aAAO,UAAU,MAAM,QAAQ,UAAU;AAAA;AAAA;AAAA;MAKlC,kBAAkB,MAAM;AACnC,SAAO,OACL,oBACA,kBAAkB;AAAA,IAChB,MAAM,IAAIA,YAAQ;AAAA,IAClB,QAAQ,IAAIA;AAAA,IACZ,GAAG,IAAI,SAAS;AACd,YAAM,CAAC,MAAM,UAAU;AACvB,aAAO,UAAU,MAAM,QAAQA;AAAA;AAAA;AAAA;;;;"}