添加俄语版

This commit is contained in:
浅念
2025-04-08 09:44:59 +08:00
17 changed files with 219 additions and 57 deletions
+13 -2
View File
@@ -102,10 +102,21 @@
page {
background-color:#F9F9F9;
height: 100%;
font-size: 28rpx;
font-size: 24rpx;
/* line-height: 1.8; */
}
uni-input{
font-size: 24rpx;
}
textarea {
font-size: 24rpx;
}
.select{
font-size: 24rpx;
}
.u-radio-group--row{
font-size: 24rpx;
}
.fix-pc-padding {
padding: 0 50px;
}
+2 -1
View File
@@ -8,7 +8,7 @@ export function request(options){//封装的requset
let { url,data,method } = options;
data = data || {},
uni.showLoading({
title: '加载中'
title: ''
});
return new Promise((resolve,rejext)=>{
@@ -23,6 +23,7 @@ export function request(options){//封装的requset
title: res.data.message,
icon: 'none'
});
uni.clearStorageSync();
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index',// 替换为你要跳转的页面路径
+9 -4
View File
@@ -31,7 +31,7 @@ export default {
title: "Управление клиентами",
inputhd: "Введите имя клиента или номер телефона",
followtype: "Способ последующие ",
Online: "Онлайн последующие ",
Online: "Линия",
Visit: "Посещение",
addfollow: "Добавить последующие",
followtime: "Время последующие ",
@@ -85,6 +85,7 @@ export default {
Privacy: "Политика конфиденциальности",
UserAgreement: "Пользовательское соглашение",
copyright: "© Henan Xinyouhe Technology Co., Ltd. Все права защищены",
logoff:'Списание счетов',
logoffmsg: "Следующая информация будет удалена без возможности восстановления",
logoffts1: "Идентификационные и учетные данные",
logoffts2: "Вся информация о клиентах",
@@ -105,7 +106,7 @@ export default {
tday: "Сегодня",
threeday: "Последние 3 дня",
sevenday: "Последние 7 дней",
followup: "Последующие меры",
followup: "Последующие",
deal: "Завершено",
lost: "Потеряно",
cancel: "Отмена",
@@ -130,6 +131,8 @@ export default {
emailinput: "Введите email",
phone: "Телефон",
agreeMsg: "Я прочитал и согласен с",
Privacy:'《Политика конфиденциальности》',
UserAgreement:'《Пользовательское соглашение》',
and: "и",
empty: "Нет записей~",
times: "Время",
@@ -162,13 +165,15 @@ export default {
auth: "Авторизация Feishu",
inputnl: "Выберите",
noresults: "Нет результатов",
keyword: "Введите ключевое слово для поиска",
keyword: "Ключевые слова поиска",
prompt:'Подсказка',
restoremsg: "Подтвердите восстановление данных клиента?",
onedayn: "В течение 1 дня",
threedayn: "В течение 3 дней",
sevendayn: "В течение 7 дней",
follow: " последующие ",
follow: " последующие",
timeout: "Просрочено",
day:'Боже.',
hour: "час",
minute: "мин",
second: "сек",
+1 -3
View File
@@ -62,8 +62,7 @@ export default {
Countryinput:'请选择国家',
Company:'公司',
Companyinput:'去定位',
CustomerScreening:'客户筛选'
CustomerScreening:'客户筛选'
},
mine: {
desc: '我的',
@@ -195,5 +194,4 @@ export default {
loading:'加载中',
downmp:'下载名片',
downmpmsg:'确定下载当前名片图吗?',
}
+114
View File
@@ -0,0 +1,114 @@
<template>
<view class="countdown">
<view class="time green">
<image src="/static/image/gtime.png" mode=""></image>
<text>{{ timeObj.days }}{{$t('day')}} </text>
<text> {{ timeObj.hours | padZero }} : </text>
<text> {{ timeObj.minutes | padZero }} : </text>
<text> {{ timeObj.seconds | padZero }}</text>
</view>
</view>
</template>
<script>
export default {
props: {
// 起始时间
totalSeconds: {
type: '',
required: true
},
// 是否显示天数
showDays: {
type: Boolean,
default: true
}
},
data() {
return {
startTime: this.totalSeconds, // 开始时间(Date对象)
elapsedTime: 0, // 已过时间(毫秒)
timer: null, // 计时器对象
isRunning: false, // 是否运行中
startTimeStr: '' ,// 显示用的开始时间字符串
timeObj: {
days: 0,
hours: 0,
minutes: 0,
seconds: 0
},
}
},
mounted() {
this.runCountdown();
},
filters: {
padZero(value) {
return value.toString().padStart(2, '0');
}
},
methods: {
// 计算已过时间
calculateElapsed() {
if (this.startTime) {
// 计算差值(毫秒)
let diff = this.startTime
const dateStr = diff;
const timestamp = new Date(dateStr).getTime();
// 处理iOS兼容性问题(推荐写法)
const iosFriendlyTimestamp = new Date(dateStr.replace(/-/g, '/')).getTime();
// 当前时间戳(毫秒)
const now = Date.now()
// 计算差值(毫秒)
let diff1 = Math.abs(now - iosFriendlyTimestamp)
// 计算各个单位
const seconds = Math.floor(diff1 / 1000)
this.timeObj.days = Math.floor(seconds / (24 * 3600));
const remaining = seconds % (24 * 3600);
this.timeObj.hours = Math.floor(remaining / 3600);
this.timeObj.minutes = Math.floor((remaining % 3600) / 60);
this.timeObj.seconds = remaining % 60;
}
},
runCountdown() {
if (!this.isRunning && this.startTime) {
this.isRunning = true
this.timer = setInterval(() => {
this.calculateElapsed()
}, 1000)
}
},
},
beforeDestroy() {
clearInterval(this.timer);
}
}
</script>
<style lang="scss">
.countdown {
.time {
display: flex;
align-items: center;
text {
margin: 0px 2px;
}
}
image {
width: 18px;
height: 18px;
margin-right: 5px;
}
}
.green {
color: #27C89C;
}
.timered {
color: #FF4040;
}
</style>
+3 -2
View File
@@ -23,8 +23,9 @@ import Eyu from '@/common/locales/ru.js';
// 引入并使用vue-i18n
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
console.log(uni.getLocale())
let i18nConfig = {
locale: uni.getLocale(),// 获取已设置的语言
locale: uni.getStorageSync('i18locale')?uni.getStorageSync('i18locale'):uni.getLocale(),// 获取已设置的语言
messages: {
// 这里的属性名是任意的,您也可以把zh设置为cn等,只是后续切换语言时
// 要标识这里的语言属性,如:this.$i18n.locale = zh|en|cn|xxx
@@ -36,7 +37,7 @@ let i18nConfig = {
// 构造i18n对象
const i18n = new VueI18n({
// 默认语言,这里的local属性,对应message中的cn、en属性
locale:uni.getLocale(),
locale:uni.getStorageSync('i18locale')?uni.getStorageSync('i18locale'):uni.getLocale(),
// 引入语言文件
messages: {
// 这里的属性名是任意的,您也可以把zh设置为cn等,只是后续切换语言时
+3 -6
View File
@@ -421,9 +421,8 @@
justify-content:space-between;
padding: 18px 20px;
align-items: center;
font-size: 32rpx;
font-weight: 500;
font-size: 32rpx;
font-size: 24rpx;
color: #666666;
.item{
width: 90px;
@@ -433,14 +432,11 @@
margin-right: -15px;
}
.cell1{
font-size: 32rpx;
font-size: 24rpx;
padding: 18px 20px;
align-items: center;
font-weight: 500;
color: #666666;
.item{
width: 100px;
}
}
.right{
text-align: right;
@@ -466,6 +462,7 @@
width: 92%;
margin-bottom: 40px;
margin: 15px 4%;
font-size: 28rpx;
}
.mapcont{
.header{
+3 -3
View File
@@ -528,7 +528,7 @@
}
}
.name{
font-size: 32rpx;
font-size: 30rpx;
font-weight: bold;
margin-right: 10px;
}
@@ -622,7 +622,7 @@
border-radius: 8px;
color: #3471FF;
text-align: center;
padding: 5px 0px;
padding: 5px 13px;
}
.row{
width: 100%;
@@ -630,7 +630,7 @@
.col4{
display: inline-block;
margin: 4px 3px;
width: 30%;
// width: 30%;
}
}
.tagactive{
+1 -1
View File
@@ -478,7 +478,7 @@
margin-right: -15px;
}
.cell1{
font-size: 32rpx;
font-size: 24rpx;
padding: 18px 20px;
align-items: center;
font-weight: 500;
+2
View File
@@ -42,6 +42,8 @@
closeOnClickOverlay
v-model="nexttime"
mode="datetime"
:cancel-text="$t('cancel')"
:confirm-text="$t('confirm')"
@confirm="confirmnext"
@cancel="cancelnext"
@close="close('shownexttime')"
+12 -21
View File
@@ -6,7 +6,7 @@
<view class="name">{{userdatas.contacts}}</view>
<view class="right">
<text class="medal" :style="{color:(userdatas.magnitude == 0 ?'#F5AB00' : userdatas.magnitude == 1 ?'#8495B8': '#9B7200')}">{{userdatas.magnitude_txt}}</text>
<text class="tag" :style="{background:(userdatas.follow == 0 ?'#3471FF' : userdatas.follow == 1 ?'#27C89C': '#FF4040')}">{{userdatas.follow_txt}}</text>
<text class="tag" :style="{background:(userdatas.follow == 0 ?'#3471FF' : userdatas.follow == 1 ?'#27C89C': '#FF4040')}">{{userdatas.follow==0?$t('followup'):userdatas.follow==1?$t('deal'):$t('lost')}}</text>
</view>
</view>
<u-line margin="20rpx 0px" color="#fff" :hairline="false"></u-line>
@@ -94,7 +94,7 @@
<u-gap height="10" bgColor="#F6F6F6"></u-gap>
<view class="steps">
<view class="title">
{{$t('customer.followrecord')}} <text class="status" :style="{color:(datas.follow == 0 ?'#3471FF' : datas.follow == 1 ?'#27C89C': '#FF4040')}">{{datas.follow_txt}}</text>
{{$t('customer.followrecord')}} <text class="status" :style="{color:(userdatas.follow == 0 ?'#3471FF' : userdatas.follow == 1 ?'#27C89C': '#FF4040')}">{{userdatas.follow==0?$t('followup'):userdatas.follow==1?$t('deal'):$t('lost')}}</text>
</view>
<u-steps v-if="followList.length>0" :current="followList.length" direction="column" dot>
<u-steps-item :title="item.type==1? $t('customer.Online') : $t('customer.Visit') " v-for="(item, index) in followList" :key="index">
@@ -135,8 +135,7 @@
<empty :list="followList"></empty>
</view>
<u-gap height="100" bgColor="#fff"></u-gap>
<view class="foot">
<!-- <button class="btn1" @click="shownexttime=true">{{$t('customer.NextReminder')}}</button> -->
<view class="foot">
<button class="btn" @click="nextFn">{{$t('submit')}}</button>
</view>
<u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :defaultIndex="defaultIndexfj" :show="showgrade" @cancel="cancel('showgrade')" @close="close('showgrade')" :columns="getGradeList" keyName="name" @confirm="gradeHandler"></u-picker>
@@ -146,6 +145,8 @@
closeOnClickOverlay
v-model="firstFollow"
mode="datetime"
:cancel-text="$t('cancel')"
:confirm-text="$t('confirm')"
@confirm="confirm"
@change="change"
@cancel="cancel('show')"
@@ -156,6 +157,8 @@
closeOnClickOverlay
v-model="nexttime"
mode="datetime"
:cancel-text="$t('cancel')"
:confirm-text="$t('confirm')"
@confirm="confirmnext"
@cancel="cancelnext"
@close="close('shownexttime')"
@@ -613,7 +616,7 @@
}
}
.name{
font-size: 32rpx;
font-size: 30rpx;
font-weight: bold;
margin-right: 10px;
}
@@ -681,9 +684,8 @@
justify-content:space-between;
padding: 18px 20px;
align-items: center;
font-size: 32rpx;
font-weight: 500;
font-size: 32rpx;
font-size: 24rpx;
color: #666666;
.item{
width: 90px;
@@ -693,7 +695,7 @@
margin-right: -15px;
}
.cell1{
font-size: 32rpx;
font-size: 24rpx;
padding: 18px 20px;
align-items: center;
font-weight: 500;
@@ -719,19 +721,8 @@
color: white;
border-radius: 50px;
width: 93%;
height: 96rpx;
line-height: 96rpx;
margin-top: 20px;
}
.btn1{
font-size: 28rpx;
border: 1px solid #3471FF;
background: #fff;
color: #3471FF;
border-radius: 50px;
width: 45%;
height: 96rpx;
line-height: 96rpx;
height:88rpx;
line-height: 88rpx;
margin-top: 20px;
}
.addimg{
+2 -2
View File
@@ -3,8 +3,8 @@
<view id="map" style="height: 100vh;"></view>
<!-- 输入框事件 -->
<view style="display: flex; padding: 30rpx; position: fixed;width: 93%; background: white; top: 0px;">
<input v-model="value" type="text" id="search-box" placeholder="请输入" class="search" @input="getPlacesList" />
<view class="btn" @click="nextfn">确定</view>
<input v-model="value" type="text" id="search-box" :placeholder="$t('keyword')" class="search" @input="getPlacesList" />
<view class="btn" @click="nextfn">{{$t('confirm')}}</view>
</view>
<view class="card" v-if="list.length > 0">
<view class="item" v-for="(item, index) in list" :key="index">
+18 -3
View File
@@ -4,7 +4,7 @@
<template #top>
<view class="top">
<!-- <view class="navbar">{{$t('customer.title')}}</view> -->
<uni-nav-bar leftText=" " :fixed="true" :border="false" @clickLeft="leftClick" color="#fff" backgroundColor="#3471ff" :statusBar="true" :title="$t('customer.title')"></uni-nav-bar>
<uni-nav-bar leftText=" " :fixed="true" :border="false" @clickLeft="leftClick" color="#fff" backgroundColor="rgba(52,113,255,0)" :statusBar="true" :title="$t('customer.title')"></uni-nav-bar>
<view class="topSearch">
<view class="left">
@@ -19,7 +19,7 @@
</view>
</view>
<view class="tabsbg">
<u-tabs :list="list1" :current="current" lineColor="#fff" :scrollable="false" @click="tabclick" :inactiveStyle="{color: '#fff'}" :activeStyle="{color: '#fff',fontWeight: '500',transform: 'scale(1.05)'}"></u-tabs>
<u-tabs :list="list1" :current="current" lineColor="#fff" :scrollable="isey" @click="tabclick" :inactiveStyle="{color: '#fff'}" :activeStyle="{color: '#fff',fontWeight: '500',transform: 'scale(1.05)'}"></u-tabs>
</view>
</template>
<view class="list">
@@ -95,6 +95,7 @@
columns:[],
list1: [],
datalist:[],
isey:false
}
},
onLoad(e) {
@@ -111,6 +112,12 @@
uni.removeStorageSync('location')
},
onShow() {
// var location = uni.getStorageSync('i18locale')?uni.getStorageSync('i18locale'):uni.getLocale()
// if(location=='ru'){
// this.isey=true
// }else{
// this.isey=false
// }
this.queryList(1, 10)
this.options1=[{
text: this.$t('delete'),
@@ -286,6 +293,12 @@
uni-page-body {
background-color: #F6F6F6 !important;
}
::v-deep .u-search__content__input{
font-size: 24rpx !important;
}
::v-deep .u-tabs__wrapper__nav__item__text{
font-size: 28rpx !important;
}
.u-swipe-action-item {
margin-bottom: 10px;
border-radius: 10px;
@@ -362,6 +375,7 @@
border-radius: 20px 0px 0px 20px;
padding: 3px 10px;
margin-right: -15px;
text-align: right;
}
.right{
display: flex;
@@ -380,7 +394,7 @@
justify-content: space-between;
color: #222222;
.name{
font-size: 32rpx;
font-size: 30rpx;
font-weight: bold;
margin-right: 10px;
}
@@ -390,6 +404,7 @@
}
.ststus{
color: #666666;
text-align: right;
}
.info,.desc{
color: #78758E;
+2 -2
View File
@@ -3,7 +3,7 @@
<z-paging ref="paging" v-model="datalist" @query="queryList" :empty-view-text="$t('Nodata')">
<template #top>
<view class="top">
<uni-nav-bar leftText=" " :fixed="true" :border="false" @clickLeft="leftClick" color="#fff" backgroundColor="#3471ff" :statusBar="true" :title="$t('navbar.highseas')"></uni-nav-bar>
<uni-nav-bar leftText=" " :fixed="true" :border="false" @clickLeft="leftClick" color="#fff" backgroundColor="rgba(52,113,255,0)" :statusBar="true" :title="$t('navbar.highseas')"></uni-nav-bar>
</view>
</template>
<view class="list">
@@ -79,7 +79,7 @@
console.log(e)
},
onShow() {
// this.queryList(1, 10)
this.queryList(1, 10)
uni.setTabBarItem({
index: 0,
text: this.$t('tabbar.home')
+16 -3
View File
@@ -120,7 +120,11 @@
}, {
label: this.$t('en'),
id: 'en'
}]
},{
label: this.$t('ru'),
id: 'ru'
}
]
],
columnstime:[
[{
@@ -193,8 +197,9 @@
var that = this
uni.setLocale(e.value[0].id)
this.$i18n.locale = e.value[0].id
// uni.setStorageSync('i18locale', e.value[0].id);
uni.setStorageSync('i18locale', e.value[0].id);
this.showlang = false
console.log(uni.getLocale())
this.columns =[
[{
label: this.$t('zh'),
@@ -202,7 +207,11 @@
}, {
label: this.$t('en'),
id: 'en'
}]
},{
label: this.$t('ru'),
id: 'ru'
}
]
];
this.columnstime =[
[{
@@ -442,6 +451,10 @@
.grid-text {
color: #222222;
font-size: 24rpx;
white-space: nowrap;
width: 95%;
overflow-x: scroll;
text-align: center;
}
}
+8 -2
View File
@@ -82,6 +82,9 @@
}, {
label: this.$t('en'),
id: 'en'
},{
label: this.$t('ru'),
id: 'ru'
}]
],
language:uni.getLocale()
@@ -105,7 +108,7 @@
confirmlang(e) {
uni.setLocale(e.value[0].id)
this.$i18n.locale = e.value[0].id
// uni.setStorageSync('i18locale', e.value[0].id);
uni.setStorageSync('i18locale', e.value[0].id);
this.language = e.value[0].id
this.showlang = false
this.columns =[
@@ -115,6 +118,9 @@
}, {
label: this.$t('en'),
id: 'en'
},{
label: this.$t('ru'),
id: 'ru'
}]
];
this.list1 = [{
@@ -186,7 +192,7 @@
language: this.language,
}
}).then(res => {
console.log(res.data.data)
uni.setStorageSync('i18locale',this.language);
if (res.data.code == -1) {
uni.showToast({
title: res.data.message,
+10 -2
View File
@@ -39,7 +39,7 @@
</view>
<view class="code">
<image :src="imageSrcewm" mode="" crossOrigin="anonymous" ></image>
<view>{{userinfo.socialize}}</view>
<view>{{userinfo.socialize==null||userinfo.socialize=='null'?'':userinfo.socialize}}</view>
</view>
<!-- <view class="code" :class=" activeImg === share_one ? 'code_one' : activeImg === share_two ? 'code_two' : activeImg === share_three ? 'code_three' : 'code_one'">
<qrcode-vue :value="codeUrl" :size="70"></qrcode-vue>
@@ -86,6 +86,7 @@
that.userinfo = res.data.data;
that.downloadImageToLocal(res.data.data.avatar_url,'imageSrc')
that.downloadImageToLocal(res.data.data.socialize_pic_url,'imageSrcewm')
})
},
async downloadImageToLocal(imageUrl,item) {
@@ -191,6 +192,9 @@
justify-content: space-between;
flex: 1;
margin: 0px 25px 0px 0px;
.left{
text-align: left;
}
.title{
color: #3C4169;
font-size: 28px;
@@ -206,7 +210,8 @@
background: #3C4169;
border-radius: 18px;
margin-left: 20px;
padding: 2px 15px;
padding: 3px 15px;
display: inline-block;
}
image{
width: 100px;
@@ -256,5 +261,8 @@
width: 92%;
margin-bottom: 40px;
margin: 15px 4%;
font-size: 28rpx;
height: 88rpx;
line-height:88rpx;
}
</style>