locale-set.uvue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <cl-popup
  3. v-model="visible"
  4. direction="center"
  5. :title="t('切换语言')"
  6. :pt="{
  7. className: '!rounded-3xl'
  8. }"
  9. >
  10. <view class="locale-set w-[500rpx] p-4 pt-0">
  11. <view
  12. v-for="item in list"
  13. :key="item.value"
  14. class="p-2 px-3 my-1 rounded-xl flex flex-row items-center border border-solid border-surface-200"
  15. :class="{
  16. '!border-surface-600': isDark,
  17. '!bg-primary-500 !border-primary-500': active == item.value
  18. }"
  19. @tap="change(item.value)"
  20. >
  21. <cl-text
  22. :pt="{
  23. className: parseClass([
  24. 'flex-1',
  25. [isDark || active == item.value, '!text-white', '!text-surface-700']
  26. ])
  27. }"
  28. >{{ item.label }}</cl-text
  29. >
  30. <cl-icon
  31. name="checkbox-circle-line"
  32. color="white"
  33. v-if="active == item.value"
  34. ></cl-icon>
  35. </view>
  36. <view class="flex flex-row mt-4">
  37. <cl-button
  38. size="large"
  39. text
  40. border
  41. type="light"
  42. :pt="{
  43. className: 'flex-1 !rounded-full h-[80rpx]'
  44. }"
  45. @tap="close"
  46. >{{ t("取消") }}</cl-button
  47. >
  48. <cl-button
  49. size="large"
  50. :pt="{
  51. className: 'flex-1 !rounded-full h-[80rpx]'
  52. }"
  53. @tap="confirm"
  54. >{{ t("确定") }}</cl-button
  55. >
  56. </view>
  57. </view>
  58. </cl-popup>
  59. </template>
  60. <script setup lang="ts">
  61. import { isDark, parseClass } from "@/cool";
  62. import { locale, t, setLocale } from "@/locale";
  63. import { ref } from "vue";
  64. type Item = {
  65. label: string;
  66. value: string;
  67. };
  68. // 语言列表
  69. const list = [
  70. {
  71. label: "简体中文",
  72. value: "zh-cn"
  73. },
  74. {
  75. label: "English",
  76. value: "en"
  77. },
  78. {
  79. label: "Español",
  80. value: "es"
  81. }
  82. ] as Item[];
  83. // 当前语言
  84. const active = ref(locale.value);
  85. // 是否可见
  86. const visible = ref(false);
  87. // 打开
  88. function open() {
  89. visible.value = true;
  90. active.value = locale.value;
  91. if (["zh-Hans", "zh"].some((e) => e == locale.value)) {
  92. active.value = "zh-cn";
  93. }
  94. }
  95. // 关闭
  96. function close() {
  97. visible.value = false;
  98. }
  99. // 切换语言
  100. function change(value: string) {
  101. active.value = value;
  102. }
  103. // 确定
  104. function confirm() {
  105. setLocale(active.value);
  106. close();
  107. }
  108. defineExpose({
  109. visible,
  110. open,
  111. close
  112. });
  113. </script>