You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.9 KiB

8 months ago
  1. <template>
  2. <view class="change-language">
  3. <!-- 选择语言弹出框 -->
  4. <u-popup :show="show" mode="bottom" @close="$emit('close');$play()" bgColor="black">
  5. <view class="language-list">
  6. <view v-for="item in languageList" :key="item.key" class="language" :class="{ activeLanguage : currentLanguageKey === item.key}" @click="select(item)">{{ item.name }}</view>
  7. </view>
  8. <view class="language-btns">
  9. <view @click="$emit('close');$play()" class="btn">{{ $t('page.changeLanguage.cancel') }}</view>
  10. <view @click="changeLanguage(currentLanguage)" class="btn">{{ $t('page.changeLanguage.confirm') }}</view>
  11. </view>
  12. </u-popup>
  13. </view>
  14. </template>
  15. <script>
  16. export default {
  17. data(){
  18. return {
  19. languageList: [
  20. {
  21. name:'English',
  22. key : "en"
  23. },
  24. {
  25. name:'español',
  26. key : "es"
  27. }
  28. ],
  29. currentLanguage : {},
  30. currentLanguageKey : this.$i18n.locale
  31. }
  32. },
  33. props : {
  34. show : {
  35. type : Boolean,
  36. default : false
  37. }
  38. },
  39. methods : {
  40. //选择语言
  41. select(item){
  42. this.$play()
  43. this.currentLanguage = item;
  44. this.currentLanguageKey = item.key
  45. },
  46. //修改当前语言
  47. changeLanguage(res){
  48. this.$play()
  49. //#ifdef H5
  50. this.$router.go(0); //刷新页面,不然validate.js不好国际化
  51. //#endif
  52. //#ifdef APP-PLUS
  53. uni.navigateTo({
  54. url: '/pages/home/home' // 要刷新的页面路径
  55. });
  56. //#endif
  57. if(!res.key){
  58. return
  59. }
  60. this.curLanguage = res.key;
  61. // this.$store.commit('changeLanguage', res.key.code);
  62. uni.setStorage({
  63. key: 'language',
  64. data: res.key
  65. })
  66. this.$i18n.locale = res.key
  67. uni.setLocale(res.key) //切换语言环境必须在this.$i18n.locale之后,否则app端会有意想不到的bug
  68. this.$emit('close')
  69. uni.$resMessage = this.$t('message')
  70. }
  71. }
  72. }
  73. </script>
  74. <style lang="scss" scoped>
  75. .change-language{
  76. .language-list{
  77. border: 1px solid #ccc;
  78. width: 96%;
  79. margin: 0rpx auto 20rpx auto;
  80. .language{
  81. position: relative;
  82. display: flex;
  83. justify-content: center;
  84. align-items: center;
  85. color: #B0C73B;
  86. height: 100rpx;
  87. border-bottom: 1px solid #ccc;
  88. font-size: 32rpx;
  89. &:last-child{
  90. border: none;
  91. }
  92. }
  93. .activeLanguage{
  94. &::after{
  95. position: absolute;
  96. top: 50%;
  97. right: 20rpx;
  98. content: "";
  99. width: 30rpx;
  100. height: 30rpx;
  101. border-radius: 50%;
  102. box-shadow: 0rpx 0rpx 30rpx #B0C73B;
  103. background: #B0C73B;
  104. transform: translateY(-50%);
  105. }
  106. }
  107. }
  108. .language-btns{
  109. display: flex;
  110. justify-content: space-between;
  111. flex-wrap: wrap;
  112. color: #ffffff80;
  113. width: 96%;
  114. margin: 0rpx auto 20rpx auto;
  115. .btn{
  116. display: flex;
  117. align-items: center;
  118. justify-content: center;
  119. width: calc(50% - 15rpx);
  120. border: 1px solid #ccc;
  121. height: 80rpx;
  122. }
  123. }
  124. }
  125. </style>