locale-set.uvue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <cl-select
  3. ref="selectRef"
  4. v-model="active"
  5. :options="options"
  6. :show-trigger="false"
  7. :title="t('切换语言')"
  8. :cancel-text="t('取消')"
  9. :confirm-text="t('确定')"
  10. ></cl-select>
  11. </template>
  12. <script setup lang="ts">
  13. import { locale, setLocale, t } from "@/.cool";
  14. import { useUi, type ClSelectOption } from "@/uni_modules/cool-ui";
  15. import { ref } from "vue";
  16. const ui = useUi();
  17. // 语言列表
  18. const options = [
  19. {
  20. label: "简体中文",
  21. value: "zh-cn"
  22. },
  23. {
  24. label: "繁体中文",
  25. value: "zh-tw"
  26. },
  27. {
  28. label: "English",
  29. value: "en"
  30. },
  31. {
  32. label: "Español",
  33. value: "es"
  34. },
  35. {
  36. label: "日本語",
  37. value: "ja"
  38. },
  39. {
  40. label: "한국어",
  41. value: "ko"
  42. },
  43. {
  44. label: "Français",
  45. value: "fr"
  46. }
  47. ] as ClSelectOption[];
  48. const selectRef = ref<ClSelectComponentPublicInstance | null>(null);
  49. // 当前语言
  50. const active = ref<string>(locale.value);
  51. // 打开
  52. function open() {
  53. active.value = locale.value;
  54. if (["zh-Hans", "zh"].some((e) => e == locale.value)) {
  55. active.value = "zh-cn";
  56. }
  57. selectRef.value!.open((value) => {
  58. ui.showLoading(t("切换中"));
  59. setTimeout(() => {
  60. setLocale(value as string);
  61. ui.hideLoading();
  62. }, 500);
  63. });
  64. }
  65. // 关闭
  66. function close() {
  67. selectRef.value!.close();
  68. }
  69. defineExpose({
  70. open,
  71. close
  72. });
  73. </script>