congming_huose-apk/pages/yuyan.vue

329 lines
7.1 KiB
Vue

<template>
<!-- 语言切换区域 -->
<view class="lang-select">
<!-- 返回按钮 -->
<view class="back-btn" @click="goBack">
<text class="back-icon"></text>
<text class="back-text">{{ $i18n.t('back') }}</text>
</view>
<view class="lang-title">
<text>{{ $i18n.t('languageSettings') }}</text>
</view>
<view class="current-lang">
<text class="current-lang-text">{{ $i18n.t('currentLanguage') }}: {{ getCurrentLangName() }}</text>
</view>
<view class="lang-buttons">
<view
class="lang-item"
:class="{ 'active': currentLang === 'zh' }"
@click="changeLang('zh')"
>
<view class="flag-icon">🇨🇳</view>
<text class="lang-text">{{ $i18n.t('chinese') }}</text>
<view class="check-icon" v-if="currentLang === 'zh'">✓</view>
</view>
<view
class="lang-item"
:class="{ 'active': currentLang === 'en' }"
@click="changeLang('en')"
>
<view class="flag-icon">🇺🇸</view>
<text class="lang-text">{{ $i18n.t('english') }}</text>
<view class="check-icon" v-if="currentLang === 'en'">✓</view>
</view>
<view
class="lang-item"
:class="{ 'active': currentLang === 'ru' }"
@click="changeLang('ru')"
>
<view class="flag-icon">🇷🇺</view>
<text class="lang-text">{{ $i18n.t('russian') }}</text>
<view class="check-icon" v-if="currentLang === 'ru'">✓</view>
</view>
<!-- <view
class="lang-item"
:class="{ 'active': currentLang === 'ja' }"
@click="changeLang('ja')"
>
<view class="flag-icon">🇯🇵</view>
<text class="lang-text">{{ $i18n.t('japanese') }}</text>
<view class="check-icon" v-if="currentLang === 'ja'"></view>
</view> -->
</view>
</view>
</template>
<script>
export default {
name: 'YuyanPage',
data() {
return {
currentLang: 'zh',
type:''
}
},
onLoad(option) {
this.type = option.type
},
methods: {
// 点击进行语言切换
changeLang(lang) {
// 设置语言
this.$i18n.setLanguage(lang);
this.currentLang = lang;
// 显示切换成功提示
uni.showToast({
title: this.$i18n.t('languageSwitchSuccess'),
icon: 'success',
duration: 1500
});
},
getCurrentLangName() {
const langMap = {
'zh': this.$i18n.t('chinese'),
'en': this.$i18n.t('english'),
'ja': this.$i18n.t('japanese'),
'ru': this.$i18n.t('russian')
};
return langMap[this.currentLang] || this.$i18n.t('chinese');
},
// 判断返回上一级还是回到登录页
goBack() {
if(this.type == 1){
uni.reLaunch({
url:'/pages/login/index'
})
}else{
uni.reLaunch({
url:'/pages/index/index'
})
}
}
},
// 添加页面显示时的生命周期,确保语言更新
onShow() {
// 获取当前语言
this.currentLang = this.$i18n.getCurrentLanguage()
// 强制更新组件
this.$forceUpdate()
},
// 监听多语言变化事件
mounted() {
this.currentLang = this.$i18n.getCurrentLanguage()
uni.$on('languageChanged', () => {
this.currentLang = this.$i18n.getCurrentLanguage()
this.$forceUpdate()
})
},
// 移除监听事件
beforeDestroy() {
uni.$off('languageChanged')
}
}
</script>
<style lang="scss" scoped>
.lang-select {
padding: 40rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 0%, transparent 70%);
animation: float 6s ease-in-out infinite;
}
}
@keyframes float {
0%, 100% {
transform: translateY(0px) rotate(0deg);
}
50% {
transform: translateY(-20px) rotate(180deg);
}
}
.back-btn {
position: absolute;
top: 100rpx;
left: 40rpx;
z-index: 10;
display: flex;
align-items: center;
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10rpx);
border-radius: 30rpx;
padding: 10rpx 20rpx;
cursor: pointer;
transition: background 0.3s ease;
&:hover {
background: rgba(255, 255, 255, 0.3);
}
.back-icon {
font-size: 40rpx;
margin-right: 10rpx;
color: white;
}
.back-text {
font-size: 32rpx;
color: white;
font-weight: 500;
}
}
.lang-title {
margin-bottom: 80rpx;
text-align: center;
position: relative;
z-index: 2;
text {
font-size: 48rpx;
font-weight: 600;
color: white;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3);
background: linear-gradient(45deg, #fff, #f0f0f0);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
}
.current-lang {
margin-bottom: 60rpx;
text-align: center;
position: relative;
z-index: 2;
.current-lang-text {
font-size: 32rpx;
color: rgba(255, 255, 255, 0.9);
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.3);
background: rgba(255, 255, 255, 0.1);
padding: 20rpx 40rpx;
border-radius: 30rpx;
backdrop-filter: blur(10rpx);
border: 1rpx solid rgba(255, 255, 255, 0.2);
}
}
.lang-buttons {
width: 100%;
display: flex;
flex-direction: column;
gap: 40rpx;
position: relative;
z-index: 2;
}
.lang-item {
display: flex;
align-items: center;
padding: 40rpx 60rpx;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10rpx);
border-radius: 20rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
border: 1rpx solid rgba(255, 255, 255, 0.2);
position: relative;
overflow: hidden;
margin-top: 30rpx;
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
transition: left 0.5s;
}
&:active {
transform: scale(0.98);
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.15);
&::before {
left: 100%;
}
}
&:hover {
background: rgba(255, 255, 255, 1);
box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.15);
transform: translateY(-2rpx);
}
&.active {
background: rgba(255, 255, 255, 1);
box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.15);
transform: translateY(-2rpx);
border-color: #667eea;
}
}
.flag-icon {
font-size: 60rpx;
margin-right: 40rpx;
width: 80rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8rpx;
overflow: hidden;
position: relative;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.3) 50%, transparent 70%);
transform: translateX(-100%);
transition: transform 0.6s;
}
&:hover::after {
transform: translateX(100%);
}
}
.lang-text {
font-size: 36rpx;
font-weight: 500;
color: #333;
flex: 1;
transition: color 0.3s ease;
}
.lang-item:hover .lang-text {
color: #667eea;
}
.check-icon {
font-size: 40rpx;
color: #667eea;
margin-left: 20rpx;
}
</style>