Compare commits

...

2 Commits

Author SHA1 Message Date
qcl_123 433bb6c897 多语言对接 2026-03-31 16:54:31 +08:00
qcl_123 73334b4ee1 多语言设置 2026-03-31 16:04:41 +08:00
213 changed files with 10068 additions and 2701 deletions

40
App.vue
View File

@ -53,6 +53,12 @@
handleoginversion() { handleoginversion() {
let that = this let that = this
that.$model.getLoginVersion({}).then(res => { that.$model.getLoginVersion({}).then(res => {
// let language = res.data.language == "zh" ? 'zh-Hans' : res.data.language
let language = "zh"
uni.setLocale(language)
that.$i18n.locale = language
that.$store.commit('changeLocale', language)
uni.setStorageSync('language', language)
that.$store.dispatch("getHomeConfig") // that.$store.dispatch("getHomeConfig") //
if (res.code == 0) { if (res.code == 0) {
that.$tools.handleUserList() that.$tools.handleUserList()
@ -78,6 +84,8 @@
uni.showModal({ uni.showModal({
title: '发现新版本', title: '发现新版本',
content: '检查到新版本' + res.data.version + ',是否更新?', content: '检查到新版本' + res.data.version + ',是否更新?',
cancelText: that.$t('btnSancellation'),
confirmText: that.$t('btnConfirm'),
success: (modalRes) => { success: (modalRes) => {
if (modalRes.confirm) { // if (modalRes.confirm) { //
if (platform === 'android') { // if (platform === 'android') { //
@ -102,31 +110,19 @@
// console.error('Error fetching data:', error); // console.error('Error fetching data:', error);
}); });
}, },
// handleTabBarItem() {
updataWeiXin() {
let that = this let that = this
const updateManager = uni.getUpdateManager() uni.setTabBarItem({
// index: 0,
updateManager.onCheckForUpdate(function(res) { text: that.$t('titleHome')
// console.log("", res.hasUpdate)
}) })
updateManager.onUpdateReady(function() { uni.setTabBarItem({
uni.showModal({ index: 1,
title: '更新提示', text: that.$t('titleCount')
content: '新版本已经准备好,是否重启应用?',
success: function(res) {
if (res.confirm) {
// applyUpdate
updateManager.applyUpdate()
}
}
})
})
updateManager.onUpdateFailed(function() {
uni.showModal({
title: '新版本更新失败',
content: '请退出并移除小程序,重新打开...',
}) })
uni.setTabBarItem({
index: 2,
text: that.$t('titleMe')
}) })
} }
} }

View File

@ -5,7 +5,7 @@
<!-- 早午晚餐 --> <!-- 早午晚餐 -->
<view class="everyDay"> <view class="everyDay">
<view class="title"> <view class="title">
<view><text class="quan"></text>卡路里分析</view> <view><text class="quan"></text>{{$t("countCalorieAnalysis")}}</view>
</view> </view>
<div class="chart-wrap"> <div class="chart-wrap">
<qiun-data-charts type="ring" :opts="opts" :chartData="chartData" :canvas2d="true" canvasId="everyDay01"/> <qiun-data-charts type="ring" :opts="opts" :chartData="chartData" :canvas2d="true" canvasId="everyDay01"/>
@ -23,15 +23,15 @@
<!--营养元素分析 --> <!--营养元素分析 -->
<view class="everyDay"> <view class="everyDay">
<view class="title"> <view class="title">
<view><text class="quan"></text>营养元素能量占比</view> <view><text class="quan"></text>{{$t("countNutrientElementEnergyProportion")}}</view>
</view> </view>
<div class="chart-wrap"> <div class="chart-wrap">
<qiun-data-charts type="ring" :opts="opts2" :chartData="chartData2" :canvas2d="true" canvasId="everyDay02"/> <qiun-data-charts type="ring" :opts="opts2" :chartData="chartData2" :canvas2d="true" canvasId="everyDay02"/>
</div> </div>
<view class="foodtools"> <view class="foodtools">
<view class="top"> <view class="top">
<view>营养分类</view> <view>{{$t("countNutritionClassification")}}</view>
<view>摄入</view> <view>{{$t("countIntake")}}</view>
</view> </view>
<view class="type"> <view class="type">
<view class="name"> <view class="name">
@ -66,7 +66,7 @@
<!--营养元素排行榜 --> <!--营养元素排行榜 -->
<view class="everyDay"> <view class="everyDay">
<view class="title"> <view class="title">
<view><text class="quan"></text>营养元素排行榜</view> <view><text class="quan"></text>{{$t("countNutritionElementRankingList")}}</view>
</view> </view>
<view class="foodtools rank_list"> <view class="foodtools rank_list">
<view class="topname">{{details.carbohydrate.name}}</view> <view class="topname">{{details.carbohydrate.name}}</view>

View File

@ -12,7 +12,7 @@
<!-- 成分统计 --> <!-- 成分统计 -->
<view class="everyDay"> <view class="everyDay">
<view class="title"> <view class="title">
<view><text class="quan"></text>成分统计</view> <view><text class="quan"></text>{{$t('countComponentStatistics')}}</view>
</view> </view>
<view class="progress"> <view class="progress">
<div class="chart-wrap"> <div class="chart-wrap">
@ -36,7 +36,7 @@
<view class="foodtools"> <view class="foodtools">
<view class="type"> <view class="type">
<view class="title"> <view class="title">
<view><text class="quan"></text>食物类型</view> <view><text class="quan"></text>{{$t('countFoodTypes')}}</view>
</view> </view>
<view class="list" v-if="info.list.length"> <view class="list" v-if="info.list.length">
<uni-swipe-action> <uni-swipe-action>
@ -54,13 +54,13 @@
</view> </view>
<view v-else class="nolist"> <view v-else class="nolist">
<image src="/static/none.png"></image> <image src="/static/none.png"></image>
<view>暂无食物</view> <view>{{$t('countNoFood')}}</view>
</view> </view>
</view> </view>
</view> </view>
<!-- 添加食物 --> <!-- 添加食物 -->
<view class="add" @click="handleAddFood()"> <view class="add" @click="handleAddFood()">
<text>+</text>添加食物 <text>+</text>{{$t('countAddFood')}}
</view> </view>
</view> </view>
</view> </view>
@ -74,11 +74,11 @@
<image :src="activeFoodDetail.pic_url" mode="aspectFill"></image> <image :src="activeFoodDetail.pic_url" mode="aspectFill"></image>
<view class="info"> <view class="info">
<view class="name">{{activeFoodDetail.name}}</view> <view class="name">{{activeFoodDetail.name}}</view>
<view class="kcal">{{activeFoodDetail.val}}千卡</view> <view class="kcal">{{activeFoodDetail.val}}kcal</view>
</view> </view>
</view> </view>
<view class="foodContent"> <view class="foodContent">
<view class="title">热量和营养</view> <view class="title">{{$t('CaloriesAndnutrients')}}</view>
<view class="progress"> <view class="progress">
<div class="chart-wrap"> <div class="chart-wrap">
<qiun-data-charts type="ring" :opts="opts2" <qiun-data-charts type="ring" :opts="opts2"
@ -94,8 +94,8 @@
</view> </view>
</view> </view>
<view class="tips"> <view class="tips">
<text>营养素</text> <text>{{$t('Nutrients')}}</text>
<text>{{activeFoodDetail.weight}}含量</text> <text>{{activeFoodDetail.weight}}{{$t('Content')}}</text>
</view> </view>
<view class="foodDetailList"> <view class="foodDetailList">
<view class="foodDetailItem" v-for="(item,index) in activeFoodDetail.nutrients_list" <view class="foodDetailItem" v-for="(item,index) in activeFoodDetail.nutrients_list"
@ -140,7 +140,7 @@
drawerVisible: false, drawerVisible: false,
chartVisible: false, // chartVisible: false, //
actionOptions: [{ actionOptions: [{
text: '删除', text: this.$t('btnDelete'),
style: { style: {
backgroundColor: '#dd524d', backgroundColor: '#dd524d',
borderRadius: '10rpx' borderRadius: '10rpx'
@ -169,6 +169,9 @@
let that = this let that = this
that.index = options.index that.index = options.index
that.bgimage = that.foodItem[options.index].icon_bg that.bgimage = that.foodItem[options.index].icon_bg
uni.setNavigationBarTitle({
title: this.$t('titleEveryMeal')
})
that.handleInfo() that.handleInfo()
}, },
watch: { watch: {
@ -243,7 +246,7 @@
delAcitionItem(item) { delAcitionItem(item) {
let that = this let that = this
uni.showModal({ uni.showModal({
content: `是否删除[${item.name}]`, content: that.$t("WhetherTodelete") + item.name,
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
this.$model.delCEatAction({ this.$model.delCEatAction({

View File

@ -13,11 +13,11 @@
</view> </view>
<view class="serach-box"> <view class="serach-box">
<view class="searchInput"> <view class="searchInput">
<input placeholder="请输入..." class="city-serach-input" v-model="search_value" /> <input :placeholder="$t('verifyRecord')" class="city-serach-input" v-model="search_value" />
<icon v-if="search_value" class="iconfont icon-error" @click="handlecolse" size="30"></icon> <icon v-if="search_value" class="iconfont icon-error" @click="handlecolse" size="30"></icon>
</view> </view>
<view class="searchBtn"> <view class="searchBtn">
<view @click="handleSerach">搜索</view> <view @click="handleSerach">{{$t("Search")}}</view>
</view> </view>
</view> </view>
</view> </view>
@ -25,7 +25,7 @@
<view class="content-box" v-if="!search_list.length"> <view class="content-box" v-if="!search_list.length">
<view v-if="history_food.length" class="search-history"> <view v-if="history_food.length" class="search-history">
<view class="title"> <view class="title">
<view class="quan mr-5"></view>历史搜索 <view class="quan mr-5"></view>{{$t("HistoricalSearch")}}
</view> </view>
<view class="button-container" @click="showAll =! showAll" v-if="history_food.length>10"> <view class="button-container" @click="showAll =! showAll" v-if="history_food.length>10">
<image :src="showAll?'/static/arrow-up.png':'/static/arrow-down.png'"></image> <image :src="showAll?'/static/arrow-up.png':'/static/arrow-down.png'"></image>
@ -40,7 +40,7 @@
</view> </view>
<view class="popular-container"> <view class="popular-container">
<view class="title"> <view class="title">
<view class="quan mr-5"></view>猜你想搜 <view class="quan mr-5"></view>{{$t("wantSearch")}}
</view> </view>
<view class="popular-food-item" v-for="(ite,index) in popular_food" :key="index"> <view class="popular-food-item" v-for="(ite,index) in popular_food" :key="index">
<view class="food-title">{{ite.title}}</view> <view class="food-title">{{ite.title}}</view>
@ -64,17 +64,6 @@
<image src="/static/arrow-down.png"></image> <image src="/static/arrow-down.png"></image>
</view> </view>
</view> </view>
<!-- #ifdef MP-WEIXIN -->
<view class="mic-icon" @touchstart="onVoiceTouchStart" @touchend="onVoiceTouchEnd"
@touchcancel="cancelRecording">
<uni-icons type="mic-filled" size="20" color="#fff"></uni-icons>
语音搜索
</view>
<!-- <view class="mic-icon mic-icon2" @click="scanCode">
<uni-icons type="scan" size="20" color="#fff"></uni-icons>
扫一扫
</view> -->
<!-- #endif -->
</view> </view>
<!-- 搜索列表 --> <!-- 搜索列表 -->
<view class="search_list" v-if="search_list.length"> <view class="search_list" v-if="search_list.length">
@ -85,7 +74,7 @@
<text>100g/{{ite.kcal}}kcal</text> <text>100g/{{ite.kcal}}kcal</text>
</view> </view>
</view> </view>
<view class="endtext" v-if="!lastPage || page >= lastPage"> 到底了看看别的吧 </view> <view class="endtext" v-if="!lastPage || page >= lastPage"> {{$t("msgBottom")}} </view>
</view> </view>
<!-- 购物车弹框 --> <!-- 购物车弹框 -->
<view class="wrapper activeList" v-if="isShop"> <view class="wrapper activeList" v-if="isShop">
@ -101,13 +90,13 @@
canvasId="search02" /> canvasId="search02" />
</view> </view>
<view class="center"> <view class="center">
摄入 {{$t("countIntake")}}
<text>{{foodInfo[0].today_intake}}</text> <text>{{foodInfo[0].today_intake}}</text>
<view class="unit">Kcal</view> <view class="unit">Kcal</view>
</view> </view>
</view> </view>
<view class="mubiao"> <view class="mubiao">
目标<text>{{foodInfo[0].suggestion}}</text>kcal {{$t("titleBody")}}<text>{{foodInfo[0].suggestion}}</text>kcal
</view> </view>
</view> </view>
<view class="right"> <view class="right">
@ -140,8 +129,8 @@
</view> </view>
</view> </view>
<view class="box_list_item" v-if="ActiveList.length"> <view class="box_list_item" v-if="ActiveList.length">
<view class="length"><text <view class="length">{{$t("total")}}<text
class="red">{{ActiveList.filter(ite => ite.meals_type == foodName).length}}</text>条记录 class="red">{{ActiveList.filter(ite => ite.meals_type == foodName).length}}</text>{{$t("records")}}
</view> </view>
<view class="item" v-for="(ite,ind) in ActiveList" :key="ind" <view class="item" v-for="(ite,ind) in ActiveList" :key="ind"
v-if="ite.meals_type==foodName"> v-if="ite.meals_type==foodName">
@ -158,7 +147,7 @@
</view> </view>
<view v-else class="nolist list"> <view v-else class="nolist list">
<icon class="iconfont icon-wancan"></icon> <icon class="iconfont icon-wancan"></icon>
<text>还没有添加食物</text> <text>{{$t('countNoFood')}}</text>
</view> </view>
</view> </view>
</view> </view>
@ -176,7 +165,7 @@
<image :src="activeType.pic_url" mode="aspectFill"></image> <image :src="activeType.pic_url" mode="aspectFill"></image>
<view class="info"> <view class="info">
<view class="name">{{activeType.name}}</view> <view class="name">{{activeType.name}}</view>
<view class="kcal">{{activeType.kcal}}千卡/100</view> <view class="kcal">{{activeType.kcal}}kcal/100</view>
</view> </view>
</view> </view>
</view> </view>
@ -203,8 +192,8 @@
<view class="foodDetail"> <view class="foodDetail">
<view class="foodContent"> <view class="foodContent">
<view class="tips"> <view class="tips">
<text>营养素</text> <text>{{$t('Nutrients')}}</text>
<text>{{(activeType.weight).toFixed(1)}}克含量</text> <text>{{(activeType.weight).toFixed(1)}}g{{$t('Content')}}</text>
</view> </view>
<view class="foodDetailList"> <view class="foodDetailList">
<view class="foodDetailItem" v-for="(item,index) in activeType.nutrients_list" <view class="foodDetailItem" v-for="(item,index) in activeType.nutrients_list"
@ -221,30 +210,6 @@
</view> </view>
</view> </view>
</view> </view>
<!-- 语音弹框 -->
<view class="wrapper" v-if="showAutoSearchDlg">
<view class="auto-search-dialog">
<view class="auto-search-inner">
<view class="voice-wave">
<view class="wave-bar"></view>
<view class="wave-bar"></view>
<view class="wave-bar"></view>
<view class="wave-bar"></view>
<view class="wave-bar"></view>
<view class="wave-bar"></view>
</view>
</view>
</view>
</view>
<!-- s扫一扫弹框 -->
<view class="wrapper wrapperScan" v-if="showScanCodeDlg">
<view class="auto-search-dialog" @click="showScanCodeDlg = false">
<view class="auto-search-inner">
<text>提示</text>
{{ScanCodeMsg}}
</view>
</view>
</view>
</view> </view>
</template> </template>
@ -252,9 +217,6 @@
import { import {
mapState mapState
} from "vuex"; } from "vuex";
// #ifdef MP-WEIXIN
const plugin = requirePlugin("WechatSI")
// #endif
import blueTooth from "@/components/foodIndex/bluetooth_food.vue" import blueTooth from "@/components/foodIndex/bluetooth_food.vue"
import qiunDataCharts from '@/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue'; import qiunDataCharts from '@/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue';
export default { export default {
@ -305,6 +267,9 @@
that.handleList() that.handleList()
that.showScanCodeDlg = false that.showScanCodeDlg = false
that.time = that.countFoodInfo.date that.time = that.countFoodInfo.date
uni.setNavigationBarTitle({
title: this.$t('titleCountSearch')
})
that.foodName = options.name that.foodName = options.name
}, },
watch: { watch: {
@ -318,25 +283,11 @@
deep: true deep: true
}, },
}, },
mounted() {
let that = this
// #ifdef MP-WEIXIN
that.voiceManager = plugin.getRecordRecognitionManager()
that.voiceManager.onStop = function(res) {
that.search_value = res.result.replace('。', '')
that.handleSerach()
}
that.voiceManager.onError = function(res) {
console.error("error msg", res.retcode)
}
that.voiceManager.stop()
// #endif
},
onReachBottom() { onReachBottom() {
let that = this let that = this
if (!this.lastPage || this.page >= this.lastPage) { if (!this.lastPage || this.page >= this.lastPage) {
uni.showToast({ uni.showToast({
title: '没有更多数据!', title: this.$t('noMoreData'),
icon: 'none' icon: 'none'
}) })
return return
@ -356,35 +307,6 @@
} }
}) })
}, },
scanCode() {
let that = this
uni.scanCode({
onlyFromCamera: true,
success: function(res) {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
uni.showLoading({
title: '搜索中'
});
that.$model.getPhotoSearch({
barcode: res.result,
}).then(res => {
uni.hideLoading();
console.log("1111111111111", res)
if (res.code != 0) {
that.ScanCodeMsg = res.msg
that.showScanCodeDlg = true
return
}
that.handleDetail(res.data)
})
},
fail: res => {
that.$api.msg("您已取消操作")
return
}
});
},
// //
handleToggle(name) { handleToggle(name) {
this.search_value = "" this.search_value = ""
@ -489,7 +411,7 @@
let that = this let that = this
that.search_list = [] that.search_list = []
if (that.search_value == "") { if (that.search_value == "") {
that.$tools.msg("输入关键字后搜索") that.$tools.msg(this.$t('searchkeywords'))
return return
} }
that.$model.getFoodSearch({ that.$model.getFoodSearch({
@ -527,7 +449,7 @@
handledelactive(ite) { handledelactive(ite) {
let that = this let that = this
uni.showModal({ uni.showModal({
content: `是否删除[${ite.name}]`, content: this.$t('WhetherTodelete') + ite.name,
success: (res) => { success: (res) => {
if (res.confirm) { if (res.confirm) {
this.$model.delCEatAction({ this.$model.delCEatAction({
@ -572,9 +494,9 @@
}, },
unitConversion(unit) { unitConversion(unit) {
if (unit == 'kcal') { if (unit == 'kcal') {
return '千卡' return 'kcal'
} else if (unit == 'g') { } else if (unit == 'g') {
return '' return 'g'
} }
return unit return unit
}, },

View File

@ -3,7 +3,7 @@
<!-- --> <!-- -->
<view class="kcal"> <view class="kcal">
<view class="set"> <view class="set">
<input type="digit" v-model="weight" placeholder="请输入" :focus="focus" @blur="handleBlur"> <input type="digit" v-model="weight" :placeholder="$t('verifyRecord')" :focus="focus" @blur="handleBlur">
<uni-icons v-if="weight!=''" type="close" size="24" class="uni-iocns" color="#999" <uni-icons v-if="weight!=''" type="close" size="24" class="uni-iocns" color="#999"
@click="handleclear"></uni-icons> @click="handleclear"></uni-icons>
<view class="num"> <view class="num">
@ -17,7 +17,7 @@
<!-- --> <!-- -->
<view class="kcal"> <view class="kcal">
<view class="text"> <view class="text">
营养占比 {{$t('countNutritionalProportion')}}
</view> </view>
<view class="slider" v-if="isShow"> <view class="slider" v-if="isShow">
<llt-slider-range :model-value="rangeValue" @change="handleChange" /> <llt-slider-range :model-value="rangeValue" @change="handleChange" />
@ -36,7 +36,7 @@
<text>{{ite}}</text> <text>{{ite}}</text>
</view> </view>
</view> </view>
<view class="subbtn" @click="handleEditKcal">保存</view> <view class="subbtn" @click="handleEditKcal">{{$t('btnSubmit')}}</view>
</view> </view>
</template> </template>
@ -133,7 +133,7 @@
handleEditKcal() { handleEditKcal() {
let that = this let that = this
if (that.weight == '' || Number(that.weight) <= 0) { if (that.weight == '' || Number(that.weight) <= 0) {
that.$tools.msg("请输入卡路里") that.$tools.msg(that.$t('verifyCalorie'))
return return
} }
that.$model.getCountSetUserKcal({ that.$model.getCountSetUserKcal({
@ -147,7 +147,7 @@
fat_p: that.fat_p, fat_p: that.fat_p,
}).then(res => { }).then(res => {
if (res.code == 0) { if (res.code == 0) {
that.$tools.msg("设置成功") that.$tools.msg(that.$t('msgSetSuccess'))
that.$store.dispatch('getUserInfo', { that.$store.dispatch('getUserInfo', {
aud_id: that.user.aud_id aud_id: that.user.aud_id
}) })

View File

@ -5,7 +5,7 @@
<view class="list" v-for="(item,ind) in infoList" :key="ind" @click="handleDetail(item)"> <view class="list" v-for="(item,ind) in infoList" :key="ind" @click="handleDetail(item)">
<view class="time">{{item.time}}</view> <view class="time">{{item.time}}</view>
<view class="kcal"> <view class="kcal">
<view>摄入卡路里<text>{{item.val}}</text>{{item.unit}}</view> <view>{{$t('countIntake')}}{{$t('kcal')}}<text>{{item.val}}</text>{{item.unit}}</view>
<view class="status"> <view class="status">
<text class="quan0" :style="'background:'+item.color"></text> <text class="quan0" :style="'background:'+item.color"></text>
{{item.describe}} {{item.describe}}
@ -13,10 +13,10 @@
<uni-icons type="forward" size="20" color="#666"></uni-icons> <uni-icons type="forward" size="20" color="#666"></uni-icons>
</view> </view>
</view> </view>
<view class="endtext" v-if="!lastPage || page >= lastPage"> 到底了看看别的吧 </view> <view class="endtext" v-if="!lastPage || page >= lastPage"> {{$t('msgBottom')}} </view>
<view v-if="!infoList.length" class="nolist"> <view v-if="!infoList.length" class="nolist">
<icon class="iconfont icon-wancan"></icon> <icon class="iconfont icon-wancan"></icon>
<text>还没有记录哦</text> <text>{{$t('msgNoMoreData')}}</text>
</view> </view>
</view> </view>
@ -46,6 +46,9 @@
}, },
onLoad() { onLoad() {
let that = this let that = this
uni.setNavigationBarTitle({
title: that.$t('titleHistory')
})
that.page = 1 that.page = 1
that.handleList() that.handleList()
}, },
@ -53,7 +56,7 @@
let that = this let that = this
if (!this.lastPage || this.page >= this.lastPage) { if (!this.lastPage || this.page >= this.lastPage) {
uni.showToast({ uni.showToast({
title: '没有更多数据!', title: that.$t('noMoreData'),
icon: 'none' icon: 'none'
}) })
return return

View File

@ -2,78 +2,74 @@
<view class="content"> <view class="content">
<view class="bg"></view> <view class="bg"></view>
<view class="top"> <view class="top">
<view class="language">
<picker mode="selector" @change="changeClickLanguage" :range="languageList" range-key="name"
:value="levelInd">
<view>
{{$t('titleLanguage')}}
<icon class="iconfont icon-arrow-down"></icon>
</view>
</picker>
</view>
<view class="logo">
<image src="../../static/logo2.png"></image> <image src="../../static/logo2.png"></image>
<text>Reedaw</text> <text>Reedaw</text>
</view> </view>
</view>
<view class="login box_shadow"> <view class="login box_shadow">
<view class="title">登录</view> <view class="title">{{$t("titleLogin")}}</view>
<view class="toggle cblue" @click="handleToggle"> <view class="toggle cblue" @click="handleToggle">
切换登录 {{$t("titleToggleLogin")}}
</view> </view>
<view class="editem"> <view class="editem">
<view class="item"> <view class="item">
<view class="text">手机号/邮箱</view> <view class="text">{{$t("infoEmail")}}</view>
<view class="input"> <view class="input">
<input v-model="phone" /> <input v-model="phone" />
</view> </view>
</view> </view>
<!-- 验证码登录 --> <!-- 验证码登录 -->
<view class="item " v-if="isCode"> <view class="item " v-if="isCode">
<view class="text">验证码</view> <view class="text">{{$t("titleCode")}}</view>
<view class="input yanzhengma"> <view class="input yanzhengma">
<input class="uni-input" v-model="code" /> <input class="uni-input" v-model="code" />
<button class="code" type="none" @click="handleCode" v-model="code" <button class="code" type="none" @click="handleCode" v-model="code"
:disabled="disabled">{{second<60 ? second+'S后重发':'获取验证码'}} :disabled="disabled">{{second<60 ? second+$t("titleSendCodeRetry"):$t("titleSendCode")}}
</button> </button>
</view> </view>
</view> </view>
<!-- 密码登录 --> <!-- 密码登录 -->
<view class="item " v-else> <view class="item " v-else>
<view class="text">密码</view> <view class="text">{{$t("titlePassword")}}</view>
<view class="input"> <view class="input">
<input class="uni-input" v-model="password" /> <input class="uni-input" v-model="password" />
</view> </view>
</view> </view>
<view class="forget " v-if="!isCode"> <view class="forget " v-if="!isCode">
<text @click="handlePassword('forgetPassword')">忘记密码?</text> <text @click="handlePassword('forgetPassword')">{{$t("titleForgotPassword")}}</text>
</view> </view>
</view> </view>
<view class="xieyi"> <view class="xieyi">
<checkbox-group @change="checkboxChange" class="group"> <checkbox-group @change="checkboxChange" class="group">
<label> <label>
<checkbox :value="1" style="transform:scale(0.7)" />阅读并同意 <checkbox :value="1" style="transform:scale(0.7)" />{{$t("titleAgreementText")}}
<!-- <text @click.stop @click="handleUserXieyi" class="blue">用户协议</text> --> <text @click.stop @click="handlexieyi" class="blue">{{$t("titleAgreementContntText")}}</text>
<text @click.stop @click="handlexieyi" class="blue">隐私协议</text>
</label> </label>
</checkbox-group> </checkbox-group>
</view> </view>
<view class="btnlogin" @click="handleTelLogin">登录</view> <view class="btnlogin" @click="handleTelLogin">{{$t("titleLogin")}}</view>
<view class="btngroup" @click="handlePassword('register')"> <view class="btngroup" @click="handlePassword('register')">
<text>注册</text> <text>{{$t("titleRegister")}}</text>
</view> </view>
</view> </view>
<!-- #ifdef MP-WEIXIN -->
<view class="wxbtn">
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" v-if="value==1">
<view>
<image src="../../static/phone.png"></image>
</view>
<text>手机号快捷登录</text>
</button>
<button v-else @click="handleIsTel">
<view>
<image src="../../static/phone.png"></image>
</view>
<text>手机号快捷登录</text>
</button>
</view>
<!-- #endif -->
</view> </view>
</template> </template>
<script> <script>
import {
mapState
} from "vuex";
export default { export default {
data() { data() {
return { return {
@ -87,49 +83,88 @@
loginCode: "" loginCode: ""
} }
}, },
computed: {
...mapState(["user", 'configInfo', "setLocale"]),
languageList() {
let that = this
let languageList = this.configInfo.language_arr
that.levelInd = languageList.findIndex(ite => ite.key == this.setLocale)
return languageList
}
},
onLoad() { onLoad() {
// #ifdef MP-WEIXIN let that = this
this.login() uni.setNavigationBarTitle({
// #endif title: that.$t('titleLogin')
})
}, },
methods: { methods: {
// //
checkboxChange(e) { checkboxChange(e) {
this.value = e.detail.value.length ? e.detail.value[0] : "0" this.value = e.detail.value.length ? e.detail.value[0] : "0"
}, },
//
changeClickLanguage(e) {
let that = this
let key = that.languageList[e.target.value].key
let val = that.languageList[e.target.value].val
that.levelInd = e.target.value
that.$model.getSetLanguage({
language: val,
}).then(res => {
that.$i18n.locale = key
uni.setStorageSync('language', key)
that.$store.commit('changeLocale', key)
that.$store.dispatch("getHomeConfig")
that.$tools.handleUserList()
that.handleTabBarItem()
})
},
handleTabBarItem() {
let that = this
uni.setTabBarItem({
index: 0,
text: that.$t('titleHome')
})
uni.setTabBarItem({
index: 1,
text: that.$t('titleCount')
})
uni.setTabBarItem({
index: 2,
text: that.$t('titleMe')
})
},
// //
handleTelLogin() { handleTelLogin() {
let that = this let that = this
let phoneType = that.phone.indexOf("@") !== -1
if (that.value == 0) { if (that.value == 0) {
that.$tools.msg("请先确认勾选协议") that.$tools.msg(that.$t("verifyAgreement"))
return return
} }
if (!phoneType && !(/^1[3456789]\d{9}$/.test(that.phone))) { if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg("请输入正确的手机号") that.$tools.msg(that.$t("verifyEmailCorrect"))
return
}
if (phoneType && !(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg("请输入正确的邮箱")
return return
} }
if (that.isCode && !that.code) { if (that.isCode && !that.code) {
that.$tools.msg("请输入验证码") that.$tools.msg(that.$t("verifyCode"))
return return
} }
if (!that.isCode && !that.password) { if (!that.isCode && !that.password) {
that.$tools.msg('请输入正确密码') that.$tools.msg(that.$t("verifyPassword"))
return return
} }
let val = that.languageList[that.levelInd].val
this.$model.getonlogin({ this.$model.getonlogin({
data: that.phone, data: that.phone,
validate_data: that.isCode ? that.code : that.password, validate_data: that.isCode ? that.code : that.password,
validate_type: that.isCode ? 'code' : 'password' validate_type: that.isCode ? 'code' : 'password',
language: val
}).then(res => { }).then(res => {
console.log("data", res.data) console.log("data", res.data)
that.$tools.msg(res.msg) that.$tools.msg(res.msg)
if (res.code != 0) return if (res.code != 0) return
that.$tools.msg("登录成功") that.$tools.msg(that.$t("msgLoginSuccess"))
uni.setStorageSync('token', res.data.token) uni.setStorageSync('token', res.data.token)
uni.setStorageSync('aan_id', res.data.aan_id) uni.setStorageSync('aan_id', res.data.aan_id)
that.$tools.handleUserList() that.$tools.handleUserList()
@ -143,13 +178,8 @@
// //
handleCode() { handleCode() {
let that = this let that = this
let phoneType = that.phone.indexOf("@") !== -1 if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
if (!phoneType && !(/^1[3456789]\d{9}$/.test(that.phone))) { that.$tools.msg(that.$t("verifyEmailCorrect"))
that.$tools.msg("请输入正确的手机号")
return
}
if (phoneType && !(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg("请输入正确的邮箱")
return return
} }
// //
@ -176,45 +206,10 @@
// //
handleIsTel() { handleIsTel() {
if (this.value == 0) { if (this.value == 0) {
this.$tools.msg("请先确认勾选协议") this.$tools.msg(that.$t("verifyAgreement"))
return return
} }
}, },
// code
login() {
let that = this
uni.login({
success(res) {
if (res.code) {
if (res.errMsg = "login:ok") {
that.loginCode = res.code
}
}
}
})
},
//
getPhoneNumber(res) {
const that = this
if (res.detail.errMsg == 'getPhoneNumber:ok') {
this.$model.getRegisterPhone({
code: that.loginCode,
encryptedData: res.detail.encryptedData,
iv: res.detail.iv,
}).then(res => {
if (res.code != 0) return
that.value = 1
uni.setStorageSync('token', res.data.token)
uni.setStorageSync('aan_id', res.data.aan_id)
that.$tools.handleUserList()
setTimeout(function() {
uni.reLaunch({
url: "/pages/index/index"
})
}, 1000)
})
}
},
handleToggle() { handleToggle() {
this.phone = "" this.phone = ""
this.isCode = !this.isCode this.isCode = !this.isCode

View File

@ -8,15 +8,15 @@
</view> </view>
<view class="list"> <view class="list">
<view class="item" @click="handleVersion"> <view class="item" @click="handleVersion">
<view class="left">版本更新</view> <view class="left">{{$t("titleVersionUpdate")}}</view>
<view class="right"> <view class="right">
<text class="new" v-if="version==-1">新版本{{phoneInfo.versionUrl.version}}</text> <text class="new" v-if="version==-1">{{$t("titleNewVersion")}}{{phoneInfo.versionUrl.version}}</text>
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</view> </view>
</view> </view>
<view class="item"> <view class="item">
<a href="https://tc.pcxbc.com/reedaw/privacy_policy" class="href"> <a href="https://tc.pcxbc.com/reedaw/privacy_policy" class="href">
<text class="left">隐私协议</text> <text class="left">{{$t("titleAgreementContntText")}}</text>
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</a> </a>
</view> </view>
@ -63,7 +63,7 @@
if (that.version == -1) { if (that.version == -1) {
if (that.phoneInfo.platform === 'android') { if (that.phoneInfo.platform === 'android') {
uni.setStorageSync('VERSION', that.phoneInfo.versionUrl.version) uni.setStorageSync('VERSION', that.phoneInfo.versionUrl.version)
let showLoading = plus.nativeUI.showWaiting('正在下载') let showLoading = plus.nativeUI.showWaiting(that.$t("msgDownloading"))
dtask = uni.downloadFile({ dtask = uni.downloadFile({
url: that.phoneInfo.versionUrl.url, url: that.phoneInfo.versionUrl.url,
success: (downloadRes) => { success: (downloadRes) => {
@ -84,13 +84,13 @@
}, },
fail: () => { fail: () => {
uni.showToast({ uni.showToast({
title: '升级失败', title: that.$t("msgUpgradeFail"),
icon: 'none' icon: 'none'
}); });
} }
}); });
dtask.onProgressUpdate((res) => { dtask.onProgressUpdate((res) => {
showLoading.setTitle(" 正在下载" + res.progress + "% "); showLoading.setTitle(that.$t("msgDownloading") + res.progress + "% ");
}); });
} else { } else {
plus.runtime.launchApplication({ plus.runtime.launchApplication({
@ -98,7 +98,7 @@
}) })
} }
} else { } else {
that.$tools.msg("已经是最新版本了!") that.$tools.msg(that.$t("msgLatestVersion"))
} }
}, },
// //

View File

@ -1,7 +1,7 @@
<template> <template>
<view class="common"> <view class="common">
<view class="add" @click="handleAddUser"> <view class="add" @click="handleAddUser">
<icon class="iconfont icon-tianjia"></icon>添加成员 <icon class="iconfont icon-tianjia"></icon>{{$t('titleManageAdd')}}
</view> </view>
<view class="box" v-if="familayList.lenght!=0"> <view class="box" v-if="familayList.lenght!=0">
<view class="list"> <view class="list">
@ -16,13 +16,13 @@
{{item.nickname}} {{item.nickname}}
</view> </view>
<view class="title2"> <view class="title2">
<text>{{item.gender==1?'男':'女'}}</text> <text>{{item.gender==1?$t('infoMan'):$t('infoWoman')}}</text>
<text>{{item.age}}</text> <text>{{item.age}}{{$t('infoAgeunit')}}</text>
</view> </view>
</view> </view>
</view> </view>
<view class="right" @click.stop> <view class="right" @click.stop>
<view class="blueBtn" @click="editorInfo(item)">编辑</view> <view class="blueBtn" @click="editorInfo(item)">{{$t('btnEdit')}}</view>
</view> </view>
</view> </view>
</uni-swipe-action-item> </uni-swipe-action-item>
@ -30,7 +30,7 @@
</view> </view>
</view> </view>
<view v-else> <view v-else>
没有数据了 {{$t("noMoreData")}}
</view> </view>
</view> </view>
</template> </template>
@ -61,20 +61,22 @@
let that = this let that = this
that.id = that.familayList[ind].id that.id = that.familayList[ind].id
uni.showModal({ uni.showModal({
title: '友情提示', title: that.$t('msgTitle'),
content: '确定删除该成员吗', content: that.$t("verifyDeleteUser"),
cancelText: that.$t('btnSancellation'),
confirmText: that.$t('btnConfirm'),
success: function(res) { success: function(res) {
if (res.confirm) { if (res.confirm) {
that.$model.getDelUser({ that.$model.getDelUser({
aud_id: that.id, aud_id: that.id,
}).then(res => { }).then(res => {
if (res.code != 0) return if (res.code != 0) return
that.$tools.msg("删除成功!"); that.$tools.msg(that.$t('msgDelete'));
that.familayList.splice(ind, 1) that.familayList.splice(ind, 1)
that.handleUserList() that.handleUserList()
}) })
} else if (res.cancel) { } else if (res.cancel) {
that.$tools.msg("您已取消删除!"); that.$tools.msg(that.$t('msgCancel'));
} }
} }
}); });

View File

@ -8,66 +8,66 @@
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">姓名</view> <view class="left">{{$t('infoNickname')}}</view>
<view class="right"> <view class="right">
<input name="name" type="text" v-model="memInfo.nickname" placeholder="请输入姓名" /> <input name="name" type="text" v-model="memInfo.nickname" :placeholder="$t('verifyRecord')" />
<uni-icons type="clear" color="#999" v-if="memInfo.nickname" @click="memInfo.nickname=''" <uni-icons type="clear" color="#999" v-if="memInfo.nickname" @click="memInfo.nickname=''"
size="20"></uni-icons> size="20"></uni-icons>
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">性别</view> <view class="left">{{$t('infoGender')}}</view>
<view class="right"> <view class="right">
<view class="radio"> <view class="radio">
<uni-icons :type="memInfo.gender==1?'checkbox-filled':'circle'" @click="memInfo.gender=1" <uni-icons :type="memInfo.gender==1?'checkbox-filled':'circle'" @click="memInfo.gender=1"
size="24" :color="memInfo.gender==1?'#fea606':'#dfdfdf'"></uni-icons> size="24" :color="memInfo.gender==1?'#fea606':'#dfdfdf'"></uni-icons>{{$t('infoMan')}}
</view> </view>
<view class="radio ml-15"> <view class="radio ml-15">
<uni-icons :type="memInfo.gender==2?'checkbox-filled':'circle'" @click="memInfo.gender=2" <uni-icons :type="memInfo.gender==2?'checkbox-filled':'circle'" @click="memInfo.gender=2"
size="24" :color="memInfo.gender==2?'#fea606':'#dfdfdf'"></uni-icons> size="24" :color="memInfo.gender==2?'#fea606':'#dfdfdf'"></uni-icons>{{$t('infoWoman')}}
</view> </view>
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">身高</view> <view class="left">{{$t('infoHeight')}}</view>
<view class="right"> <view class="right">
<input name="name" class="mr-5" type="digit" v-model="memInfo.height" placeholder="请输入身高" />CM <input name="name" class="mr-5" type="digit" v-model="memInfo.height" :placeholder="$t('verifyRecord')"/>CM
<uni-icons type="clear" color="#999" v-if="memInfo.height" @click="memInfo.height=''" <uni-icons type="clear" color="#999" v-if="memInfo.height" @click="memInfo.height=''"
size="20"></uni-icons> size="20"></uni-icons>
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">体重</view> <view class="left">{{$t('infoWeight')}}</view>
<view class="right"> <view class="right">
<input name="name" type="digit" class="mr-5" v-model="memInfo.weight" placeholder="请输入体重" />KG <input name="name" type="digit" class="mr-5" v-model="memInfo.weight" :placeholder="$t('verifyRecord')" />KG
<uni-icons type="clear" color="#999" v-if="memInfo.weight" @click="memInfo.weight=''" <uni-icons type="clear" color="#999" v-if="memInfo.weight" @click="memInfo.weight=''"
size="20"></uni-icons> size="20"></uni-icons>
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">出生日期</view> <view class="left">{{$t('infoBirthday')}}</view>
<view class="right"> <view class="right">
<picker mode="date" :end="endDate" @change="maskClick" <picker mode="date" :end="endDate" @change="maskClick"
:value="memInfo.birthday?memInfo.birthday:endDate" :fields="fields"> :value="memInfo.birthday?memInfo.birthday:endDate" :fields="fields">
<view class="uni-input">{{memInfo.birthday?memInfo.birthday:'请选择'}}</view> <view class="uni-input">{{memInfo.birthday?memInfo.birthday:$t('verifyPicker')}}}}</view>
<icon class="iconfont icon-arrow-down-bold"></icon> <icon class="iconfont icon-arrow-down-bold"></icon>
</picker> </picker>
</view> </view>
</view> </view>
<view class="lan border-bottom"> <view class="lan border-bottom">
<view class="left">活动系数</view> <view class="left">{{$t('infoActivityCoefficient')}}</view>
<view class="right"> <view class="right">
<picker mode="selector" @change="changeClickType" :range="activityLevel" range-key="name" <picker mode="selector" @change="changeClickType" :range="activityLevel" range-key="name"
:value="levelInd"> :value="levelInd">
<view> <view>
{{memInfo.activity_level?activityLevel[levelInd].name:'请选择'}} {{memInfo.activity_level?activityLevel[levelInd].name:$t('verifyRecord')}}}}
<icon class="iconfont icon-arrow-down-bold"></icon> <icon class="iconfont icon-arrow-down-bold"></icon>
</view> </view>
</picker> </picker>
</view> </view>
</view> </view>
</view> </view>
<view class="btn" @click="confirmInfo">提交</view> <view class="btn" @click="confirmInfo">{{$t('btnSubmit')}}</view>
</view> </view>
</template> </template>
<script> <script>
@ -78,8 +78,8 @@
data() { data() {
return { return {
sexItem: [ sexItem: [
"男", this.$t("infoMan"),
"女" this.$t("infoWoman")
], ],
memInfo: { memInfo: {
birthday: "", birthday: "",
@ -106,6 +106,9 @@
}, },
onLoad(options) { onLoad(options) {
let that = this let that = this
uni.setNavigationBarTitle({
title: that.$t('infoPersonalProfile')
})
if (options.info) { // if (options.info) { //
let info = JSON.parse(options.info) let info = JSON.parse(options.info)
that.memInfo = info that.memInfo = info
@ -124,30 +127,33 @@
confirmInfo() { confirmInfo() {
let that = this let that = this
if (!that.memInfo.nickname) { if (!that.memInfo.nickname) {
that.$tools.msg("请输入姓名") that.$tools.msg(that.$t('verifyNickName'))
return;
}
if (!that.memInfo.gender) {
this.$tools.msg(that.$t('verifyGender'))
return; return;
} }
if (!that.memInfo.height) { if (!that.memInfo.height) {
that.$tools.msg("请选择身高") that.$tools.msg(that.$t('verifyHeight'))
return; return;
} }
if (!that.memInfo.weight) { if (!that.memInfo.weight) {
that.$tools.msg("请选择体重") that.$tools.msg(that.$t('verifyWeight'))
return; return;
} }
if (!that.memInfo.birthday) { if (!that.memInfo.birthday) {
that.$tools.msg("请选择出生日期") that.$tools.msg(that.$t('verifyBirthday'))
return;
}
if (!that.memInfo.activity_level) {
that.$tools.msg("请选择活动系数")
return; return;
} }
// if (!that.memInfo.activity_level) {
// that.$tools.msg("")
// return;
// }
let https = that.isEdit ? that.$model.getEditUser(that.memInfo) : that.$model.getAddUser(that.memInfo) let https = that.isEdit ? that.$model.getEditUser(that.memInfo) : that.$model.getAddUser(that.memInfo)
return https.then(res => { return https.then(res => {
console.log("成功", res, that.isEdit, uni.getStorageSync('userid')) console.log("成功", res, that.isEdit, uni.getStorageSync('userid'))
if (res.code == 0) { if (res.code == 0) {
that.$tools.msg("提交成功");
if (!that.isEdit) { if (!that.isEdit) {
that.addID = res.aud_id that.addID = res.aud_id
} }
@ -214,7 +220,7 @@
}, },
// //
onsexArr(e) { onsexArr(e) {
this.memInfo.gender = this.sexItem[e.target.value] == "男" ? 1 : 2 this.memInfo.gender = this.sexItem[e.target.value] == this.$t("infoMan") ? 1 : 2
}, },
changeClickType(e) { changeClickType(e) {
this.levelInd = e.target.value this.levelInd = e.target.value

View File

@ -3,22 +3,22 @@
<view class="login"> <view class="login">
<view class="editem"> <view class="editem">
<view class="item"> <view class="item">
<view class="text">邮箱</view> <view class="text">{{$t("infoEmail")}}</view>
<view class="input"> <view class="input">
<input v-model="phone" placeholder="请输入邮箱" /> <input v-model="phone" :placeholder="$t('verifyEmail')" />
</view> </view>
</view> </view>
<view class="item "> <view class="item ">
<view class="text">验证码</view> <view class="text">{{$t("titleCode")}}</view>
<view class="input yanzhengma"> <view class="input yanzhengma">
<input class="uni-input" v-model="code" /> <input class="uni-input" v-model="code" />
<button class="code" type="none" @click="handleCode" v-model="code" <button class="code" type="none" @click="handleCode" v-model="code"
:disabled="disabled">{{second<60 ? second+'S后重发':'获取验证码'}} :disabled="disabled">{{second<60 ? second+$t("titleSendCodeRetry"):$t("titleSendCode")}}
</button> </button>
</view> </view>
</view> </view>
</view> </view>
<view class="btnlogin" @click="handleTelLogin">确认</view> <view class="btnlogin" @click="handleOutLogin">{{$t("btnConfirm")}}</view>
</view> </view>
</view> </view>
</template> </template>
@ -33,45 +33,51 @@
second: 60, second: 60,
} }
}, },
onLoad() {
let that = this
uni.setNavigationBarTitle({
title: that.$t('btnDeleteAccount')
})
},
methods: { methods: {
// //
handleTelLogin() { handleOutLogin() {
let that = this let that = this
if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) { uni.showModal({
that.$tools.msg("请输入正确的邮箱") title: that.$t("msgTitle"),
return confirmText: that.$t("btnDelete"),
} content: that.$t("verifyDeleteAccount"),
if (!that.code) { success: function(res) {
that.$tools.msg("请填写验证码") if (res.confirm) {
return that.$model.getDeleteAccount({
} code: that.code
that.$model.getAccountMsg({ }).then((res) => {
data: that.phone, if (res.code != 0) return
code: that.code, that.$tools.msg(that.$t('msgDelete'));
}).then(res => { uni.setStorageSync('token', null)
if (res.code != 0) { uni.setStorageSync('aan_id', null)
that.$tools.msg(res.msg) uni.clearStorageSync()
return setTimeout(() => {
} else { uni.reLaunch({
that.$tools.msg("设置成功!") url: "/pageTwo/login/login"
that.$store.commit('changeAccountNumber', {
my_email: that.phone
}) })
uni.redirectTo({ }, 3000);
url: "/body/setting/setting"
}) })
} else if (res.cancel) {
that.$tools.msg(that.$t("msgCancel"));
} }
}).catch(err => {}) },
})
}, },
// //
handleCode() { handleCode() {
let that = this let that = this
if (!that.phone) { if (!that.phone) {
that.$tools.msg("请输入邮箱") that.$tools.msg(that.$t("verifyEmail"))
return return
} }
if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) { if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg("请输入正确的邮箱") that.$tools.msg(that.$t("verifyEmailCorrect"))
return return
} }
// //
@ -103,16 +109,16 @@
.content { .content {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
background: #fff; background-color: #fff;
} }
.login { .login {
width: calc(100% - 30px); width: calc(100% - 60rpx);
height: auto; height: auto;
background: #fff; background: #fff;
border-radius: 10px; border-radius: 20rpx;
padding: 15px; padding: 30rpx;
background-color: #fff;
z-index: 99; z-index: 99;
.title { .title {
@ -120,7 +126,7 @@
color: #333; color: #333;
font-size: 40rpx; font-size: 40rpx;
font-weight: bold; font-weight: bold;
margin-bottom: 15px; margin-bottom: 30rpx;
} }
@ -136,34 +142,36 @@
.item { .item {
width: 100%; width: 100%;
display: flex; display: flex;
flex-wrap: wrap;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 15px; margin-bottom: 30rpx;
.text { .text {
width: 80px; width: 100%;
height: 40px; height: 80rpx;
line-height: 40px; line-height: 80rpx;
font-size: 32rpx; font-size: 32rpx;
font-weight: bold;
} }
.input { .input {
width: calc(100% - 100px); width: 100%;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
display: flex; display: flex;
position: relative; position: relative;
border: #dfdfdf 1px solid; border: #dfdfdf 1px solid;
border-radius: 5px; border-radius: 5px;
padding: 0 10px; padding: 0 20rpx;
background-color: #f7f7f7; background-color: #f7f7f7;
} }
input { input {
height: 40px; height: 80rpx;
line-height: 40px; line-height: 80rpx;
position: absolute; position: absolute;
left: 10px; left: 20rpx;
right: 0px; right: 0px;
z-index: 88; z-index: 88;
font-size: 32rpx; font-size: 32rpx;
@ -171,18 +179,19 @@
.yanzhengma { .yanzhengma {
input { input {
right: 120px; right: 180px;
font-size: 32rpx; font-size: 32rpx;
} }
} }
} }
.code { .code {
width: 110px; color: #333;
width: 180px;
background: #dfdfdf; background: #dfdfdf;
font-size: 32rpx; font-size: 14px;
margin: 0; margin: 0;
line-height: 40px; line-height: 80rpx;
border-radius: 5px; border-radius: 5px;
text-align: center; text-align: center;
position: absolute; position: absolute;
@ -197,12 +206,12 @@
.btnlogin { .btnlogin {
width: 100%; width: 100%;
margin: 15px 0; margin: 30rpx 0;
height: 42px; height: 42px;
line-height: 42px; line-height: 42px;
background: $btncolor; background: $btncolor;
font-weight: 700; font-weight: 700;
border-radius: 15px; border-radius: 30rpx;
text-align: center; text-align: center;
color: #fff !important; color: #fff !important;
} }

View File

@ -3,19 +3,34 @@
<view class="login"> <view class="login">
<view class="editem"> <view class="editem">
<view class="item"> <view class="item">
<view class="text">密码</view> <view class="text">{{$t("infoEmail")}}</view>
<view class="input"> <view class="input">
<input class="uni-input" v-model="password" placeholder="请输入密码" /> <input v-model="phone" :placeholder="$t('verifyEmail')" />
</view> </view>
</view> </view>
<view class="item "> <view class="item ">
<view class="text">确认密码</view> <view class="text">{{$t("titleCode")}}</view>
<view class="input yanzhengma">
<input class="uni-input" v-model="code" />
<button class="code" type="none" @click="handleCode" v-model="code"
:disabled="disabled">{{second<60 ? second+$t("titleSendCodeRetry"):$t("titleSendCode")}}
</button>
</view>
</view>
<view class="item">
<view class="text">{{$t('titlePassword')}}</view>
<view class="input"> <view class="input">
<input class="uni-input" v-model="password2" placeholder="请输入确认密码" /> <input class="uni-input" v-model="password" :placeholder="$t('verifyPassword')" />
</view>
</view>
<view class="item">
<view class="text">{{$t('titleConfirmPassword')}}</view>
<view class="input">
<input class="uni-input" v-model="password2" :placeholder="$t('verifyPasswordTwo')" />
</view> </view>
</view> </view>
</view> </view>
<view class="btnlogin" @click="handleTelLogin">确认</view> <view class="btnlogin" @click="handleTelLogin">{{$t('btnSubmit')}}</view>
</view> </view>
</view> </view>
</template> </template>
@ -26,26 +41,45 @@
return { return {
password: "", password: "",
password2: "", password2: "",
phone: "",
code: "",
disabled: false,
second: 60,
} }
}, },
onLoad() {}, onLoad() {
let that = this
uni.setNavigationBarTitle({
title: that.$t('titlePasswordEdit')
})
},
methods: { methods: {
// //
handleTelLogin() { handleTelLogin() {
let that = this let that = this
if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg(that.$t("verifyEmailCorrect"))
return
}
if (!that.code) {
that.$tools.msg(that.$t("verifyCode"))
return
}
if (!that.password) { if (!that.password) {
that.$tools.msg("请填写密码") that.$tools.msg(that.$t('verifyPassword'))
return return
} }
if (!that.password2) { if (!that.password2) {
that.$tools.msg("请确认密码") that.$tools.msg(that.$t('verifyPasswordTwo'))
return return
} }
if (that.password2 != that.password) { if (that.password2 != that.password) {
that.$tools.msg("请确认两次密码填写一致") that.$tools.msg(that.$t('verifyPasswordCorrect'))
return return
} }
that.$model.getAccountPassword({ that.$model.getAccountPassword({
data: that.phone,
code: that.code,
password: that.password, password: that.password,
c_password: that.password2, c_password: that.password2,
}).then(res => { }).then(res => {
@ -53,10 +87,9 @@
if (res.code != 0) { if (res.code != 0) {
that.$tools.msg(res.msg) that.$tools.msg(res.msg)
} else { } else {
that.$tools.msg("密码设置成功,请重新登录") that.$tools.msg(that.$t('msgSetSuccess'))
that.$model.getloginOut({}).then((res) => { that.$model.getloginOut({}).then((res) => {
if (res.code != 0) return if (res.code != 0) return
console.log('确定退出', res)
uni.setStorageSync('token', null) uni.setStorageSync('token', null)
uni.setStorageSync('aan_id', null) uni.setStorageSync('aan_id', null)
uni.clearStorageSync() uni.clearStorageSync()
@ -72,6 +105,37 @@
} }
}).catch(err => {}) }).catch(err => {})
}, },
//
handleCode() {
let that = this
if (!that.phone) {
that.$tools.msg(that.$t("verifyEmail"))
return
}
if (!(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(that.phone))) {
that.$tools.msg(that.$t("verifyEmailCorrect"))
return
}
//
that.$model.getSendCode({
data: that.phone,
}).then(res => {
console.log(res)
if (res.code != 0) {
that.$tools.msg(res.msg)
return
}
that.disabled = true
let interval = setInterval(() => {
--that.second
}, 1000)
setTimeout(() => {
clearInterval(interval)
that.disabled = false
that.second = 60
}, 60000)
}).catch(err => {})
},
} }
} }
</script> </script>
@ -80,16 +144,15 @@
.content { .content {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
background: #fff; background-color: #fff;
} }
.login { .login {
width: calc(100% - 30px); width: calc(100% - 60rpx);
height: auto; height: auto;
background: #fff; background: #fff;
border-radius: 10px; border-radius: 20rpx;
padding: 15px; padding: 30rpx;
background-color: #fff;
z-index: 99; z-index: 99;
.editem { .editem {
@ -104,49 +167,70 @@
.item { .item {
width: 100%; width: 100%;
display: flex; display: flex;
flex-wrap: wrap;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 15px; margin-bottom: 20rpx;
.text { .text {
width: 80px; width: 100%;
height: 40px; height: 80rpx;
line-height: 40px; line-height: 80rpx;
font-size: 32rpx; font-size: 32rpx;
font-weight: bold;
} }
.input { .input {
width: calc(100% - 100px); width: 100%;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
display: flex; display: flex;
position: relative; position: relative;
border: #dfdfdf 1px solid; border: #dfdfdf 1px solid;
border-radius: 5px; border-radius: 5px;
padding: 0 10px; padding: 0 20rpx;
background-color: #f7f7f7; background-color: #f7f7f7;
} }
input { input {
height: 40px; height: 80rpx;
line-height: 40px; line-height: 80rpx;
position: absolute; position: absolute;
left: 10px; left: 20rpx;
right: 0px; right: 0px;
z-index: 88; z-index: 88;
font-size: 28rpx; font-size: 28rpx;
} }
.yanzhengma {
input {
right: 180px;
font-size: 32rpx;
} }
} }
}
}
.code {
color: #333;
position: absolute;
right: 0;
top: 0;
height: 35px;
font-size: 14px;
box-sizing: border-box;
width: 180px;
z-index: 999;
}
.btnlogin { .btnlogin {
width: 100%; width: 100%;
margin: 15px 0; margin: 30rpx 0;
height: 42px; height: 42px;
line-height: 42px; line-height: 42px;
background: $btncolor; background: $btncolor;
font-weight: 700; font-weight: 700;
border-radius: 15px; border-radius: 30rpx;
text-align: center; text-align: center;
color: #fff !important; color: #fff !important;
} }

View File

@ -3,22 +3,22 @@
<view class="login"> <view class="login">
<view class="editem"> <view class="editem">
<view class="item"> <view class="item">
<view class="text">手机号</view> <view class="text">{{$t('infoMobile')}}</view>
<view class="input"> <view class="input">
<input v-model="phone" placeholder="请输入手机号" /> <input v-model="phone" :placeholder="$t('verifyMobile')" />
</view> </view>
</view> </view>
<view class="item "> <view class="item ">
<view class="text">验证码</view> <view class="text">{{$t('titleCode')}}</view>
<view class="input yanzhengma"> <view class="input yanzhengma">
<input class="uni-input" v-model="code" /> <input class="uni-input" v-model="code" />
<button class="code" type="none" @click="handleCode" v-model="code" <button class="code" type="none" @click="handleCode" v-model="code"
:disabled="disabled">{{second<60 ? second+'S后重发':'获取验证码'}} :disabled="disabled">{{second<60 ? second+$t('titleSendCodeRetry'):$t('titleSendCode')}}
</button> </button>
</view> </view>
</view> </view>
</view> </view>
<view class="btnlogin" @click="handleTelLogin">确认</view> <view class="btnlogin" @click="handleTelLogin">{{$t('btnSubmit')}}</view>
</view> </view>
</view> </view>
</template> </template>
@ -33,16 +33,22 @@
second: 60, second: 60,
} }
}, },
onLoad() {
let that = this
uni.setNavigationBarTitle({
title: that.$t('titlePhone')
})
},
methods: { methods: {
// //
handleTelLogin() { handleTelLogin() {
let that = this let that = this
if (!(/^1[3456789]\d{9}$/.test(that.phone))) { if (!(/^1[3456789]\d{9}$/.test(that.phone))) {
that.$tools.msg("请输入正确的手机号") that.$tools.msg(that.$t('verifyMobileCorrect'))
return return
} }
if (!that.code) { if (!that.code) {
that.$tools.msg("请填写验证码") that.$tools.msg(that.$t('verifyCode'))
return return
} }
that.$model.getAccountMsg({ that.$model.getAccountMsg({
@ -53,13 +59,15 @@
that.$tools.msg(res.msg) that.$tools.msg(res.msg)
return return
} else { } else {
that.$tools.msg("设置成功!") that.$tools.msg(that.$t('msgSetSuccess'))
that.$store.commit('changeAccountNumber', { that.$store.commit('changeAccountNumber', {
my_tel: that.phone my_tel: that.phone
}) })
setTimeout(function() {
uni.redirectTo({ uni.redirectTo({
url: "/body/setting/setting" url: "/body/setting/setting"
}) })
}, 1000)
} }
}).catch(err => {}) }).catch(err => {})
}, },
@ -67,17 +75,16 @@
handleCode() { handleCode() {
let that = this let that = this
if (!that.phone) { if (!that.phone) {
that.$tools.msg("请输入手机号") that.$tools.msg(that.$t('verifyMobile'))
return return
} }
if (!(/^1[3456789]\d{9}$/.test(that.phone))) { if (!(/^1[3456789]\d{9}$/.test(that.phone))) {
that.$tools.msg("请输入正确的手机号") that.$tools.msg(that.$t('verifyMobileCorrect'))
return return
} }
// //
that.$model.getSendCode({ that.$model.getSendCode({
data: that.phone, data: that.phone,
// type: that.type
}).then(res => { }).then(res => {
console.log(res) console.log(res)
if (res.code != 0) { if (res.code != 0) {

View File

@ -1,37 +1,33 @@
<template> <template>
<view class="content"> <view class="content">
<view class="caritem"> <view class="caritem">
<view class="text">头像</view> <view class="text">{{$t('infoAvatar')}}</view>
<image :src="user.head_pic" class="image"></image> <image :src="user.head_pic" class="image"></image>
</view> </view>
<view class="caritem"> <view class="caritem">
<view class="text">昵称</view> <view class="text">{{$t('infoNickname')}}</view>
<view class="text_r"> <view class="text_r">
<text v-if="!isEdit">{{user.nickname}}</text> <text v-if="!isEdit">{{user.nickname}}</text>
<input v-else type="text" v-model='nickname' @blur="handleBlur" /> <input v-else type="text" v-model='nickname' @blur="handleBlur" />
<uni-icons type="compose" color="#FEC407" @click="isEdit=true" class="ml-10" size="22"></uni-icons> <uni-icons type="compose" color="#FEC407" @click="isEdit=true" class="ml-10" size="22"></uni-icons>
</view> </view>
</view> </view>
<view class="caritem" @click="navTo('/body/setting/phone')"> <!-- <view class="caritem" @click="navTo('/body/setting/phone')">
<view class="text">手机号</view> <view class="text">手机号</view>
<view class="text_r"> <view class="text_r">
<text>{{user.my_tel}}</text> <text>{{user.my_tel}}</text>
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</view> </view>
</view> -->
<view class="caritem" @click="navTo('/body/setting/password')">
<view class="text">{{$t('titleSetPassword')}}</view>
<uni-icons type="right"></uni-icons>
</view> </view>
<view class="caritem" @click="navTo('/body/setting/email')"> <view class="caritem" @click="navTo('/body/setting/email')">
<view class="text">邮箱</view> <view class="text">{{$t('btnDeleteAccount')}}</view>
<view class="text_r"> <uni-icons type="forward" size="20" color="#666"></uni-icons>
<text>{{user.my_email}}</text>
<uni-icons type="right"></uni-icons>
</view> </view>
</view> </view>
<view class="caritem" @click="navTo('/body/setting/password')">
<view class="text">设置密码</view>
<uni-icons type="right"></uni-icons>
</view>
<view class="btn mb-15" @click="handleOutLogin">删除账号</view>
</view>
</template> </template>
<script> <script>
@ -53,32 +49,6 @@
} }
}, },
methods: { methods: {
handleOutLogin() {
let that = this
uni.showModal({
title: '友情提示',
confirmText: '删除',
content: '删除成功后,该账号的所有关联信息将被清空且无法找回,是否删除?',
success: function(res) {
if (res.confirm) {
that.$model.getdeleteAccount({}).then((res) => {
if (res.code != 0) return
that.$tools.msg("删除成功!");
uni.setStorageSync('token', null)
uni.setStorageSync('aan_id', null)
uni.clearStorageSync()
setTimeout(() => {
uni.reLaunch({
url: "/body/login/login"
})
}, 3000);
})
} else if (res.cancel) {
that.$tools.msg("您已取消操作!");
}
},
})
},
// //
handleBlur() { handleBlur() {
let that = this let that = this

163
language/ar.json Normal file
View File

@ -0,0 +1,163 @@
{
"msgTitle": "نصيحة ودية",
"msgUpgradeFail": "فشل الترقية",
"msgDownloading": "جاري التحميل",
"msgLatestVersion": "هي بالفعل أحدث إصدار!",
"msgCancel": "لقد ألغيت العملية!",
"msgLoginSuccess": "تم تسجيل الدخول بنجاح!",
"msgDelete": "تم الحذف بنجاح",
"msgSetSuccess": "تم الإعداد بنجاح",
"msgBottom": "النهاية، انتقل إلى شيء آخر",
"msgNoMoreData": "لا توجد المزيد من البيانات!",
"msgSetPasswordSuccess": "تم تعيين كلمة المرور بنجاح، ادخل إلى البرنامج!",
"msgAddUser": "لا يوجد أعضاء حالياً، يرجى إضافتهم أولاً",
"verifyNickName": "الرجاء إدخال الاسم المستعار",
"verifyNotOptional": "التاريخ المستقبلي غير قابل للاختيار",
"verifyDate": "يرجى اختيار تاريخ القياس",
"verifyBirthday": "الرجاء اختيار تاريخ الميلاد",
"verifyHeight": "من فضلك أدخل الطول",
"verifyWeight": "الرجاء إدخال الوزن",
"verifyGender": "الرجاء اختيار الجنس",
"verifyBontrast": "يرجى اختيار البيانات",
"verifyBodyDate": "الرجاء اختيار الوقت الصحيح",
"verifyRecord": "الرجاء إدخال",
"verifyPicker": "الرجاء الاختيار",
"verifyAccount": "يرجى إدخال رقم الهاتف أو البريد الإلكتروني الصحيح",
"verifyEmail": "الرجاء إدخال البريد الإلكتروني",
"verifyEmailCorrect": "من فضلك أدخل البريد الإلكتروني الصحيح",
"verifyMobile": "الرجاء إدخال رقم الهاتف",
"verifyMobileCorrect": "الرجاء إدخال رقم الهاتف الصحيح",
"verifyCode": "กรุณาป้อนรหัสยืนยัน",
"verifyPassword": "الرجاء إدخال كلمة المرور",
"verifyPasswordTwo": "الرجاء إدخال كلمة المرور المؤكدة",
"verifyPasswordCorrect": "يرجى التأكد من أن كلمة المرور المكتوبة مطابقة في المرةين",
"verifyAgreement": "يرجى تأكيد واختيار الاتفاقية أولاً",
"verifyOutLogin": "هل ترغب في تسجيل الخروج؟",
"verifyDeleteUser": "هل تريد حذف هذا العضو؟",
"verifyDeleteHistory": "هل تريد حذف سجل القياس الحالي؟",
"verifyDeleteAccount": "بعد الحذف بنجاح، سيتم مسح جميع المعلومات المرتبطة بهذه الحساب ولا يمكن استعادتها، هل ترغب في الحذف؟",
"btnConfirm": "تأكيد",
"btnSubmit": "إرسال",
"btnSancellation": "إلغاء",
"btnContinue": "استمر",
"btnBack": "عودة",
"btnDelete": "حذف",
"ConnectionTimeout": "انتهت مهلة الاتصال، انقر لإعادة الاتصال",
"Measuring": "في القياس، يرجى وضع الطعام على الميزان",
"Weight": "الوزن",
"RecordWeight": "يرجى إدخال وزن الطعام",
"SearchBluetooth": "البحث عن البلوتوث جاري",
"Remeasure": "البيانات غير طبيعية، يرجى إعادة القياس!",
"reset": "البيانات غير طبيعية، يرجى إعادة القياس بعد معاودة الصفر!",
"Disconnect": "قطع الاتصال",
"remeasure": "إعادة القياس",
"resetBtn": "إعادة الضبط",
"UnitBtn": "وحدة",
"SaveResult": "حفظ",
"titleHome": "الصفحة الرئيسية",
"titleMenu": "وصفة",
"titleMenuAdd": "إضافة الوصفة",
"titleMenuSearch": "البحث عن وصفات",
"titleCount": "حساب الطعام",
"titleCountList": "مستودع المكونات",
"titleCustomKcal": "سعرات حرارية مخصصة",
"titleEveryMeal": "تفاصيل الوجبة",
"titleCountSearch": "البحث عن المكونات",
"titleeveryDay": "تحليل التغذية",
"titleMe": "لي",
"titleDetail": "التفاصيل",
"titleBody": "الهدف",
"titleHistory": "سجل الأكل",
"titlePhone": "ربط رقم الهاتف",
"titleEmail": "ربط البريد الإلكتروني",
"titlePasswordEdit": "تغيير كلمة المرور",
"titleSet": "إعداد",
"titleDate": "تاريخ",
"titleMember": "المواد",
"titleManage": "إدارة الأعضاء",
"titleManageAdd": "إضافة عضو",
"titleAboutUs": "معلومات عنا",
"titleSetPassword": "تعيين كلمة المرور",
"titlePassword": "كلمة المرور",
"titleConfirmPassword": "تأكيد كلمة المرور",
"titleForgotPassword": "نسيت كلمة المرور",
"titleCode": "رمز التحقق",
"titleLanguage": "اللغة",
"titleSendCode": "الحصول على رمز التحقق",
"titleSendCodeRetry": "إعادة إرسال بعد S",
"titleLogin": "تسجيل الدخول",
"titleRegister": "التسجيل",
"titleToggleLogin": "التبديل إلى تسجيل الدخول",
"titleAccountText": "رقم الهاتف/البريد الإلكتروني",
"titleAgreementText": "القراءة والموافقة",
"titleAgreementContntText": "اتفاقية الخصوصية",
"titleVersionUpdate": "تحديث الإصدار",
"titleNewVersion": "النسخة الجديدة",
"infoActivityCoefficient": "معامل النشاط",
"infoPersonalProfile": "الملف الشخصي",
"infoMyRecipes": "وصفاتي",
"infoMyCollection": "مجموعتي",
"infoAvatar": "صورة الملف الشخصي",
"infoNickname": "الاسم المستعار",
"infoMobile": "رقم الهاتف",
"infoEmail": "البريد الإلكتروني",
"infoAge": "العمر",
"infoAgeunit": "سنة",
"infoGender": "الجنس",
"infoMan": "رجل",
"infoWoman": "أنثى",
"infoUnknown": "مجهول",
"infoBirthday": "تاريخ الميلاد",
"infoHeight": "الطول",
"infoWeight": "الوزن",
"btnEdit": "تحرير",
"btnAdd": "إضافة",
"btnDetail": "عرض التفاصيل",
"btnDeleteAccount": "حذف الحساب",
"btnLogOut": "تسجيل الخروج",
"countIntake": "الاستهلاك",
"countCalorieIntake": "معدل استهلاك السعرات الحرارية",
"countMealdetails": "تفاصيل الوجبة",
"countAddFood": "إضافة الطعام",
"countNutritionalProportion": "نسبة التغذية",
"countComponentStatistics": "إحصاء المكونات",
"countCalorieAnalysis": "تحليل السعرات الحرارية",
"countNutrientElementEnergyProportion": "نسبة الطاقة للمغذيات",
"countNutritionClassification": "تصنيف التغذية",
"countNutritionElementRankingList": "ترتيب العناصر الغذائية",
"countFoodTypes": "أنواع الطعام",
"total": "ما مجموعه",
"records": "السجلات",
"Search": "البحث",
"VoiceSearch": "بحث صوتي",
"Save": "حفظ",
"noMoreData": "لا مزيد من البيانات",
"HistoricalSearch": "بحث تاريخي",
"wantSearch": "أعتقد أنك تريد تفتيش",
"verifyCalorie": "يرجى إدخال السعرات الحرارية",
"kcal": "السعرات الحرارية",
"countNoFood": "لا يوجد طعام",
"msgLoginTips": "انظر المزيد بعد تسجيل الدخول",
"Nutrients": "مغذيات",
"Content": "المحتوى",
"CaloriesAndnutrients": "السعرات الحرارية والتغذية",
"ImproveInformation": "تحسين المعلومات",
"WhetherTodelete": "هل حذف",
"BusinessCooperation": "التعاون التجاري",
"verifyActivityCoefficient": "يرجى تحديد معامل النشاط",
"devicesTips":"لم يتم تسجيل الجهاز، يرجى التواصل مع البائع لإجراء التحقق من النظام",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

162
language/de.json Normal file
View File

@ -0,0 +1,162 @@
{
"msgTitle": "Freundlicher Hinweis",
"msgUpgradeFail": "Aktualisierung fehlgeschlagen",
"msgDownloading": "Wird heruntergeladen",
"msgLatestVersion": "Es ist bereits die neueste Version!",
"msgCancel": "Sie haben die Aktion abgebrochen!",
"msgLoginSuccess": "Anmeldung erfolgreich!",
"msgDelete": "Erfolgreich gelöscht",
"msgSetSuccess": "Erfolgreich eingestellt",
"msgBottom": "Ende, schau dir etwas anderes an.",
"msgNoMoreData": "Keine weiteren Daten mehr!",
"msgSetPasswordSuccess": "Passwort erfolgreich gesetzt, gehen Sie in das Programm!",
"msgAddUser": "Keine Mitglieder vorhanden, bitte fügen Sie zunächst hinzu",
"verifyNickName": "Bitte geben Sie einen Spitznamen ein",
"verifyNotOptional": "Zukünftige Daten können nicht ausgewählt werden",
"verifyDate": "Bitte wählen Sie das Messdatum aus",
"verifyBirthday": "Bitte wählen Sie das Geburtsdatum aus",
"verifyHeight": "Bitte geben Sie Ihre Körpergröße ein.",
"verifyWeight": "Geben Sie Ihr Gewicht ein.",
"verifyGender": "Bitte wählen Sie Ihr Geschlecht",
"verifyBontrast": "Bitte wählen Sie Daten aus",
"verifyBodyDate": "Bitte wählen Sie die richtige Zeit aus",
"verifyRecord": "Bitte eingeben",
"verifyPicker": "Bitte wählen Sie",
"verifyAccount": "Bitte geben Sie eine korrekte Handynummer oder E-Mail-Adresse ein",
"verifyEmail": "Bitte geben Sie Ihre E-Mail ein",
"verifyEmailCorrect": "Bitte geben Sie eine korrekte E-Mail-Adresse ein.",
"verifyMobile": "Bitte geben Sie die Handynummer ein.",
"verifyMobileCorrect": "Bitte geben Sie die korrekte Handynummer ein.",
"verifyCode": "Bitte geben Sie den Sicherheitscode ein.",
"verifyPassword": "Bitte geben Sie das Passwort ein",
"verifyPasswordTwo": "Bitte geben Sie das Passwort zur Bestätigung ein",
"verifyPasswordCorrect": "Bitte bestätigen Sie, dass die beiden Passwörter übereinstimmen.",
"verifyAgreement": "Bitte bestätigen und das Abkommen ankreuzen.",
"verifyOutLogin": "Sollen Sie sich abmelden?",
"verifyDeleteUser": "Soll dieser Mitglied gelöscht werden?",
"verifyDeleteHistory": "Sollen die aktuellen Messaufzeichnungen gelöscht werden?",
"verifyDeleteAccount": "Nach erfolgreicher Löschung werden alle mit diesem Konto verbundenen Informationen gelöscht und können nicht wiederhergestellt werden. Möchten Sie das Konto löschen?",
"btnConfirm": "Bestätigung",
"btnSubmit": "einreichen",
"btnSancellation": "stornieren",
"btnContinue": "fortsetzen",
"btnBack": "Zurückkehren",
"btnDelete": "löschen",
"ConnectionTimeout": "Verbindungszeitüberschreitung, klicken Sie auf erneute Verbindung",
"Measuring": "Während der Messung, legen Sie das Essen auf die Waage.",
"Weight": "Gewicht",
"RecordWeight": "Geben Sie das Gewicht der Lebensmittel ein.",
"SearchBluetooth": "Bluetooth-Suche läuft",
"Remeasure": "Daten sind abnorm, bitte messen Sie neu!",
"reset": "Datenanomalie, bitte zählen Sie zurück und messen Sie neu!",
"Disconnect": "Verbindung trennen",
"remeasure": "Neue Messung",
"resetBtn": "Nullsetzen",
"UnitBtn": "Einheit",
"SaveResult": "speichern",
"titleHome": "Startseite",
"titleMenu": "Rezept",
"titleMenuAdd": "Rezept hinzufügen",
"titleMenuSearch": "Rezepte suchen",
"titleCount": "Essensplanung",
"titleCountList": "Zutatenlager",
"titleCustomKcal": "Benutzerdefinierte Kalorien",
"titleEveryMeal": "Detaillierte Speiseinformationen",
"titleCountSearch": "Zutaten-Suche",
"titleeveryDay": "Ernährungsanalyse",
"titleMe": "mein",
"titleDetail": "Einzelheiten",
"titleBody": "Ziel",
"titleHistory": "Essensaufzeichnung",
"titlePhone": "Handynummer binden",
"titleEmail": "E-Mail-Bindung",
"titlePasswordEdit": "Passwort ändern",
"titleSet": "Einstellung",
"titleDate": "Datum",
"titleMember": "Daten",
"titleManage": "Mitgliedermanagement",
"titleManageAdd": "Mitglied hinzufügen",
"titleAboutUs": "Über uns",
"titleSetPassword": "Passwort festlegen",
"titlePassword": "Passwort",
"titleConfirmPassword": "Passwort bestätigen",
"titleForgotPassword": "Passwort vergessen",
"titleCode": "Bestätigungscode",
"titleLanguage": "Sprache.",
"titleSendCode": "CAPTCHA-Code abrufen",
"titleSendCodeRetry": "Nach S erneut senden",
"titleLogin": "Anmelden",
"titleRegister": "Registrierung",
"titleToggleLogin": "Anmeldungswechsel",
"titleAccountText": "Handynummer/E-Mail",
"titleAgreementText": "Lesen und zustimmen",
"titleAgreementContntText": "Datenschutzrichtlinie",
"titleVersionUpdate": "Versionsupdate",
"titleNewVersion": "Neue Version",
"infoActivityCoefficient": "Aktivitätskoeffizient",
"infoPersonalProfile": "Persönliche Daten",
"infoMyRecipes": "Mein Rezeptbuch",
"infoMyCollection": "Meine Sammlung",
"infoAvatar": "Profilbild",
"infoNickname": "Spitzname",
"infoMobile": "Handynummer",
"infoEmail": "E-Mail",
"infoAge": "Alter",
"infoAgeunit": "Jahr",
"infoGender": "Geschlecht",
"infoMan": "Mann",
"infoWoman": "Frau",
"infoUnknown": "Unbekannt",
"infoBirthday": "Geburtsdatum",
"infoHeight": "Körpergröße",
"infoWeight": "Körpergewicht",
"btnEdit": "Redaktion",
"btnDelete": "löschen",
"btnAdd": "hinzufügen",
"btnDetail": "Details anzeigen",
"btnDeleteAccount": "Konto löschen",
"btnLogOut": "Ausloggen",
"countIntake": "Aufnahme",
"countCalorieIntake": "Wärmeaufnahme",
"countMealdetails": "Essensdetails",
"countAddFood": "Futtermittel hinzufügen",
"countNutritionalProportion": "Anteil der Nährstoffe",
"countComponentStatistics": "Zusammensetzung statistik",
"countCalorieAnalysis": "Kalorienanalyse",
"countNutrientElementEnergyProportion": "Anteil der Nährstoffenergie",
"countNutritionClassification": "Ernährungsgruppeneinteilung",
"countNutritionElementRankingList": "Ranking der Nährstoffe",
"countFoodTypes": "Lebensmitteltyp",
"total": "mit",
"records": "Notiert",
"Search": "Suche läuft.",
"VoiceSearch": "Jetzt die suche.",
"Save": "Intakt",
"noMoreData": "Keine weiteren daten",
"HistoricalSearch": "Suche in der geschichte",
"wantSearch": "Durchsuch das ziel",
"verifyCalorie": "Geben sie kalorien ein.",
"kcal": "Kalorien",
"countNoFood": "Vorübergehende lebensmittelknappheit.",
"msgLoginTips": "Loggen sie sich ein und sehen sie mehr nach",
"Nutrients": "Spender",
"Content": "Hüllen",
"CaloriesAndnutrients": "Kalorien und ernährung",
"ImproveInformation": "Nachrichten verbessern.",
"WhetherTodelete": "Ist sie gelöscht",
"BusinessCooperation": "Kooperation seitens der händler",
"verifyActivityCoefficient": "Bitte wählen sie die multiplikatoren",
"devicesTips":"Gerät nicht registriert. Bitte wenden Sie sich an den Verkäufer zur Systemzertifizierung.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

161
language/en.json Normal file
View File

@ -0,0 +1,161 @@
{
"msgTitle": "Friendly Reminder",
"msgUpgradeFail": "Upgrade failed",
"msgDownloading": "Downloading",
"msgLatestVersion": "It's already the latest version!",
"msgCancel": "You have canceled the operation!",
"msgLoginSuccess": "Login successful!",
"msgDelete": "Deleted successfully",
"msgSetSuccess": "Setup successful",
"msgBottom": "That's it, let's look at something else",
"msgNoMoreData": "No more data available!",
"msgSetPasswordSuccess": "Password set successfully, entering the program!",
"msgAddUser": "Currently, there are no members. Please add one first",
"verifyNickName": "Please enter a nickname",
"verifyNotOptional": "Future dates are not selectable",
"verifyDate": "Please select the measurement date",
"verifyBirthday": "Please select your date of birth",
"verifyHeight": "Please enter your height",
"verifyWeight": "Please enter your weight",
"verifyGender": "Please select gender",
"verifyBontrast": "Please select data",
"verifyBodyDate": "Please choose the correct time",
"verifyRecord": "Please enter",
"verifyPicker": "Please select",
"verifyAccount": "Please enter a correct phone number or email address",
"verifyEmail": "Please enter your email",
"verifyEmailCorrect": "Please enter a correct email address",
"verifyMobile": "Please enter your phone number",
"verifyMobileCorrect": "Please enter a correct phone number",
"verifyCode": "Please enter the verification code",
"verifyPassword": "Please enter the password",
"verifyPasswordTwo": "Please enter the confirmation password",
"verifyPasswordCorrect": "Please confirm that the passwords entered are identical",
"verifyAgreement": "Please confirm and check the agreement first",
"verifyOutLogin": "Are you sure you want to log out?",
"verifyDeleteUser": "Should this member be deleted?",
"verifyDeleteHistory": "Do you want to delete the current measurement record?",
"verifyDeleteAccount": "After successful deletion, all associated information of the account will be cleared and cannot be retrieved. Are you sure you want to delete?",
"btnConfirm": "confirm",
"btnSubmit": "submit",
"btnSancellation": "Cancel",
"btnContinue": "continue",
"btnBack": "return",
"ConnectionTimeout": "Connection timed out, click to reconnect",
"Measuring": "During the measurement, please place the food on the scale",
"Weight": "weight",
"RecordWeight": "Please enter food weight",
"SearchBluetooth": "In Bluetooth search",
"Remeasure": "Data anomaly, please re-measure!",
"reset": "Data anomaly, please reset and measure again!",
"Disconnect": "Disconnect",
"remeasure": "remeasure",
"resetBtn": "Tare",
"UnitBtn": "unit",
"SaveResult": "save",
"titleHome": "home",
"titleMenu": "recipe",
"titleMenuAdd": "Add recipe",
"titleMenuSearch": "Search for recipes",
"titleCount": "Count food",
"titleCountList": "Ingredient library",
"titleCustomKcal": "Custom calorie",
"titleEveryMeal": "Meal details",
"titleCountSearch": "Ingredient search",
"titleeveryDay": "Nutritional Analysis",
"titleMe": "my",
"titleDetail": "Details",
"titleBody": "target",
"titleHistory": "Diet record",
"titlePhone": "Bind mobile number",
"titleEmail": "Bind email",
"titlePasswordEdit": "Change password",
"titleSet": "Settings",
"titleDate": "date",
"titleMember": "data",
"titleManage": "Member Management",
"titleManageAdd": "Add member",
"titleAboutUs": "About Us",
"titleSetPassword": "set password",
"titlePassword": "password",
"titleConfirmPassword": "Confirm Password",
"titleForgotPassword": "Forgot password",
"titleCode": "CAPTCHA",
"titleLanguage": "Language",
"titleSendCode": "Get Verification code",
"titleSendCodeRetry": "Resend after S",
"titleLogin": "login",
"titleRegister": "register",
"titleToggleLogin": "Switch login",
"titleAccountText": "Mobile phone number/Email",
"titleAgreementText": "Read and agree",
"titleAgreementContntText": "Privacy Policy",
"titleVersionUpdate": "Version Update",
"titleNewVersion": "new version",
"infoActivityCoefficient": "Activity coefficient",
"infoPersonalProfile": "Personal Profile",
"infoMyRecipes": "My recipe",
"infoMyCollection": "My Collection",
"infoAvatar": "avatar",
"infoNickname": "nickname",
"infoMobile": "mobile phone number",
"infoEmail": "email",
"infoAge": "age",
"infoAgeunit": "year",
"infoGender": "gender",
"infoMan": "male",
"infoWoman": "female",
"infoUnknown": "unknown",
"infoBirthday": "Birthday",
"infoHeight": "height",
"infoWeight": "weight",
"btnEdit": "edit",
"btnDelete": "delete",
"btnAdd": "add",
"btnDetail": "View details",
"btnDeleteAccount": "Delete account",
"btnLogOut": "Log out",
"countIntake": "intake",
"countCalorieIntake": "caloric intake",
"countMealdetails": "Meal details",
"countAddFood": "Add food",
"countNutritionalProportion": "Nutrient composition",
"countComponentStatistics": "Ingredient statistics",
"countCalorieAnalysis": "Calorie analysis",
"countNutrientElementEnergyProportion": "Energy proportion",
"countNutritionClassification": "Nutrition classification",
"countNutritionElementRankingList": "Nutrient Rankings",
"countFoodTypes": "Food type",
"total": "Total of",
"records": "records",
"Search": "Search",
"VoiceSearch": "VoiceSearch",
"Save": "Save",
"noMoreData": "There is no more data",
"HistoricalSearch": "Historical search",
"wantSearch": "I guess you want to search",
"verifyCalorie": "Please enter calories",
"kcal": "Calorie",
"countNoFood": "NO Food Yet",
"msgLoginTips": "Log in to view more",
"Nutrients": "Nutrients",
"Content": "Content",
"CaloriesAndnutrients": "Calories and nutrients",
"ImproveInformation": "Improve information",
"WhetherTodelete": "Whether to delete",
"BusinessCooperation": "Businesscooperation",
"verifyActivityCoefficient": "Please select the activity coefficient",
"devicesTips":"The equipment has not been registered. Please contact the seller for system certification.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

163
language/es.json Normal file
View File

@ -0,0 +1,163 @@
{
"msgTitle": "Consejo amistoso",
"msgUpgradeFail": "Actualización fallida",
"msgDownloading": "Descargando",
"msgLatestVersion": "Ya es la versión más reciente!",
"msgCancel": "Ha cancelado la operación!",
"msgLoginSuccess": "Inicio de sesión exitoso!",
"msgDelete": "Eliminado con éxito",
"msgSetSuccess": "Configuración exitosa",
"msgBottom": "Hasta aquí, veamos algo más",
"msgNoMoreData": "No hay más datos disponibles!",
"msgSetPasswordSuccess": "La configuración de la contraseña ha tenido éxito, entra en el programa!",
"msgAddUser": "No hay miembros por el momento, por favor añádelos primero.",
"verifyNickName": "Por favor, ingrese un nombre de usuario",
"verifyNotOptional": "No se puede seleccionar una fecha futura",
"verifyDate": "Por favor, seleccione la fecha de medición",
"verifyBirthday": "Por favor, seleccione la fecha de nacimiento",
"verifyHeight": "Por favor, ingrese su altura",
"verifyWeight": "Por favor, ingrese su peso",
"verifyGender": "Por favor, seleccione el género",
"verifyBontrast": "Por favor, seleccione los datos",
"verifyBodyDate": "Por favor, seleccione la hora correcta",
"verifyRecord": "Por favor, ingrese",
"verifyPicker": "Por favor, elija",
"verifyAccount": "Por favor, ingrese un número de teléfono o correo electrónico correcto",
"verifyEmail": "Por favor, introduzca el correo electrónico",
"verifyEmailCorrect": "Por favor, ingrese un correo electrónico válido",
"verifyMobile": "Por favor, ingrese su número de teléfono",
"verifyMobileCorrect": "Por favor, ingrese el número de teléfono correcto.",
"verifyCode": "Por favor, ingrese el código de verificación",
"verifyPassword": "Por favor, introduzca la contraseña",
"verifyPasswordTwo": "Por favor, ingrese la contraseña de confirmación",
"verifyPasswordCorrect": "Por favor, confirme que las contraseñas ingresadas coinciden.",
"verifyAgreement": "Por favor, confirme y marque el acuerdo primero.",
"verifyOutLogin": "¿Deseas cerrar sesión?",
"verifyDeleteUser": "¿Eliminar a este miembro?",
"verifyDeleteHistory": "¿Eliminar el registro de medición actual?",
"verifyDeleteAccount": "Una vez eliminado, toda la información asociada a esta cuenta se borrará y no se podrá recuperar. ¿Desea eliminarla?",
"btnConfirm": "confirmar",
"btnSubmit": "enviar",
"btnSancellation": "Cancelar",
"btnContinue": "Continuar",
"btnBack": "volver",
"btnDelete": "eliminar",
"ConnectionTimeout": "Tiempo de espera de conexión agotado, haga clic para reconectar",
"Measuring": "Durante la medición, coloque la comida en la báscula.",
"Weight": "peso",
"RecordWeight": "Ingrese el peso de la comida",
"SearchBluetooth": "Buscando Bluetooth",
"Remeasure": "Los datos son anómalos, vuelva a medirlos!",
"reset": "Los datos son anómalos, por favor reinicie y vuelva a medir!",
"Disconnect": "Desconectar",
"remeasure": "Volver a medir",
"resetBtn": "eliminación",
"UnitBtn": "unidad",
"SaveResult": "guardar",
"titleHome": "Página de inicio",
"titleMenu": "Receta",
"titleMenuAdd": "Añadir receta",
"titleMenuSearch": "Buscar recetas",
"titleCount": "Control de alimentos",
"titleCountList": "Almacén de ingredientes",
"titleCustomKcal": "Calorías personalizadas",
"titleEveryMeal": "Detalles de la comida",
"titleCountSearch": "Búsqueda de ingredientes",
"titleeveryDay": "Análisis nutricional",
"titleMe": "mi",
"titleDetail": "detalles",
"titleBody": "Objetivo",
"titleHistory": "Registro de la dieta",
"titlePhone": "Vincular número de teléfono",
"titleEmail": "Vincular correo electrónico",
"titlePasswordEdit": "cambiar la contraseña",
"titleSet": "configuración",
"titleDate": "fecha",
"titleMember": "Materiales",
"titleManage": "Gestión de miembros",
"titleManageAdd": "Añadir miembros",
"titleAboutUs": "Sobre nosotros",
"titleSetPassword": "Establecer contraseña",
"titlePassword": "contraseña",
"titleConfirmPassword": "Confirmar contraseña",
"titleForgotPassword": "Olvidé la contraseña",
"titleCode": "código de verificación",
"titleLanguage": "El lenguaje",
"titleSendCode": "Obtener código de verificación",
"titleSendCodeRetry": "Reenvío posterior a S",
"titleLogin": "Iniciar sesión",
"titleRegister": "registro",
"titleToggleLogin": "Cambiar de inicio de sesión",
"titleAccountText": "Número de teléfono/correo electrónico",
"titleAgreementText": "Leer y aceptar",
"titleAgreementContntText": "Acuerdo de privacidad",
"titleVersionUpdate": "Actualización de versión",
"titleNewVersion": "Nueva versión",
"infoActivityCoefficient": "factor de actividad",
"infoPersonalProfile": "Perfil personal",
"infoMyRecipes": "Mi recetario",
"infoMyCollection": "Mi colección",
"infoAvatar": "Avatar",
"infoNickname": "Apodo",
"infoMobile": "número de teléfono móvil",
"infoEmail": "correo electrónico",
"infoAge": "edad",
"infoAgeunit": "año",
"infoGender": "Género",
"infoMan": "hombre",
"infoWoman": "mujer",
"infoUnknown": "desconocido",
"infoBirthday": "Fecha de nacimiento",
"infoHeight": "altura",
"infoWeight": "Peso",
"btnEdit": "editar",
"btnDelete": "eliminar",
"btnAdd": "añadir",
"btnDetail": "Ver detalles",
"btnDeleteAccount": "Eliminar la cuenta",
"btnLogOut": "Cerrar sesión",
"countIntake": "Ingestión",
"countCalorieIntake": "Ingesta de calorías",
"countMealdetails": "Detalles de la comida",
"countAddFood": "Añadir alimentos",
"countNutritionalProportion": "Proporción de nutrientes",
"countComponentStatistics": "Estadística de componentes",
"countCalorieAnalysis": "Análisis de calorías",
"countNutrientElementEnergyProportion": "Proporción de energía de los nutrientes",
"countNutritionClassification": "Clasificación nutricional",
"countNutritionElementRankingList": "Ranking de elementos nutricionales",
"countFoodTypes": "Tipo de alimento",
"total": "total",
"records": "Los registros",
"Search": "búsqueda",
"VoiceSearch": "Búsqueda por voz",
"Save": "guardar",
"noMoreData": "No hay más datos",
"HistoricalSearch": "Búsqueda en historia",
"wantSearch": "Supongo que quieres buscar",
"verifyCalorie": "Por favor, introduzca calorías",
"kcal": "caloría",
"countNoFood": "No hay comida todavía",
"msgLoginTips": "Iniciar sesión para ver más",
"Nutrients": "nutriente",
"Content": "Elcontenido",
"CaloriesAndnutrients": "Calorías y nutrición",
"ImproveInformation": "Perfeccionando el mensaje",
"WhetherTodelete": "Eliminar sí no",
"BusinessCooperation": "Cooperación empresarial",
"verifyActivityCoefficient": "Por favor seleccione el coeficiente de actividad",
"devicesTips":"El equipo no está registrado. Por favor, contacte al vendedor para realizar la autenticación del sistema.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

161
language/fr.json Normal file
View File

@ -0,0 +1,161 @@
{
"msgTitle": "Conseil amical",
"msgUpgradeFail": "Mise à niveau échouée",
"msgDownloading": "En cours de téléchargement",
"msgLatestVersion": "C'est déjà la dernière version !",
"msgCancel": "Vous avez annulé l'opération !",
"msgLoginSuccess": "Connexion réussie !",
"msgDelete": "Suppression réussie",
"msgSetSuccess": "Paramètres réussis",
"msgBottom": "C'est la fin, regarde quelque chose d'autre.",
"msgNoMoreData": "Plus de données disponibles !",
"msgSetPasswordSuccess": "Mot de passe configuré avec succès, accédez au programme !",
"msgAddUser": "Aucun membre pour le moment, veuillez en ajouter d'abord.",
"verifyNickName": "Veuillez entrer un pseudonyme",
"verifyNotOptional": "La date future ne peut pas être sélectionnée",
"verifyDate": "Veuillez sélectionner la date de mesure",
"verifyBirthday": "Veuillez sélectionner la date de naissance",
"verifyHeight": "Veuillez entrer votre taille",
"verifyWeight": "Veuillez entrer votre poids",
"verifyGender": "Veuillez choisir le sexe",
"verifyBontrast": "Veuillez sélectionner les données",
"verifyBodyDate": "Veuillez choisir l'heure correcte",
"verifyRecord": "Veuillez entrer",
"verifyPicker": "Veuillez choisir",
"verifyAccount": "Veuillez saisir un numéro de téléphone ou une adresse e-mail corrects",
"verifyEmail": "Veuillez saisir une adresse e-mail",
"verifyEmailCorrect": "Veuillez entrer une adresse e-mail valide.",
"verifyMobile": "Veuillez entrer votre numéro de téléphone",
"verifyMobileCorrect": "Veuillez saisir un numéro de téléphone correct",
"verifyCode": "Veuillez entrer le code de vérification",
"verifyPassword": "Veuillez entrer le mot de passe",
"verifyPasswordTwo": "Veuillez saisir le mot de passe de confirmation",
"verifyPasswordCorrect": "Veuillez confirmer que les deux mots de passe saisis sont identiques.",
"verifyAgreement": "Veuillez d'abord confirmer et cocher l'accord.",
"verifyOutLogin": "Voulez-vous vous déconnecter ?",
"verifyDeleteUser": "Voulez-vous supprimer ce membre ?",
"verifyDeleteHistory": "Voulez-vous supprimer l'enregistrement de mesure actuel ?",
"verifyDeleteAccount": "Après la suppression réussie, toutes les informations associées à ce compte seront effacées et ne pourront pas être récupérées. Voulez-vous vraiment supprimer ?",
"btnConfirm": "confirmer",
"btnSubmit": "Soumettre",
"btnSancellation": "Annuler",
"btnContinue": "Continuer",
"btnBack": "retourner",
"btnDelete": "supprimer",
"ConnectionTimeout": "Déconnexion, cliquez pour se reconnecter",
"Measuring": "En cours de mesure, veuillez placer la nourriture sur la balance.",
"Weight": "poids",
"RecordWeight": "Veuillez entrer le poids de la nourriture",
"SearchBluetooth": "Recherche Bluetooth en cours",
"Remeasure": "Données anormales, veuillez reprendre la mesure !",
"reset": "Données anormales, veuillez les réinitialiser et recommencer la mesure !",
"Disconnect": "Déconnexion",
"remeasure": "Re-mesurer",
"resetBtn": "Réinitialisation",
"UnitBtn": "unité",
"SaveResult": "sauvegarder",
"titleHome": "Page d'accueil",
"titleMenu": "Recette",
"titleMenuAdd": "Ajouter une recette",
"titleMenuSearch": "Rechercher des recettes",
"titleCount": "Compter les calories",
"titleCountList": "Répertoire des ingrédients",
"titleCustomKcal": "Calories personnalisées",
"titleEveryMeal": "Détails du repas",
"titleCountSearch": "Recherche d'ingrédients",
"titleeveryDay": "Analyse nutritionnelle",
"titleMe": "mon",
"titleDetail": "Détails",
"titleBody": "Objectif",
"titleHistory": "Journal alimentaire",
"titlePhone": "Lier un numéro de téléphone",
"titleEmail": "Lier une adresse e-mail",
"titlePasswordEdit": "Modifier le mot de passe",
"titleSet": "Paramétrage",
"titleDate": "date",
"titleMember": "Données",
"titleManage": "Gestion des membres",
"titleManageAdd": "Ajouter un membre",
"titleAboutUs": "À propos de nous",
"titleSetPassword": "Définir un mot de passe",
"titlePassword": "mot de passe",
"titleConfirmPassword": "Confirmer le mot de passe",
"titleForgotPassword": "Mot de passe oublié",
"titleCode": "Code de vérification",
"titleLanguage": "Langue (S)",
"titleSendCode": "Obtenir le code de vérification",
"titleSendCodeRetry": "Réémission après S",
"titleLogin": "Connexion",
"titleRegister": "Inscription",
"titleToggleLogin": "Changer de connexion",
"titleAccountText": "Numéro de téléphone / Adresse e-mail",
"titleAgreementText": "Lire et accepter",
"titleAgreementContntText": "Politique de confidentialité",
"titleVersionUpdate": "Mise à jour de version",
"titleNewVersion": "Nouvelle version",
"infoActivityCoefficient": "Coefficient d'activité",
"infoPersonalProfile": "Profil personnel",
"infoMyRecipes": "Ma recette",
"infoMyCollection": "Ma collection",
"infoAvatar": "Avatar",
"infoNickname": "Pseudonyme",
"infoMobile": "numéro de téléphone portable",
"infoEmail": "boîte aux lettres",
"infoAge": "Âge",
"infoAgeunit": "Année",
"infoGender": "Genre",
"infoMan": "homme",
"infoWoman": "femme",
"infoUnknown": "Inconnu",
"infoBirthday": "Date de naissance",
"infoHeight": "taille",
"infoWeight": "poids",
"btnEdit": "Éditer",
"btnDelete": "supprimer",
"btnAdd": "Ajouter",
"btnDetail": "Voir les détails",
"btnDeleteAccount": "Supprimer le compte",
"btnLogOut": "Se déconnecter",
"countIntake": "Absorption",
"countCalorieIntake": "L'apport calorique",
"countMealdetails": "Détails du repas",
"countAddFood": "Ajouter des aliments",
"countNutritionalProportion": "Proportion nutritionnelle",
"countComponentStatistics": "Statistiques des composants",
"countCalorieAnalysis": "Analyse des calories",
"countNutrientElementEnergyProportion": "La proportion d'énergie des éléments nutritifs",
"countNutritionClassification": "Classification nutritionnelle",
"countNutritionElementRankingList": "Classement des éléments nutritifs",
"countFoodTypes": "Type d'alimentation",
"total ": "total",
"Records ": " un enregistrement",
"Search": "rechercher ",
"VoiceSearch": "recherche vocale",
"Save": "Save",
"NoMoreData ": "plus de données",
"HistoricalSearch": "recherche historique",
"WantSearch ": "devinez que vous voulez rechercher",
"VerifyCalorie ": "sil vous plaît entrer des calories ",
"Kcal ": "calories",
"CountNoFood ": "pas de nourriture pour le moment ",
"MsgLoginTips ": "voir plus après connexion ",
"Nutriments ": "nutriments ",
"Content": "contenu ",
"CaloriesAndnutrients": "calories et nutrition ",
"Améliorer linformation ": " améliorer linformation ",
"WhetherTodelete": "supprimer ou non ",
"BusinessCooperation": "coopération commerciale ",
"verifyActivityCoefficient ": "veuillez sélectionner des coefficients dactivité.",
"devicesTips":"L'équipement n'est pas enregistré. Veuillez contacter le vendeur pour une authentification du système.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

32
language/index.js Normal file
View File

@ -0,0 +1,32 @@
import en from './en.json'
import zh from './zh.json'
import zhHant from './zh-Hant.json'
import ja from './ja.json'
import fr from './fr.json'
import de from './de.json'
import ko from './ko.json'
import ru from './ru.json'
import pt from './pt.json'
import es from './es.json'
import ar from './ar.json'
export default {
zh, //中文
ar, //阿拉伯
de, //德语
en, // 英语
es, //西班牙
fr, //法语
ja, //日语
ko, //韩语
pt, //葡萄牙
ru, //俄语
"zh-Hans": zh, //中文
'zh-Hant': zhHant, //繁体
"en-CN": en,
"jp":ja,
"fra":fr,
"kor":ko,
"spa":es,
"ara":ar,
}

162
language/ja.json Normal file
View File

@ -0,0 +1,162 @@
{
"msgTitle": "友情のヒント",
"msgUpgradeFail": "アップグレード失敗",
"msgDownloading": "ダウンロード中",
"msgLatestVersion": "最新バージョンですよ!",
"msgCancel": "操作をキャンセルしました!",
"msgLoginSuccess": "ログイン成功!",
"msgDelete": "削除に成功しました",
"msgSetSuccess": "設定完了",
"msgBottom": "これ以上ありません。他のものを見てみましょう",
"msgNoMoreData": "これ以上データはありません!",
"msgSetPasswordSuccess": "パスワード設定完了、プログラムに入ります!",
"msgAddUser": "メンバーがまだいません。まず追加してください",
"verifyNickName": "ニックネームを入力してください",
"verifyNotOptional": "将来の日付は選択できません",
"verifyDate": "測定日を選択してください",
"verifyBirthday": "生年月日を選択してください",
"verifyHeight": "身長を入力してください",
"verifyWeight": "体重を入力してください",
"verifyGender": "性別を選択してください",
"verifyBontrast": "データを選択してください",
"verifyBodyDate": "正しい時間を選択してください",
"verifyRecord": "入力してください",
"verifyPicker": "選択してください",
"verifyAccount": "正しい携帯電話番号またはメールアドレスを入力してください",
"verifyEmail": "メールアドレスを入力してください",
"verifyEmailCorrect": "正しいメールアドレスを入力してください",
"verifyMobile": "携帯電話番号を入力してください",
"verifyMobileCorrect": "正しい携帯電話番号を入力してください",
"verifyCode": "認証コードを入力してください",
"verifyPassword": "パスワードを入力してください",
"verifyPasswordTwo": "確認用パスワードを入力してください",
"verifyPasswordCorrect": "パスワードが一致しているか確認してください",
"verifyAgreement": "まず、同意書を確認してチェックしてください",
"verifyOutLogin": "ログアウトしますか?",
"verifyDeleteUser": "このメンバーを削除しますか?",
"verifyDeleteHistory": "現在の測定記録を削除しますか?",
"verifyDeleteAccount": "削除に成功すると、そのアカウントに関連するすべての情報が消去され、復元できません。削除しますか?",
"btnConfirm": "確認",
"btnSubmit": "提出",
"btnSancellation": "キャンセル",
"btnContinue": "続ける",
"btnBack": "戻る",
"ConnectionTimeout": "接続タイムアウト、再接続をクリックしてください",
"Measuring": "測定中は、食べ物をはかりの上に置いてください",
"Weight": "重量",
"RecordWeight": "食品の重量を入力してください",
"SearchBluetooth": "Bluetooth検索中",
"Remeasure": "データに異常があります。再度計測してください!",
"reset": "データ異常です。ゼロにしてから再度測定してください!",
"Disconnect": "接続を切断",
"remeasure": "再測定",
"resetBtn": "ゼロクリア",
"UnitBtn": "単位",
"SaveResult": "保存",
"titleHome": "ホームページ",
"titleMenu": "レシシピ",
"titleMenuAdd": "レシピを追加",
"titleMenuSearch": "レシピ検索",
"titleCount": "食事の計算",
"titleCountList": "食材庫(しょかいく)",
"titleCustomKcal": "カスタムカロリー",
"titleEveryMeal": "食事の詳細",
"titleCountSearch": "食材検索",
"titleeveryDay": "栄養分析",
"titleMe": "私の",
"titleDetail": "詳細",
"titleBody": "目標",
"titleHistory": "食事記録",
"titlePhone": "携帯電話番号の紐付け",
"titleEmail": "メールアドレスの紐付け",
"titlePasswordEdit": "パスワードを変更する",
"titleSet": "設定",
"titleDate": "日付",
"titleMember": "資料",
"titleManage": "メンバー管理",
"titleManageAdd": "メンバー追加",
"titleAboutUs": "私たちについて",
"titleSetPassword": "パスワードを設定する",
"titlePassword": "パスワード",
"titleConfirmPassword": "確認用パスワード",
"titleForgotPassword": "パスワードを忘れた",
"titleCode": "認証コード",
"titleLanguage": "言語です",
"titleSendCode": "認証コードを取得する",
"titleSendCodeRetry": "S後再送",
"titleLogin": "ログイン",
"titleRegister": "登録",
"titleToggleLogin": "ログイン切り替え",
"titleAccountText": "携帯電話番号/メールアドレス",
"titleAgreementText": "読み、同意する",
"titleAgreementContntText": "プライバシーポリシー",
"titleVersionUpdate": "バージョンアップデート",
"titleNewVersion": "新バージョン",
"infoActivityCoefficient": "活動係数",
"infoPersonalProfile": "個人情報",
"infoMyRecipes": "私のレシピ",
"infoMyCollection": "私のコレクション",
"infoAvatar": "アバター",
"infoNickname": "ニックネーム",
"infoMobile": "携帯電話番号",
"infoEmail": "メールボックス",
"infoAge": "年齢",
"infoAgeunit": "歳",
"infoGender": "性別",
"infoMan": "男",
"infoWoman": "女(おんな)",
"infoUnknown": "未知(みちゅう)",
"infoBirthday": "生年月日",
"infoHeight": "身長",
"infoWeight": "体重",
"btnEdit": "編集",
"btnDelete": "削除",
"btnAdd": "追加",
"btnDetail": "詳細を見る",
"btnDeleteAccount": "アカウント削除",
"btnLogOut": "ログアウト",
"countIntake": "摂取",
"countCalorieIntake": "熱量摂取",
"countMealdetails": "食事の詳細",
"countAddFood": "食品を追加する",
"countNutritionalProportion": "栄養の割合",
"countComponentStatistics": "成分統計",
"countCalorieAnalysis": "カロリー分析",
"countNutrientElementEnergyProportion": "栄養素のエネルギー割合",
"countNutritionClassification": "栄養分類",
"countNutritionElementRankingList": "栄養素ランキング",
"countFoodTypes": "食品タイプ",
"total": "共です",
"records": "記録します",
"Search": "検索します",
"VoiceSearch": "音声検索です",
"Save": "保存します",
"noMoreData": "これ以上のデータはありません",
"HistoricalSearch": "履歴検索です",
"wantSearch": "あなたが探していると思います",
"verifyCalorie": "カロリー入力お願いします。",
"kcal": "カロリーです",
"countNoFood": "しばらく食べ物がありません",
"msgLoginTips": "ログインしてもっと見ます",
"Nutrients": "栄養素です",
"Content": "含有量です",
"CaloriesAndnutrients": "カロリーと栄養です",
"ImproveInformation": "情報を補完します",
"WhetherTodelete": "削除しますか",
"BusinessCooperation": "ビジネス提携です",
"verifyActivityCoefficient": "活動係数を選択します",
"devicesTips":"機器は登録されていません。販売者に連絡してシステム認証を行ってください。",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

161
language/ko.json Normal file
View File

@ -0,0 +1,161 @@
{
"msgTitle": "친절한 안내",
"msgUpgradeFail": "업그레이드 실패",
"msgDownloading": "다운로드 중입니다",
"msgLatestVersion": "이미 최신 버전입니다!",
"msgCancel": "작업을 취소하셨습니다!",
"msgLoginSuccess": "로그인 성공!",
"msgDelete": "삭제 성공",
"msgSetSuccess": "설정 성공",
"msgBottom": "끝이에요, 다른 걸 봐요",
"msgNoMoreData": "더 이상의 데이터가 없습니다!",
"msgSetPasswordSuccess": "비밀번호 설정이 성공적으로 완료되었습니다. 프로그램으로 들어가세요!",
"msgAddUser": "멤버가 없습니다. 먼저 추가해 주세요.",
"verifyNickName": "닉네임을 입력해 주세요",
"verifyNotOptional": "미래 날짜는 선택할 수 없습니다.",
"verifyDate": "측정 날짜를 선택해 주세요",
"verifyBirthday": "생년월일을 선택해 주세요",
"verifyHeight": "키를 입력해 주세요",
"verifyWeight": "체중을 입력해 주세요",
"verifyGender": "성별을 선택해 주세요",
"verifyBontrast": "데이터를 선택해 주세요",
"verifyBodyDate": "올바른 시간을 선택해 주세요",
"verifyRecord": "입력해 주세요",
"verifyPicker": "선택해 주세요",
"verifyAccount": "올바른 휴대폰 번호 또는 이메일을 입력해 주세요.",
"verifyEmail": "이메일을 입력해 주세요",
"verifyEmailCorrect": "올바른 이메일을 입력해 주세요.",
"verifyMobile": "휴대폰 번호를 입력해 주세요",
"verifyMobileCorrect": "올바른 휴대폰 번호를 입력해 주세요.",
"verifyCode": "인증번호를 입력해 주세요",
"verifyPassword": "비밀번호를 입력하세요",
"verifyPasswordTwo": "비밀번호를 다시 입력해 주세요",
"verifyPasswordCorrect": "비밀번호가 일치하는지 확인해 주세요.",
"verifyAgreement": "먼저 약관을 확인하고 체크해 주세요.",
"verifyOutLogin": "로그아웃 하시겠습니까?",
"verifyDeleteUser": "해당 멤버를 삭제하시겠습니까?",
"verifyDeleteHistory": "현재 측정 기록을 삭제하시겠습니까?",
"verifyDeleteAccount": "삭제 성공 후, 해당 계정의 모든 연관 정보가 지워지고 복구할 수 없으니, 정말로 삭제하시겠습니까?",
"btnConfirm": "확인",
"btnSubmit": "제출",
"btnSancellation": "취소",
"btnContinue": "계속",
"btnBack": "돌아가다",
"btnDelete": "삭제",
"ConnectionTimeout": "연결 시간 초과, 재연결을 클릭하세요",
"Measuring": "측정 중, 음식을 저울 위에 놓아주세요.",
"Weight": "무게",
"RecordWeight": "음식 무게를 입력해 주세요",
"SearchBluetooth": "블루투스 검색 중",
"Remeasure": "데이터 이상, 재측정해 주세요!",
"reset": "데이터 이상, 초기화 후 재측정해 주세요!",
"Disconnect": "연결 끊기",
"remeasure": "재측정",
"resetBtn": "제로화",
"UnitBtn": "단위",
"SaveResult": "저장",
"titleHome": "홈페이지",
"titleMenu": "레시피",
"titleMenuAdd": "레시피 추가",
"titleMenuSearch": "레시피 검색",
"titleCount": "계식",
"titleCountList": "재료 창고",
"titleCustomKcal": "사용자 정의 칼로리",
"titleEveryMeal": "식사 상세",
"titleCountSearch": "재료 검색",
"titleeveryDay": "영양 분석",
"titleMe": "나의",
"titleDetail": "상세",
"titleBody": "목표",
"titleHistory": "식단 기록",
"titlePhone": "휴대폰 번호 바인딩",
"titleEmail": "이메일 바인딩",
"titlePasswordEdit": "비밀번호 변경",
"titleSet": "설정",
"titleDate": "날짜",
"titleMember": "자료",
"titleManage": "멤버 관리",
"titleManageAdd": "멤버 추가",
"titleAboutUs": "회사 소개",
"titleSetPassword": "비밀번호 설정",
"titlePassword": "비밀번호",
"titleConfirmPassword": "비밀번호 확인",
"titleForgotPassword": "비밀번호를 잊어버렸어요",
"titleCode": "인증 코드",
"titleLanguage": "언어",
"titleSendCode": "인증번호 받기",
"titleSendCodeRetry": "S 후 재발송",
"titleLogin": "로그인",
"titleRegister": "등록",
"titleToggleLogin": "로그인 전환",
"titleAccountText": "휴대폰 번호/이메일",
"titleAgreementText": "읽고 동의합니다",
"titleAgreementContntText": "개인정보 처리방침",
"titleVersionUpdate": "버전 업데이트",
"titleNewVersion": "새 버전",
"infoActivityCoefficient": "활동 계수",
"infoPersonalProfile": "개인 정보",
"infoMyRecipes": "내 레시피",
"infoMyCollection": "내 컬렉션",
"infoAvatar": "프로필 사진",
"infoNickname": "별명",
"infoMobile": "휴대폰 번호",
"infoEmail": "이메일",
"infoAge": "나이",
"infoAgeunit": "살",
"infoGender": "성별",
"infoMan": "남자",
"infoWoman": "여자",
"infoUnknown": "미지",
"infoBirthday": "생년월일",
"infoHeight": "키",
"infoWeight": "체중",
"btnEdit": "편집",
"btnAdd": "추가",
"btnDetail": "상세 내용 확인",
"btnDeleteAccount": "계정 삭제",
"btnLogOut": "로그아웃",
"countIntake": "섭취",
"countCalorieIntake": "열량 섭취",
"countMealdetails": "식사 상세",
"countAddFood": "음식 추가",
"countNutritionalProportion": "영양 비율",
"countComponentStatistics": "성분 통계",
"countCalorieAnalysis": "칼로리 분석",
"countNutrientElementEnergyProportion": "영양소 에너지 비율",
"countNutritionClassification": "영양 분류",
"countNutritionElementRankingList": "영양소 순위표",
"countFoodTypes": "음식 유형",
"total": "모두",
"records": "조목 기록",
"Search": "검색",
"VoiceSearch": "음성 검색",
"Save": "저장",
"noMoreData": "더 이상 자료가 없습니다",
"HistoricalSearch": "과거 기록 검색",
"wantSearch": "검색해 보세요",
"verifyCalorie": "칼로리를 입력하십시오",
"kcal": "칼로리",
"countNoFood": "잠시 음식물이 없다.",
"msgLoginTips": "로그인 후 더 많은 것을 볼 수 있습니다",
"Nutrients": "영양소",
"Content": "함량이",
"CaloriesAndnutrients": "열량과 영양",
"ImproveInformation": "정보를 완벽하게하다.",
"WhetherTodelete": "삭제할지 여부",
"BusinessCooperation": "상무 합작",
"verifyActivityCoefficient": "활동지수를 선택하십시오",
"devicesTips":"장비 등록이 되지 않았습니다. 판매자에게 연락하여 시스템 인증을 진행해 주세요.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

162
language/pt.json Normal file
View File

@ -0,0 +1,162 @@
{
"msgTitle": "Aviso Amigo",
"msgUpgradeFail": "Falha na atualização",
"msgDownloading": "Em download",
"msgLatestVersion": "Já é a versão mais recente!",
"msgCancel": "Você cancelou a operação!",
"msgLoginSuccess": "Login efetuado com sucesso!",
"msgDelete": "Excluir com sucesso",
"msgSetSuccess": "Configurações bem-sucedidas",
"msgBottom": "Fim da linha, veja outro",
"msgNoMoreData": "Não há mais dados!",
"msgSetPasswordSuccess": "Senha definida com sucesso,entre no programa!",
"msgAddUser": "Nenhum membro por enquanto, adicione um",
"verifyNickName": "Por favor insira um apelido",
"verifyNotOptional": "Futuras datas não podem ser selecionadas",
"verifyDate": "Por favor selecione a data da medição",
"verifyBirthday": "Por favor selecione a data de nascimento",
"verifyHeight": "Por favor, insira a altura",
"verifyWeight": "Digite seu peso",
"verifyGender": "Por favor selecione o género",
"verifyBontrast": "Por favor selecione dados",
"verifyBodyDate": "Por favor selecione o horário correto",
"verifyRecord": "Por favor, insira",
"verifyPicker": "Por favor, escolha",
"verifyAccount": "Por favor insira o número de telemóvel ou e-mail correto",
"verifyEmail": "Insira o e-mail",
"verifyEmailCorrect": "Insira um e-mail válido",
"verifyMobile": "Por favor insira o número de telemóvel",
"verifyMobileCorrect": "Por favor insira um número de telemóvel correto",
"verifyCode": "Por favor insira o código de verificação",
"verifyPassword": "Por favor, insira a senha",
"verifyPasswordTwo": "Por favor insira a confirmação da palavra-passe",
"verifyPasswordCorrect": "Por favor, confirme que as duas senhas escritas estão iguais",
"verifyAgreement": "Por favor, confirme e marque o acordo",
"verifyOutLogin": "Sair da sessão?",
"verifyDeleteUser": "Tem certeza que deseja excluir o membro?",
"verifyDeleteHistory": "Excluir a medida atual?",
"verifyDeleteAccount": "Após a exclusão, todos os dados vinculados a esta conta serão apagados e não poderá recuperá-los. Excluir?",
"btnConfirm": "confirmar",
"btnSubmit": "Enviar a sua candidatura",
"btnSancellation": "cancelar",
"btnContinue": "Continuar",
"btnBack": "Voltar",
"btnDelete": "excluir",
"ConnectionTimeout": "Tempo de conexão esgotado, clique para reconectar",
"Measuring": "Medindo, coloque o alimento na balança",
"Weight": "peso",
"RecordWeight": "Informe o peso do alimento",
"SearchBluetooth": "Pesquisa Bluetooth em",
"Remeasure": "Dados anormais, faça a medição novamente!",
"reset": "Dados anormais, por favor zerar e medir novamente!",
"Disconnect": "Desconectar",
"remeasure": "Re-Medir a",
"resetBtn": "reinicialização",
"UnitBtn": "unidade",
"SaveResult": "guardar",
"titleHome": "Página inicial",
"titleMenu": "receitas de pratos",
"titleMenuAdd": "Adicionar Receita",
"titleMenuSearch": "Pesquisa de Receitas",
"titleCount": "contagem de alimentos",
"titleCountList": "Banco de Ingredientes",
"titleCustomKcal": "Calorias Personalizadas",
"titleEveryMeal": "Detalhes do Almoço",
"titleCountSearch": "Busca de Ingredientes",
"titleeveryDay": "Análise Nutricional",
"titleMe": "meu",
"titleDetail": "Detalhes",
"titleBody": "Objetivos",
"titleHistory": "Registo de dietas e alimentação",
"titlePhone": "Vincular o número de telefone",
"titleEmail": "Vincular e-mail",
"titlePasswordEdit": "Alterar a palavra-passe",
"titleSet": "configuração",
"titleDate": "data",
"titleMember": "Documentos para o",
"titleManage": "Administração de Membros",
"titleManageAdd": "Adicionar um membro",
"titleAboutUs": "Sobre nós",
"titleSetPassword": "Definir uma senha",
"titlePassword": "Senha",
"titleConfirmPassword": "Confirme a Senha",
"titleForgotPassword": "Esqueceu a senha",
"titleCode": "código de verificação",
"titleLanguage": "línguas",
"titleSendCode": "Obter código de verificação",
"titleSendCodeRetry": "Reenvio posterior S",
"titleLogin": "Iniciar sessão",
"titleRegister": "Registre-se",
"titleToggleLogin": "Alterar o login",
"titleAccountText": "Número de celular/email",
"titleAgreementText": "Ler e aceitar",
"titleAgreementContntText": "Termo de privacidade",
"titleVersionUpdate": "Atualização de versão",
"titleNewVersion": "nova versão",
"infoActivityCoefficient": "Fator de atividade",
"infoPersonalProfile": "Perfil",
"infoMyRecipes": "As minhas receitas",
"infoMyCollection": "Minha Coleção",
"infoAvatar": "Foto de perfil",
"infoNickname": "Nome do apelido",
"infoMobile": "Nº de Telefone",
"infoEmail": "caixa de correio",
"infoAge": "idade",
"infoAgeunit": "Ano",
"infoGender": "Gênero",
"infoMan": "homem",
"infoWoman": "Mulher",
"infoUnknown": "Desconhecido",
"infoBirthday": "Data de nascimento",
"infoHeight": "altura",
"infoWeight": "Peso corporal",
"btnEdit": "Editores",
"btnDelete": "excluir",
"btnAdd": "Adicionar",
"btnDetail": "Detalhes de Visualização",
"btnDeleteAccount": "Excluir conta",
"btnLogOut": "Sair",
"countIntake": "ingestão",
"countCalorieIntake": "intake de calorias",
"countMealdetails": "Detalhes dos pratos",
"countAddFood": "Adicionar alimentos",
"countNutritionalProportion": "Contribuição percentual de nutrientes",
"countComponentStatistics": "Estatística de Ingredientes",
"countCalorieAnalysis": "Análise de calorias",
"countNutrientElementEnergyProportion": "Porcentagem de energia dos nutrientes",
"countNutritionClassification": "Classificação nutricional",
"countNutritionElementRankingList": "Ranking de nutrientes",
"countFoodTypes": "Tipos de alimentos",
"total": "total",
"records": "Um registo",
"Search": "busca",
"VoiceSearch": "Pesquisa por voz",
"Save": "conservação",
"noMoreData": "Não há mais dados",
"HistoricalSearch": "Pesquisa no histórico",
"wantSearch": "Acho que você quer pesquisar",
"verifyCalorie": "Por favor, insira calorias",
"kcal": "Caloria em calorias",
"countNoFood": "Sem comida ainda",
"msgLoginTips": "Faça login para ver mais",
"Nutrients": "nutriente",
"Content": "conteúdo",
"CaloriesAndnutrients": "Calorias e nutrição",
"ImproveInformation": "Aperfeiçoe a mensagem",
"WhetherTodelete": "Apagar sim não",
"BusinessCooperation": "Cooperação de negócios",
"verifyActivityCoefficient": "Por favor, selecione o coeficiente de atividade",
"devicesTips":"O equipamento não foi registrado. Por favor, entre em contato com o vendedor para realizar a autenticação no sistema.",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

161
language/ru.json Normal file
View File

@ -0,0 +1,161 @@
{
"msgTitle": "Дружеское напоминание",
"msgUpgradeFail": "Обновление не удалось",
"msgDownloading": "Скачивается",
"msgLatestVersion": "Это уже самая новая версия!",
"msgCancel": "Вы отменили операцию!",
"msgLoginSuccess": "Вход выполнен успешно!",
"msgDelete": "Удаление успешно",
"msgSetSuccess": "Настройка успешно завершена",
"msgBottom": "Вот и конец, посмотрим что-то другое.",
"msgNoMoreData": "Больше данных нет!",
"msgSetPasswordSuccess": "Пароль успешно установлен, вход в программу!",
"msgAddUser": "Пока нет участников, сначала добавьте",
"verifyNickName": "Введите никнейм",
"verifyNotOptional": "Будущие даты нельзя выбрать",
"verifyDate": "Пожалуйста, выберите дату измерения",
"verifyBirthday": "Пожалуйста, выберите дату рождения",
"verifyHeight": "Введите рост",
"verifyWeight": "Введите вес",
"verifyGender": "Пожалуйста, выберите пол",
"verifyBontrast": "Пожалуйста, выберите данные",
"verifyBodyDate": "Пожалуйста, выберите правильное время",
"verifyRecord": "Пожалуйста, введите",
"verifyPicker": "Пожалуйста, выберите",
"verifyAccount": "Введите правильный номер телефона или электронную почту",
"verifyEmail": "Введите электронную почту",
"verifyEmailCorrect": "Введите правильный адрес электронной почты",
"verifyMobile": "Введите номер телефона",
"verifyMobileCorrect": "Введите правильный номер телефона",
"verifyCode": "Введите код подтверждения",
"verifyPassword": "Введите пароль",
"verifyPasswordTwo": "Пожалуйста, введите подтверждение пароля",
"verifyPasswordCorrect": "Пожалуйста, убедитесь, что пароли введены одинаково.",
"verifyAgreement": "Пожалуйста, сначала подтвердите и отметьте соглашение.",
"verifyOutLogin": "Выйти из учетной записи?",
"verifyDeleteUser": "Удалить этого участника?",
"verifyDeleteHistory": "Удалить текущую запись измерений?",
"verifyDeleteAccount": "После успешного удаления все связанная информация с этого аккаунта будет очищена и не будет восстановлена. Удалить?",
"btnConfirm": "подтверждение",
"btnSubmit": "отправить",
"btnSancellation": "отменить",
"btnContinue": "продолжать",
"btnBack": "возвращаться",
"btnDelete": "удалить",
"ConnectionTimeout": "Тайм-аут подключения, нажмите для повторного подключения",
"Measuring": "При измерении, пожалуйста, положите еду на весы.",
"Weight": "вес",
"RecordWeight": "Введите вес еды",
"SearchBluetooth": "Поиск Bluetooth",
"Remeasure": "Аномальные данные, проведите повторное измерение!",
"reset": "Аномальные данные, очистите и проведите повторное измерение!",
"Disconnect": "Отключение",
"remeasure": "Пересчитать",
"resetBtn": "обнуление",
"UnitBtn": "единица",
"SaveResult": "сохранить",
"titleHome": "Главная страница",
"titleMenu": "рецепт",
"titleMenuAdd": "Добавить рецепт",
"titleMenuSearch": "Поиск рецептов",
"titleCount": "Планирование питания",
"titleCountList": "Склад продуктов",
"titleCustomKcal": "Пользовательские калории",
"titleEveryMeal": "Детали питания",
"titleCountSearch": "Поиск ингредиентов",
"titleeveryDay": "анализ питательных веществ",
"titleMe": "Мой",
"titleDetail": "подробности",
"titleBody": "цель",
"titleHistory": "Пищевой дневник",
"titlePhone": "Привязка номера телефона",
"titleEmail": "Привязать электронную почту",
"titlePasswordEdit": "изменить пароль",
"titleSet": "настройка",
"titleDate": "дата",
"titleMember": "материалы",
"titleManage": "Управление участниками",
"titleManageAdd": "Добавить участника",
"titleAboutUs": "О нас",
"titleSetPassword": "Установить пароль",
"titlePassword": "пароль",
"titleConfirmPassword": "Подтверждение пароля",
"titleForgotPassword": "Забыли пароль",
"titleCode": "капча",
"titleLanguage": "язык",
"titleSendCode": "Получить код подтверждения",
"titleSendCodeRetry": "S повторная отправка",
"titleLogin": "Войти",
"titleRegister": "регистрация",
"titleToggleLogin": "Переключение входа",
"titleAccountText": "Мобильный номер/электронная почта",
"titleAgreementText": "Прочитать и согласиться",
"titleAgreementContntText": "Политика конфиденциальности",
"titleVersionUpdate": "Обновление версии",
"titleNewVersion": "Новая версия",
"infoActivityCoefficient": "коэффициент активности",
"infoPersonalProfile": "Личные данные",
"infoMyRecipes": "Мои рецепты",
"infoMyCollection": "Моя коллекция",
"infoAvatar": "аватар",
"infoNickname": "никнейм",
"infoMobile": "номер телефона",
"infoEmail": "почта",
"infoAge": "возраст",
"infoAgeunit": "год",
"infoGender": "пол",
"infoMan": "мужчина",
"infoWoman": "женщина",
"infoUnknown": "неизвестный",
"infoBirthday": "Дата рождения",
"infoHeight": "рост",
"infoWeight": "вес",
"btnEdit": "редактировать",
"btnAdd": "добавить",
"btnDetail": "Подробнее",
"btnDeleteAccount": "Удалить аккаунт",
"btnLogOut": "Выйти из системы",
"countIntake": "Потребление",
"countCalorieIntake": "Потребление калорий",
"countMealdetails": "Детали питания",
"countAddFood": "Добавить еду",
"countNutritionalProportion": "доля питательных веществ",
"countComponentStatistics": "статистика компонентов",
"countCalorieAnalysis": "Анализ калорий",
"countNutrientElementEnergyProportion": "Доля энергии питательных веществ",
"countNutritionClassification": "Классификация питательных веществ",
"countNutritionElementRankingList": "Рейтинг питательных элементов",
"countFoodTypes": "Типы пищи",
"total": "на",
"records": "Запись.",
"Search": "поиск",
"VoiceSearch": "Поиск голоса",
"Save": "сохран",
"noMoreData": "Больше данных нет",
"HistoricalSearch": "Поиск истории",
"wantSearch": "Полагаю, вы хотите обыскать",
"verifyCalorie": "Введите калории.",
"kcal": "Калории.",
"countNoFood": "Пока нет еды.",
"msgLoginTips": "Проверьте больше после входа",
"Nutrients": "Питательные вещества.",
"Content": "содержан",
"CaloriesAndnutrients": "Тепло и питание",
"ImproveInformation": "Усовершенствовать информацию",
"WhetherTodelete": "Удалить",
"BusinessCooperation": "Деловое сотрудничество.",
"verifyActivityCoefficient": "Пожалуйста, выберите коэффициент активности",
"devicesTips":"Устройство не зарегистрировано, пожалуйста, свяжитесь с продавцом для системной аутентификации",
"kg": "kg",
"g": "g",
"oz": "oz",
"ml": "ml",
"lb": "lb",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb"
}

15
language/zh-Hant.json Normal file
View File

@ -0,0 +1,15 @@
{
"index.title": "Hello i18n",
"index.home": "主頁",
"index.component": "組件",
"index.api": "API",
"index.schema": "Schema",
"index.demo": "uni-app 國際化演示",
"index.demo-description": "包含 uni-framework、manifest.json、pages.json、tabbar、頁面、組件、API、Schema",
"index.detail": "詳情",
"index.language": "語言",
"index.language-info": "語言信息",
"index.system-language": "系統語言",
"index.application-language": "應用語言",
"index.language-change-confirm": "應用此設置將重啟App"
}

164
language/zh.json Normal file
View File

@ -0,0 +1,164 @@
{
"msgTitle": "友情提示",
"msgUpgradeFail": "升级失败",
"msgDownloading": "正在下载",
"msgLatestVersion": "已经是最新版本了!",
"msgCancel": "您已取消操作!",
"msgLoginSuccess": "登录成功!",
"msgDelete": "删除成功",
"msgSetSuccess": "设置成功",
"msgBottom": "到底了,看看别的吧",
"msgNoMoreData": "暂无数据!",
"msgSetPasswordSuccess": "密码设置成功,进入程序中!",
"msgAddUser": "暂无成员,请先添加",
"verifyNickName": "请输入昵称",
"verifyNotOptional": "未来日期不可选",
"verifyDate": "请选择测量日期",
"verifyBirthday": "请选择出生日期",
"verifyHeight": "请输入身高",
"verifyWeight": "请输入体重",
"verifyGender": "请选择性别",
"verifyBontrast": "请选择数据",
"verifyBodyDate": "请选择正确的时间",
"verifyRecord": "请输入",
"verifyPicker": "请选择",
"verifyAccount": "请输入正确的手机号或邮箱",
"verifyEmail": "请输入邮箱",
"verifyEmailCorrect": "请输入正确的邮箱",
"verifyMobile": "请输入手机号",
"verifyMobileCorrect": "请输入正确的手机号",
"verifyCode": "请输入验证码",
"verifyPassword": "请输入密码",
"verifyPasswordTwo": "请输入确认密码",
"verifyPasswordCorrect": "请确认两次密码填写一致",
"verifyAgreement": "请先确认并勾选协议",
"verifyOutLogin": "是否退出登录?",
"verifyDeleteUser": "是否删除该成员?",
"verifyDeleteHistory": "是否删除当前测量记录?",
"verifyDeleteAccount": "删除成功后,该账号的所有关联信息将被清空且无法找回,是否删除?",
"btnConfirm": "确认",
"btnSubmit": "提交",
"btnSancellation": "取消",
"btnContinue": "继续",
"btnBack": "返回",
"btnDelete": "删除",
"ConnectionTimeout": "连接超时,点击重新连接",
"Measuring": "测量中,请将食物放到秤上",
"Weight": "重量",
"RecordWeight": "请输入食物重量",
"SearchBluetooth": "蓝牙搜索中",
"Remeasure": "数据异常,请重新测量!",
"reset": "数据异常,请清零后重新测量!",
"Disconnect": "断开连接",
"remeasure": "重新测量",
"resetBtn": "清零",
"UnitBtn": "单位",
"titleHome": "首页",
"titleMenu": "菜谱",
"titleMenuAdd": "添加食谱",
"titleMenuSearch": "搜索菜谱",
"titleCount": "计食",
"titleCountList": "食材库",
"titleCustomKcal": "自定义卡路里",
"titleEveryMeal": "餐食详情",
"titleCountSearch": "食材搜索",
"titleeveryDay": "营养分析",
"titleMe": "我的",
"titleDetail": "详情",
"titleBody": "目标",
"titleHistory": "饮食记录",
"titlePhone": "绑定手机号",
"titleEmail": "绑定邮箱",
"titlePasswordEdit": "修改密码",
"titleSet": "设置",
"titleDate": "日期",
"titleMember": "资料",
"titleManage": "成员管理",
"titleManageAdd": "添加成员",
"titleAboutUs": "关于我们",
"titleSetPassword": "设置密码",
"titlePassword": "密码",
"titleConfirmPassword": "确认密码",
"titleForgotPassword": "忘记密码",
"titleCode": "验证码",
"titleLanguage": "语言设置",
"titleSendCode": "获取验证码",
"titleSendCodeRetry": "S后重发",
"titleLogin": "登录",
"titleRegister": "注册",
"titleToggleLogin": "切换登录",
"titleAccountText": "手机号/邮箱",
"titleAgreementText": "阅读并同意",
"titleAgreementContntText": "隐私协议",
"titleVersionUpdate": "版本更新",
"titleNewVersion": "新版本",
"infoActivityCoefficient": "活动系数",
"infoPersonalProfile": "个人资料",
"infoMyRecipes": "我的菜谱",
"infoMyCollection": "我的收藏",
"infoAvatar": "头像",
"infoNickname": "昵称",
"infoMobile": "手机号",
"infoEmail": "邮箱",
"infoAge": "年龄",
"infoAgeunit": "岁",
"infoGender": "性别",
"infoMan": "男",
"infoWoman": "女",
"infoUnknown": "未知",
"infoBirthday": "出生日期",
"infoHeight": "身高",
"infoWeight": "体重",
"btnEdit": "编辑",
"btnAdd": "添加",
"btnDetail": "查看详情",
"btnDeleteAccount": "删除账号",
"btnLogOut": "退出登录",
"countIntake": "摄入",
"countCalorieIntake": "热量摄入",
"countMealdetails": "餐食详情",
"countAddFood": "添加食物",
"countNutritionalProportion": "营养占比",
"countComponentStatistics": "成分统计",
"countCalorieAnalysis": "卡路里分析",
"countNutrientElementEnergyProportion": "营养元素能量占比",
"countNutritionClassification": "营养分类",
"countNutritionElementRankingList": "营养元素排行榜",
"countFoodTypes": "食物类型",
"total": "共",
"records": "条记录",
"Search": "搜索",
"VoiceSearch": "语音搜索",
"Save": "保存",
"noMoreData": "没有更多数据了",
"HistoricalSearch": "历史搜索",
"wantSearch": "猜你想搜",
"verifyCalorie": "请输入卡路里",
"kcal": "卡路里",
"countNoFood": "暂无食物",
"msgLoginTips": "登录后查看更多",
"Nutrients": "营养素",
"Content": "含量",
"CaloriesAndnutrients": "热量和营养",
"ImproveInformation": "完善信息",
"WhetherTodelete": "是否删除",
"BusinessCooperation": "商务合作",
"verifyActivityCoefficient": "请选择活动系数",
"devicesTips": "设备未登记,请联系出售方进行系统认证",
"kg": "千克",
"g": "克",
"oz": "盎司",
"ml": "毫升",
"lb": "磅",
"milkml": "milkml",
"Waterml": "Waterml",
"floz": "floz",
"lboz": "lboz",
"st": "st:lb",
"measuringRecord": "测量记录",
"newVersion": "发现新版本",
"IsUpdate": "是否更新?",
"UpdateProgram":"稍后可在'关于我们'内更新程序!"
}

18
main.js
View File

@ -18,15 +18,28 @@ Vue.prototype.$ble = useBluetooth;
import video from '@/video.json' import video from '@/video.json'
Vue.prototype.$video = video; Vue.prototype.$video = video;
// 语言
import messages from '@/language/index.js'
let i18nConfig = {
locale: uni.getLocale(),
messages
}
//模拟数据 //模拟数据
import json from '@/content.json' import json from '@/content.json'
Vue.prototype.$json = json; Vue.prototype.$json = json;
// #ifndef VUE3 // #ifndef VUE3
import Vue from 'vue' import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n(i18nConfig)
Vue.config.productionTip = false Vue.config.productionTip = false
App.mpType = 'app' App.mpType = 'app'
const app = new Vue({ const app = new Vue({
i18n,
...App ...App
}) })
app.$mount() app.$mount()
@ -36,8 +49,13 @@ app.$mount()
import { import {
createSSRApp createSSRApp
} from 'vue' } from 'vue'
import {
createI18n
} from 'vue-i18n'
const i18n = createI18n(i18nConfig)
export function createApp() { export function createApp() {
const app = createSSRApp(App) const app = createSSRApp(App)
app.use(i18n)
return { return {
app app
} }

View File

@ -9,14 +9,14 @@
<text class="t-icon t-icon-arrow-right-bold"></text> <text class="t-icon t-icon-arrow-right-bold"></text>
</view> </view>
<view class="top top2" v-else @click="handleLogin"> <view class="top top2" v-else @click="handleLogin">
登录后查看更多 {{$t('msgLoginTips')}}
</view> </view>
<!-- --> <!-- -->
<view class="wxlist borderRadius"> <view class="wxlist borderRadius">
<view class="list" @click="navTo('/body/my/manage')"> <view class="list" @click="navTo('/body/my/manage')">
<view class="item border-bottom"> <view class="item border-bottom">
<view class="left"> <view class="left">
<view class="name">成员管理</view> <view class="name">{{$t('titleManage')}}</view>
</view> </view>
<view class="right"> <view class="right">
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
@ -27,7 +27,7 @@
<view class="list" @click="navTo('/body/history/history')"> <view class="list" @click="navTo('/body/history/history')">
<view class="item border-bottom"> <view class="item border-bottom">
<view class="left"> <view class="left">
<view class="name">测量记录</view> <view class="name">{{$t('measuringRecord')}}</view>
</view> </view>
<view class="right"> <view class="right">
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
@ -37,7 +37,7 @@
<view class="list" @click="navTo('/Food/me/mymenu?pageName=我的收藏')"> <view class="list" @click="navTo('/Food/me/mymenu?pageName=我的收藏')">
<view class="item border-bottom"> <view class="item border-bottom">
<view class="left"> <view class="left">
<view class="name">我的收藏</view> <view class="name">{{$t('infoMyCollection')}}</view>
</view> </view>
<view class="right"> <view class="right">
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
@ -47,25 +47,39 @@
<view class="list" @click="navTo('/Food/me/record')"> <view class="list" @click="navTo('/Food/me/record')">
<view class="item border-bottom"> <view class="item border-bottom">
<view class="left"> <view class="left">
<view class="name">饮食记录</view> <view class="name">{{$t('titleHistory')}}</view>
</view> </view>
<view class="right"> <view class="right">
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</view> </view>
</view> </view>
</view> </view>
<!-- #ifdef APP-PLUS -->
<view class="list" @click="navTo('/body/my/about')"> <view class="list" @click="navTo('/body/my/about')">
<view class="item border-bottom"> <view class="item border-bottom">
<view class="left"> <view class="left">
<view class="name">关于我们</view> <view class="name">{{$t('titleAboutUs')}}</view>
</view> </view>
<view class="right"> <view class="right">
<uni-icons type="right"></uni-icons> <uni-icons type="right"></uni-icons>
</view> </view>
</view> </view>
</view> </view>
<!-- #endif --> <view class="list">
<view class="item border-bottom">
<view class="left">
<view class="name">{{$t('titleLanguage')}}</view>
</view>
<view class="right">
<picker mode="selector" @change="changeClickLanguage" :range="languageList" range-key="name"
:value="levelInd">
<view>
{{languageList[levelInd].name}}
<uni-icons type="right"></uni-icons>
</view>
</picker>
</view>
</view>
</view>
<view class="list" v-for="(ite,ind) in CooperationUrl" :key="ind"> <view class="list" v-for="(ite,ind) in CooperationUrl" :key="ind">
<view class="item border-bottom" @click="navTo('/body/webview/webview?url=' + ite.url)"> <view class="item border-bottom" @click="navTo('/body/webview/webview?url=' + ite.url)">
<view class="left"> <view class="left">
@ -77,7 +91,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="btn mb-15" v-if="token" @click="handleOutLogin">退出登录</view> <view class="btn mb-15" v-if="token" @click="handleOutLogin">{{$t('btnLogOut')}}</view>
</view> </view>
</template> </template>
@ -89,16 +103,29 @@
data() { data() {
return { return {
token: "", token: "",
user: {} user: {},
levelInd: 0,
} }
}, },
computed: { computed: {
...mapState(["accountNumber", "familayList", "CooperationUrl", ]), ...mapState(["accountNumber", "familayList", "CooperationUrl", "setLocale", "configInfo"]),
nickname() { nickname() {
return this.accountNumber.nickname return this.accountNumber.nickname
}, },
userList() { userList() {
return this.familayList return this.familayList
},
languageList() {
let that = this
let languageList = this.configInfo.language_arr
that.levelInd = languageList.findIndex(ite => ite.key == that.setLocale)
return this.configInfo.language_arr
}
},
watch: {
nickname() {
this.user = {}
this.user = this.accountNumber
} }
}, },
onLoad() { onLoad() {
@ -106,11 +133,9 @@
that.token = uni.getStorageSync('token') that.token = uni.getStorageSync('token')
that.handleAccountNumber() that.handleAccountNumber()
}, },
watch: { onShow() {
nickname() { let that = this
this.user = {} that.token = uni.getStorageSync('token')
this.user = this.accountNumber
}
}, },
onPullDownRefresh() { onPullDownRefresh() {
let that = this let that = this
@ -136,8 +161,10 @@
handleOutLogin() { handleOutLogin() {
let that = this let that = this
uni.showModal({ uni.showModal({
title: '友情提示', title: that.$t('msgTitle'),
content: '是否退出登录?', content: that.$t('verifyOutLogin'),
cancelText: that.$t('btnSancellation'),
confirmText: that.$t('btnConfirm'),
success: function(res) { success: function(res) {
if (res.confirm) { if (res.confirm) {
that.$model.getloginOut({}).then((res) => { that.$model.getloginOut({}).then((res) => {
@ -152,11 +179,48 @@
}) })
}) })
} else if (res.cancel) { } else if (res.cancel) {
that.$tools.msg("您已取消操作!"); that.$tools.msg($t('msgCancel'));
} }
}, },
}) })
}, },
//
changeClickLanguage(e) {
let that = this
let key = that.languageList[e.target.value].key
let val = that.languageList[e.target.value].val
that.levelInd = e.target.value
that.$model.getSetLanguage({
language: val,
}).then(res => {
that.$i18n.locale = key
uni.setStorageSync('language', key)
that.$store.commit('changeLocale', key)
that.$store.dispatch("getHomeConfig")
that.$tools.handleUserList()
that.handleTabBarItem()
setTimeout(() => {
uni.reLaunch({
url: '/pages/index/index'
})
}, 500)
})
},
handleTabBarItem() {
let that = this
uni.setTabBarItem({
index: 0,
text: that.$t('titleHome')
})
uni.setTabBarItem({
index: 1,
text: that.$t('titleCount')
})
uni.setTabBarItem({
index: 2,
text: that.$t('titleMe')
})
},
handleLogin() { handleLogin() {
uni.navigateTo({ uni.navigateTo({
url: "/body/login/login" url: "/body/login/login"
@ -166,7 +230,7 @@
navTo(url) { navTo(url) {
let that = this let that = this
if (!that.token) { if (!that.token) {
that.$tools.msg("登录后查看更多!") that.$tools.msg(that.$t('msgLoginTips'))
return return
} }
uni.navigateTo({ uni.navigateTo({

View File

@ -1,2 +1,2 @@
## reedaw 国内版 ## reedaw 国内版
小程序+app 纯中文锐动+厨房秤结合版 锐动+厨房秤结合版 多语言 纯APP

View File

@ -8,6 +8,47 @@ export default {
dispatch dispatch
}) { }) {
return model.getHomeConfig({}).then(res => { return model.getHomeConfig({}).then(res => {
res.data.language_arr = [{
"name": "中文",
"val": "zh",
"key": "zh"
}, {
"name": "English",
"val": "en",
"key": "en"
}, {
"name": "日本語(Japanese)",
"val": "jp",
"key": "ja"
}, {
"name": "Français(French)",
"val": "fra",
"key": "fr"
}, {
"name": "Deutsch(German)",
"val": "de",
"key": "de"
}, {
"name": "한국어(Korean)",
"val": "kor",
"key": "ko"
}, {
"name": "Русский(Russian)",
"val": "ru",
"key": "ru"
}, {
"name": "Português(Portuguese)",
"val": "pt",
"key": "pt"
}, {
"name": "Español(Spanish)",
"val": "spa",
"key": "es"
}, {
"name": "Arabic(العربية)",
"val": "ara",
"key": "ar"
}]
commit('changeConfigInfo', res.data) commit('changeConfigInfo', res.data)
return res.data return res.data
}) })

View File

@ -31,6 +31,7 @@ export default new Vuex.Store({
area_list: [], area_list: [],
banner: [], banner: [],
meal_list: [], meal_list: [],
language_arr: [],
literature: { literature: {
index: [], index: [],
bmi_evaluation: [], bmi_evaluation: [],
@ -122,6 +123,7 @@ export default new Vuex.Store({
isPublicRecord: false, //公共手动记录弹框 isPublicRecord: false, //公共手动记录弹框
isBluetoothTyle: false, isBluetoothTyle: false,
isConnected: false, isConnected: false,
setLocale: "zh",
trendInfo: { trendInfo: {
weightList: [], weightList: [],
target_weight: "", target_weight: "",
@ -227,6 +229,11 @@ export default new Vuex.Store({
state.isPublicRecord = newData state.isPublicRecord = newData
}, },
// 设置语言
changeLocale(state, newData) {
state.setLocale = newData
},
// 计时 // 计时
changeConfigInfo(state, newData) { changeConfigInfo(state, newData) {
state.configInfo = newData state.configInfo = newData

View File

@ -1,6 +1,7 @@
import $store from '@/store' import $store from '@/store'
import $tools from '@/toolJs/tools.js' import $tools from '@/toolJs/tools.js'
import $model from '@/toolJs/model.js' import $model from '@/toolJs/model.js'
import messages from '@/language/index.js'
export default { export default {
msg, msg,
toHex, toHex,
@ -79,10 +80,13 @@ function msg(str) {
} }
function showModal(text) { function showModal(text) {
let Language = $store.state.setLocale
let $t = messages[Language]
uni.showModal({ uni.showModal({
title: "提示", title: $t('msgTitle'),
content: text, content: text,
showCancel: false, showCancel: false,
confirmText: $t('btnConfirm'),
success: function(res) { success: function(res) {
if (res.confirm) { if (res.confirm) {
uni.switchTab({ //返回 uni.switchTab({ //返回
@ -95,6 +99,8 @@ function showModal(text) {
// 版本对比 // 版本对比
function compareVersions(version1, version2) { function compareVersions(version1, version2) {
console.log("版本对比", version1, version2) console.log("版本对比", version1, version2)
let Language = $store.state.setLocale
let $t = messages[Language]
// 将版本号拆分成数字数组 // 将版本号拆分成数字数组
var arr1 = version1.split('.').map(Number); var arr1 = version1.split('.').map(Number);
var arr2 = version2.split('.').map(Number); var arr2 = version2.split('.').map(Number);
@ -108,8 +114,8 @@ function compareVersions(version1, version2) {
if (num1 < num2) { if (num1 < num2) {
// 版本1小于版本2 // 版本1小于版本2
return uni.showModal({ return uni.showModal({
title: '发现新版本', title: that.$t('newVersion'),
content: '检查到新版本' + version2 + ',是否更新?', content: that.$t('newVersion') + version2 + that.$t('IsUpdate'),
success: (modalRes) => { success: (modalRes) => {
if (modalRes.confirm) { //确定更新 if (modalRes.confirm) { //确定更新
if (platform === 'android') { //安卓更新 if (platform === 'android') { //安卓更新
@ -122,7 +128,7 @@ function compareVersions(version1, version2) {
}) })
} }
} else { } else {
that.$tools.msg("稍后可在'关于我们'内更新程序!") that.$tools.msg(that.$t('UpdateProgram'))
} }
} }
}); });

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More