From 92b689617658aa5f33a113c59458fa96681b4702 Mon Sep 17 00:00:00 2001 From: czz <862977248@qq.com> Date: Mon, 28 Jul 2025 10:48:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=AD=E8=A8=80=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chinese_texts.json | 479 +++++++++++++++++++++++ lib/pages/mh_page/LanguagePage.dart | 355 +++++++++-------- lib/pages/mh_page/apply_repair_page.dart | 15 - tool/add_tr_to_chinese.dart | 204 ++++++++-- tool/extract_chinese.dart | 35 +- 5 files changed, 872 insertions(+), 216 deletions(-) create mode 100644 chinese_texts.json diff --git a/chinese_texts.json b/chinese_texts.json new file mode 100644 index 0000000..d44f3dd --- /dev/null +++ b/chinese_texts.json @@ -0,0 +1,479 @@ +{ + "语言名称": "简体中文", + "网页载入完毕": "网页载入完毕", + "关于我们": "关于我们", + "地址管理": "地址管理", + "添加新地址": "添加新地址", + "默认": "默认", + "无详细地址": "无详细地址", + "编辑": "编辑", + "报修成功标题": "报修成功标题", + "报修成功": "报修成功", + "查看报修历史": "查看报修历史", + "返回": "返回", + "申请报修": "申请报修", + "选择需要报修的设备": "选择需要报修的设备", + "已绑设备": "已绑设备", + "未知MAC": "未知MAC", + "未知型号": "未知型号", + "暂无可选设备": "暂无可选设备", + "请选择绑定设备": "请选择绑定设备", + "查找": "查找", + "设备系列": "设备系列", + "产品型号": "产品型号", + "序列号": "序列号", + "上传设备故障照片": "上传设备故障照片", + "请描述一下您的问题": "请描述一下您的问题", + "问题描述(100个字以内)": "问题描述(100个字以内)", + "联系方式": "联系方式", + "联系人": "联系人", + "手机号码": "手机号码", + "提交报修信息": "提交报修信息", + "提交申请": "提交申请", + "请输入设备系列!": "请输入设备系列!", + "请输入设备型号!": "请输入设备型号!", + "请输入设备序列号id!": "请输入设备序列号id!", + "请输入姓名!": "请输入姓名!", + "姓名必须为2到4个汉字!": "姓名必须为2到4个汉字!", + "请输入手机号!": "请输入手机号!", + "无效的手机号!": "无效的手机号!", + "请输入问题描述!": "请输入问题描述!", + "请至少上传一张问题图片!": "请至少上传一张问题图片!", + "体征检测设备": "体征检测设备", + "智能床": "智能床", + "智能床垫": "智能床垫", + "未知设备": "未知设备", + "百度地图": "百度地图", + "腾讯地图": "腾讯地图", + "高德地图": "高德地图", + "Apple地图": "Apple地图", + "Google地图": "Google地图", + "Google地图Go": "Google地图Go", + "Petal地图": "Petal地图", + "背部律动": "背部律动", + "力度调节": "力度调节", + "强": "强", + "弱": "弱", + "按摩定时": "按摩定时", + "恢复到默认设置": "恢复到默认设置", + "设置": "设置", + "未命名": "未命名", + "已连接": "已连接", + "未连接": "未连接", + "详情": "详情", + "人员资料": "人员资料", + "房间选择": "房间选择", + "设备校准": "设备校准", + "体征传感器": "体征传感器", + "WIFI配置": "WIFI配置", + "分享设备": "分享设备", + "解绑": "解绑", + "删除": "删除", + "是否进行解绑?": "是否进行解绑?", + "是否进行删除?": "是否进行删除?", + "我要预约": "我要预约", + "体验日期": "体验日期", + "体验时段": "体验时段", + "请选择时间": "请选择时间", + "体验人员": "体验人员", + "输入姓名": "输入姓名", + "手机号": "手机号", + "输入手机号": "输入手机号", + "提交预约": "提交预约", + "预约编号:": "预约编号:", + "预约人员:": "预约人员:", + "张大大": "张大大", + "手机号码:": "手机号码:", + "体验时间:": "体验时间:", + "预约门店:": "预约门店:", + "SWES眠花糖杭州南星桥旗舰店": "SWES眠花糖杭州南星桥旗舰店", + "门店地址:": "门店地址:", + "浙江省杭州市上城区飞云江路45号一层": "浙江省杭州市上城区飞云江路45号一层", + "预约成功!": "预约成功!", + "关闭": "关闭", + "我的预约": "我的预约", + "双人版绑定标题": "双人版绑定标题", + "绑定全部": "绑定全部", + "主设备": "主设备", + "可绑定": "可绑定", + "已被绑定": "已被绑定", + "从设备": "从设备", + "确定": "确定", + "取消": "取消", + "无法绑定": "无法绑定", + "无法绑定1": "无法绑定1", + "无法绑定2": "无法绑定2", + "无法绑定3": "无法绑定3", + "tr +": "tr +", + "否": "否", + "是": "是", + "密码为空": "密码为空", + "连接": "连接", + "继续": "继续", + "下次再说": "下次再说", + "注销账号": "注销账号", + "注销智慧眠花糖账号": "注销智慧眠花糖账号", + "账号注销后,你将无法使用以下功能,": "账号注销后,你将无法使用以下功能,", + "并且当前有绑定以及被分享的智能床、智能床垫等设备的账号不能注销": "并且当前有绑定以及被分享的智能床、智能床垫等设备的账号不能注销", + ",可先进行解绑后再进行注销操作。": ",可先进行解绑后再进行注销操作。", + "无法控制智能床、智能床垫等设备": "无法控制智能床、智能床垫等设备", + "你将无法控制你的智能床、智能床垫等设备,以及与其相关的各种操作。": "你将无法控制你的智能床、智能床垫等设备,以及与其相关的各种操作。", + "无法查询睡眠报告和体征数据": "无法查询睡眠报告和体征数据", + "注销账号后你将查询不到你以前的睡眠报告和实时数据。": "注销账号后你将查询不到你以前的睡眠报告和实时数据。", + "无法使用的其他功能": "无法使用的其他功能", + "包含设备报修、门店体验预约等。": "包含设备报修、门店体验预约等。", + "信号强度": "信号强度", + "设备状态": "设备状态", + "其他设备正在绑定中,是否终止其他设备绑定?": "其他设备正在绑定中,是否终止其他设备绑定?", + "是否确认绑定?": "是否确认绑定?", + "连接异常": "连接异常", + "用户点击了取消": "用户点击了取消", + "添加": "添加", + "更新用户绑定流程": "更新用户绑定流程", + "默认设备名称": "默认设备名称", + "SN": "SN", + "蓝牙地址": "蓝牙地址", + "mac": "mac", + "网络": "网络", + "在线": "在线", + "离线": "离线", + "传感器": "传感器", + "版本": "版本", + "蓝牙连接失败": "蓝牙连接失败", + "不支持的设备类型": "不支持的设备类型", + "未能获取到MAC地址": "未能获取到MAC地址", + "获取不到传感器mac,请重试": "获取不到传感器mac,请重试", + "获取设备状态": "获取设备状态", + "获取设备状态失败": "获取设备状态失败", + "获取MAC失败": "获取MAC失败", + "获取MAC超时": "获取MAC超时", + "BLE返回数据格式不正确": "BLE返回数据格式不正确", + "数据长度不足,无法解析MAC": "数据长度不足,无法解析MAC", + "未连接心率带": "未连接心率带", + "获取设备状态异常": "获取设备状态异常", + "设备状态请求失败": "设备状态请求失败", + "请求失败": "请求失败", + "未知错误": "未知错误", + "传感器mac读取失败": "传感器mac读取失败", + "绑定成功": "绑定成功", + "服务器失败": "服务器失败", + "更新睡眠习惯": "更新睡眠习惯", + "TopSlideNotification 未显示:context 不可用或未挂载": "TopSlideNotification 未显示:context 不可用或未挂载", + "设备ID": "设备ID", + "房间": "房间", + "未分配房间": "未分配房间", + "已绑定": "已绑定", + "控制": "控制", + "已分享:": "已分享:", + "人": "人", + "来自": "来自", + "的分享": "的分享", + "睡眠报告": "睡眠报告", + "未知类型设备": "未知类型设备", + "SWES 智能床": "SWES 智能床", + "SWES 智能床垫": "SWES 智能床垫", + "标题": "标题", + "分享标题": "分享标题", + "分享内容": "分享内容", + "立即分享": "立即分享", + "失败": "失败", + "添加设备": "添加设备", + "选择类型": "选择类型", + "权限提示": "权限提示", + "应用需要蓝牙和位置权限才能扫描设备。请授予权限。": "应用需要蓝牙和位置权限才能扫描设备。请授予权限。", + "蓝牙未开启": "蓝牙未开启", + "请先打开蓝牙在进行设备扫描": "请先打开蓝牙在进行设备扫描", + "等待扫描": "等待扫描", + "扫描中": "扫描中", + "最小信号强度": "最小信号强度", + "检索设备": "检索设备", + "匹配出的外围设备": "匹配出的外围设备", + "蓝牙绑定提示": "用手机进行设备添加时,请打开手机蓝牙搜索,靠近目标位置3米以内进行。", + "校准未完成提示": "校准还未完成,是否确认退出校准流程?", + "下一步": "下一步", + "离床校准": "离床校准", + "未完成": "未完成", + "已完成": "已完成", + "位置校准": "位置校准", + "床头": "床头", + "校准完成": "校准完成", + "校准失败": "校准失败", + "离床校准提示": "请校准人员暂时离开床铺且在校准期间保持周围安静", + "位置校准提示": "请校准人员到箭头指定一侧 平躺后点击开始,保持10秒", + "s后超时": "s后超时", + "开始校准": "开始校准", + "重新校准": "重新校准", + "设备校准进度": "设备校准进度", + "设备校准完成": "设备校准完成", + "请校准人员保持在床状态": "请校准人员保持在床状态", + "请校准人员暂时离开床铺": "请校准人员暂时离开床铺", + "请保持身体静止": "请保持身体静止", + "查询绑定流程": "查询绑定流程", + "更新绑定流程": "更新绑定流程", + "请开始B侧校准": "请开始B侧校准", + "请校准人员到箭头指定一侧平躺 保持静止后点击开始,保持10秒": "请校准人员到箭头指定一侧平躺 保持静止后点击开始,保持10秒", + "开始另外一侧校准": "开始另外一侧校准", + "单侧校准完成,请移动到另外一侧": "单侧校准完成,请移动到另外一侧", + "保存用户信息": "保存用户信息", + "保存成功": "保存成功", + "姓名": "姓名", + "请输入姓名": "请输入姓名", + "女": "女", + "男": "男", + "性别": "性别", + "身高(cm)": "身高(cm)", + "体重(kg)": "体重(kg)", + "生日": "生日", + "yyyy年MM月dd日": "yyyy年MM月dd日", + "请输入联系方式": "请输入联系方式", + "未配置网络提示": "未配置网络提示", + "wifi配置": "wifi配置", + "可用WLAN": "可用WLAN", + "输入wifi密码": "输入wifi密码", + "配网成功": "配网成功", + "配网失败": "配网失败", + "4g设备配置wifi提示": "4g设备配置wifi提示", + "获取设备网络类型失败": "获取设备网络类型失败", + "刷新": "刷新", + "获取wifi列表成功": "获取wifi列表成功", + "获取wifi列表失败": "获取wifi列表失败", + "设备连接超时,请重试": "设备连接超时,请重试", + "连接成功": "连接成功", + "连接失败": "连接失败", + "设备连接失败": "设备连接失败", + "扫描过程中发生错误": "扫描过程中发生错误", + "关闭蓝牙连接成功": "关闭蓝牙连接成功", + "设备列表": "设备列表", + "设备信息": "设备信息", + "将以下设备分享给您的家人或朋友": "将以下设备分享给您的家人或朋友", + "请输入对方手机号/邮箱号": "请输入对方手机号/邮箱号", + "点击复制APP下载链接": "点击复制APP下载链接", + "允许对方控制和查看该设备": "允许对方控制和查看该设备", + "仅允许对方查看该设备": "仅允许对方查看该设备", + "发送邀请": "发送邀请", + "已分享用户": "已分享用户", + "请选择省": "请选择省", + "请选择市": "请选择市", + "请选择地区": "请选择地区", + "请选择街道": "请选择街道", + "编辑地址": "编辑地址", + "地址信息": "地址信息", + "收件人": "收件人", + "所在地区": "所在地区", + "详细地址": "详细地址", + "地址不能为空": "地址不能为空", + "名字不能为空": "名字不能为空", + "详细地址不能为空": "详细地址不能为空", + "手机号不能为空": "手机号不能为空", + "无效的手机号码": "无效的手机号码", + "保存": "保存", + "智能设备名称": "智能设备名称", + "智能电动床": "智能电动床", + "律动智能床垫": "律动智能床垫", + "更新设备信息": "更新设备信息", + "修改名称成功": "修改名称成功", + "请输入设备的名称": "请输入设备的名称", + "完成": "完成", + "预约体验": "预约体验", + "待开发功能": "待开发功能", + "请输入门店名称": "请输入门店名称", + "咨询": "咨询", + "未检测到导航软件": "未检测到导航软件", + "选择地图": "选择地图", + "导航": "导航", + "预约": "预约", + "问题与帮助": "问题与帮助", + "设备列表请求失败": "设备列表请求失败", + "设备列表请求成功": "设备列表请求成功", + "请求成功": "请求成功", + "用户操作:解绑设备": "用户操作:解绑设备", + "操作失败": "操作失败", + "操作成功": "操作成功", + "请求人员信息列表": "请求人员信息列表", + "请求睡眠信息列表": "请求睡眠信息列表", + "更新控制倒计时": "更新控制倒计时", + "查询控制倒计时": "查询控制倒计时", + "请先": "请先", + "登录": "登录", + "后,再查看睡眠报告": "后,再查看睡眠报告", + "健康报告": "健康报告", + "暂无数据": "暂无数据", + "发现新版本": "发现新版本", + "知道了": "知道了", + "周一": "周一", + "周二": "周二", + "周三": "周三", + "周四": "周四", + "周五": "周五", + "周六": "周六", + "周日": "周日", + "添加新设备": "添加新设备", + "暂无内容!": "暂无内容!", + "切换语言": "切换语言", + "左": "左", + "全局": "全局", + "右": "右", + "一键助眠": "一键助眠", + "疲劳缓解": "疲劳缓解", + "全身放松": "全身放松", + "腿部律动": "腿部律动", + "垂直律动": "垂直律动", + "加热": "加热", + "柔性唤醒": "柔性唤醒", + "记忆": "记忆", + "消息详情": "消息详情", + "同意": "同意", + "已同意": "已同意", + "已过期": "已过期", + "未知状态": "未知状态", + "消息中心": "消息中心", + "全部已读": "全部已读", + "系统消息": "系统消息", + "体征消息": "体征消息", + "查看详情": "查看详情", + "未知数据": "未知数据", + "无需处理": "无需处理", + "待处理": "待处理", + "已处理": "已处理", + "已超时": "已超时", + "取消预约": "取消预约", + "必须登录提示": "请先登录", + "微信用户": "微信用户", + "我的智能设备": "我的智能设备", + "我绑定或关联的智能床,智能床垫等智能设备": "我绑定或关联的智能床,智能床垫等智能设备", + "门店体验": "门店体验", + "如果想免费体验智能设备,可在此进行提前预约": "如果想免费体验智能设备,可在此进行提前预约", + "设备报修": "设备报修", + "当您的智能设备需要报修时,可以通过该功能联系解决,": "当您的智能设备需要报修时,可以通过该功能联系解决,", + "网上商城": "网上商城", + "最新的智能产品线上购买服务": "最新的智能产品线上购买服务", + "用于收货和报修时联系您": "用于收货和报修时联系您", + "常见的问题汇总,如:智能床连接流程、如何查看睡眠报告": "常见的问题汇总,如:智能床连接流程、如何查看睡眠报告", + "在线客服": "在线客服", + "购买和使用智能床过程中,如果遇到疑问可与客服进行联系": "购买和使用智能床过程中,如果遇到疑问可与客服进行联系", + "修改密码": "修改密码", + "点击了容器": "点击了容器", + "当前版本": "当前版本", + "简体中文": "简体中文", + "用户协议": "用户协议", + "隐私协议": "隐私协议", + "退出登录": "退出登录", + "ICP备案号:浙ICP备2023000785号-1": "ICP备案号:浙ICP备2023000785号-1", + "Copyright © 202-2025 嘉兴太和信息技术有限责任公司 版权所有": "Copyright © 202-2025 嘉兴太和信息技术有限责任公司 版权所有", + "Copyright © 202-2025 杭州欢睡科技有限公司 版权所有": "Copyright © 202-2025 杭州欢睡科技有限公司 版权所有", + "请选择身高": "请选择身高", + "请选择体重": "请选择体重", + "请输入正确的联系人电话": "请输入正确的联系人电话", + "更新失败": "更新失败", + "系列:": "系列:", + "型号:": "型号:", + "序列号:": "序列号:", + "报修单号:": "报修单号:", + "提交时间:": "提交时间:", + "问题描述:": "问题描述:", + "报修状态": "报修状态", + "页面返回事件": "页面返回事件", + "审核中": "审核中", + "审核通过": "审核通过", + "维修中": "维修中", + "维修完成": "维修完成", + "已评价": "已评价", + "报修须知": "报修须知", + "尊敬的用户,感谢您选择我司产品。在使用过程中,如果设备出现故障需要维修,请首先确认设备是否正确连接控制器或网络,检查设置是否正常,排除误操作问题。若问题依然存在,请记录下设备名称、设备编号、和具体故障内容,方便我们快速地为您提供帮助。您可以通过智慧棉花糖APP保修页面直接报修或拨打": "尊敬的用户,感谢您选择我司产品。在使用过程中,如果设备出现故障需要维修,请首先确认设备是否正确连接控制器或网络,检查设置是否正常,排除误操作问题。若问题依然存在,请记录下设备名称、设备编号、和具体故障内容,方便我们快速地为您提供帮助。您可以通过智慧棉花糖APP保修页面直接报修或拨打", + "反馈。": "反馈。", + "我要报修": "我要报修", + "报修历史": "报修历史", + "亩核通过": "亩核通过", + "查询房间列表": "查询房间列表", + "更新成功": "更新成功", + "评价": "评价", + "我要评价": "我要评价", + "差": "差", + "较差": "较差", + "一般": "一般", + "优秀": "优秀", + "完美": "完美", + "未评分": "未评分", + "再多的溢美之词,都比不上您真心的评价。我们愿付出200%的努力,只为您100%的满意~感谢您的支持与厚爱!": "再多的溢美之词,都比不上您真心的评价。我们愿付出200%的努力,只为您100%的满意~感谢您的支持与厚爱!", + "提交": "提交", + "请输入关键字": "请输入关键字", + "搜索": "搜索", + "解除分享": "解除分享", + "再按一次退出程序": "再按一次退出程序", + "睡眠习惯": "睡眠习惯", + "睡眠隐私": "睡眠隐私", + "睡眠隐私功能": "睡眠隐私功能", + "开始时间": "开始时间", + "结束时间": "结束时间", + "*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。": "*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。", + "查询设备绑定人员列表": "查询设备绑定人员列表", + "未知数据格式": "未知数据格式", + "后,再进行设备控制": "后,再进行设备控制", + "请选择登录方式": "请选择登录方式", + "账户不能为空": "账户不能为空", + "密码不能为空": "密码不能为空", + "请输入手机号": "请输入手机号", + "请输入正确的手机号": "请输入正确的手机号", + "验证码不能为空": "验证码不能为空", + "需要同意协议": "需要同意协议", + "用户登录": "用户登录", + "发送验证码": "发送验证码", + "发送验证码成功": "发送验证码成功", + "请先安装微信APP,再使用微信登录": "请先安装微信APP,再使用微信登录", + "微信登录": "微信登录", + "请先安装微信APP,再联系客服": "请先安装微信APP,再联系客服", + "请输入密码": "请输入密码", + "密码格式提示": "1.密码长度必须至少8位\n2.密码需要字母加数字\n3.特殊字符和大写字母至少包含一个", + "请输入确认密码": "请输入确认密码", + "两次密码不一致": "两次密码不一致", + "请输入验证码": "请输入验证码", + "用户注册": "用户注册", + "注册成功": "注册成功", + "获取验证码": "获取验证码", + "编辑资料": "编辑资料", + "点击更换头像": "点击更换头像", + "找回密码": "找回密码", + "请输验证码": "请输验证码", + "网络未连接,请开启设备网络后重试": "网络未连接,请开启设备网络后重试", + "秒": "秒", + "请输入新密码": "请输入新密码", + "确认新密码": "确认新密码", + "用户拒绝授权": "用户拒绝授权", + "用户取消授权": "用户取消授权", + "退出": "退出", + "密码登录": "密码登录", + "短信登录": "短信登录", + "请输入账号": "请输入账号", + "我已阅读并同意": "我已阅读并同意", + "《用户协议》": "《用户协议》", + "与": "与", + "《隐私协议》": "《隐私协议》", + "注:首次登录会自动创建账号": "注:首次登录会自动创建账号", + "还没有账号?": "还没有账号?", + "前往注册": "前往注册", + "其他登录方式": "其他登录方式", + "未同意协议": "未同意协议", + "合肥眠花糖家具有限责任公司版权所有": "合肥眠花糖家具有限责任公司版权所有", + "请确认密码": "请确认密码", + "床垫全局": "床垫全局", + "床垫左侧": "床垫左侧", + "床垫右侧": "床垫右侧", + "柔性唤醒功能": "柔性唤醒功能", + "唤醒时间": "唤醒时间", + "开": "开", + "关": "关", + "按摩": "按摩", + "唤醒部位": "唤醒部位", + "自定义": "自定义", + "*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。": "*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。", + "输入手机号码": "输入手机号码", + "输入验证码": "输入验证码", + "输入新密码": "输入新密码", + "更新时间": "更新时间", + "是否在床": "是否在床", + "设备故障": "设备故障", + "网络状态": "网络状态", + "较弱": "较弱", + "离床": "离床", + "在床": "在床" +} \ No newline at end of file diff --git a/lib/pages/mh_page/LanguagePage.dart b/lib/pages/mh_page/LanguagePage.dart index 206660f..4207634 100644 --- a/lib/pages/mh_page/LanguagePage.dart +++ b/lib/pages/mh_page/LanguagePage.dart @@ -1,170 +1,219 @@ import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; +import 'package:flutterflow_ui/flutterflow_ui.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; -import 'package:vbvs_app/controller/mh_controller/message_controller.dart'; - +import 'package:vbvs_app/component/tool/ClickableContainer.dart'; +import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart'; +import 'package:vbvs_app/language/AppLanguage.dart'; +import 'package:vbvs_app/pages/device_bind/componnet/FancyCircleCheckbox.dart'; -class LanguagePage extends GetView { -// @override -// _LanguagePageState createState() => _LanguagePageState(); -// } - MHLanguageController controller = Get.find(); - BoxConstraints? bodysize; - // List languageList = [ - // '简体中文', - // '繁體中文', - // 'English', - // ]; - // final Map languageMap = { - // '简体中文': 'zh_CN', - // '繁體中文': 'zh_TW', - // 'English': 'en_US', - // }; +class LanguagePage extends StatefulWidget { + const LanguagePage({super.key}); + + @override + State createState() => _LanguagePageState(); +} + +class _LanguagePageState extends State { + MHLanguageController languageController = Get.find(); + @override + void initState() { + // languageController.initLanuageList(); + super.initState(); + } -// class _LanguagePageState extends State { - RxBool checkboxValue = false.obs; - RxString? selectLanguage = ''.obs; @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, cc) { - bodysize = cc; - return GestureDetector( - onTap: () { - FocusScope.of(context).requestFocus(FocusNode()); - }, - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/new_background.png'), // 本地图片 - fit: BoxFit.fill, // 填满整个 Container - ), - ), - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: AppBar( - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - automaticallyImplyLeading: false, - titleSpacing: 0, - title: SizedBox( - width: double.infinity, - height: 180.rpx, - child: Stack( - alignment: Alignment.center, - children: [ - // 中间居中的标题 - Text( - '切换语言'.tr, - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 30.rpx, - ), - ), - // 左侧图标 - Positioned( - left: 0.rpx, - child: returnIconButtomNew(), - ), - ], - ), - ), - centerTitle: false, - ), - body: SafeArea( - top: true, - child: Padding( - padding: EdgeInsets.only( - top: 30.rpx, left: 30.rpx, right: 30.rpx), - child: Container( - decoration: BoxDecoration( - color: Color(0XFF003058), - borderRadius: BorderRadius.circular(16.rpx)), - child: Padding( - padding: EdgeInsets.only( - left: 40.rpx, - top: 20.rpx, - bottom: 20.rpx, - right: 30.rpx), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - scrollDirection: Axis.vertical, - itemCount: controller.languageList.length, - itemBuilder: - (BuildContext context, int index) { - return _buildItem(context, index, - controller.languageList[index]); - }, - ), - ], - ), - ))))), - )); - }); - } - - Widget _buildItem(BuildContext context, int index, MHLanguageModel model) { - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - controller.selectLanguage.value = model; - }, + return LayoutBuilder( + builder: (context, bodySize) => GestureDetector( + // onTap: () => FocusScope.of(context).unfocus(),, child: Container( - height: bodysize!.maxHeight * 0.055, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - model.language_name ?? "", - style: TextStyle(color: Colors.white, fontSize: 30.rpx), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/new_background.png'), // 本地图片 + fit: BoxFit.fill, // 填满整个 Container + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, // 加上这一行 + appBar: AppBar( + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + iconTheme: IconThemeData( + color: themeController.currentColor.sc3, ), - Obx(() { - double h = 33.rpx; - bool check = controller.selectLanguage.value?.language_code == - model.language_code; - - return Container( - height: 33.rpx, - child: AspectRatio( - aspectRatio: 1, - child: Center( - child: Container( - height: h, - width: h, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(h / 2), - border: Border.all( - width: check ? 1 : 0.5, - color: Color(0xFFC8CBD2), - ), - ), - child: check - ? Center( - child: ClipOval( - child: Container( - width: h * 0.6, - height: h * 0.6, - color: const Color(0xFF6BFDAC), - ), - ), - ) - : null, + titleSpacing: 0, + // leading: returnIconButtom, + title: Container( + width: double.infinity, + height: 180.rpx, + child: Stack( + alignment: Alignment.center, + children: [ + /// 居中标题 + Text( + '选择语言'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: themeController.currentColor.sc3, + letterSpacing: 0, + fontSize: 30.rpx, ), ), + Positioned( + left: 0, + child: returnIconButtom, + ), + ], + ), + ), + actions: [], + centerTitle: false, + ), + body: SafeArea( + top: true, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB(30.rpx, 0, 30.rpx, 0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 25.rpx, 0.rpx, 0), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: Color(0XFF003058), + borderRadius: BorderRadius.circular( + AppConstants().normal_container_radius), + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 0, 0.rpx, 0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 40.rpx, 20.rpx, 40.rpx, 20.rpx), + child: Obx(() { + return Column( + children: languageController.languageList + .map((language) { + return ClickableContainer( + backgroundColor: + Colors.transparent, // 背景透明 + highlightColor: themeController + .currentColor.sc21, // 点击时的背景色 + padding: EdgeInsets.symmetric( + vertical: 10.rpx, + horizontal: 16.rpx), + onTap: () async { + // 点击事件逻辑 + for (var lang + in languageController + .languageList) { + lang.selected = (lang == + language); // 根据选择更新状态 + } + languageController + .selectLanguage + .value = language; + await AppLanguage() + .loadLanguage(language + .language_code); // 加载语言 + languageController + .updateAll(); // 更新操作 + }, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Expanded( + child: Text( + language.language_name ?? + '语言名称'.tr, // 显示语言名称 + style: TextStyle( + fontFamily: 'Inter', + color: themeController + .currentColor.sc3, + fontSize: AppConstants() + .title_text_fontSize, + letterSpacing: 0.0, + ), + maxLines: 1, + overflow: TextOverflow + .ellipsis, // 省略号处理 + ), + ), + FancyCircleCheckbox( + borderColor: themeController + .currentColor.sc3, + fillColor: themeController + .currentColor.sc2, + value: language.selected ?? + false, // 根据 selected 状态显示选中或未选中 + onChanged: (value) async { + // 保持原有的状态更改逻辑 + for (var lang + in languageController + .languageList) { + lang.selected = (lang == + language); // 更新选中状态 + } + languageController + .selectLanguage + .value = language; + await AppLanguage() + .loadLanguage(language + .language_code); // 加载语言 + languageController + .updateAll(); // 更新操作 + }, + ), + ].divide(SizedBox( + width: 28.rpx)), // 为每个项添加间隔 + ), + ); + }) + .toList() + .divide(SizedBox( + height: 30.rpx, + )), + ); + }), + ), + // ClickableContainer( + // backgroundColor: Colors.transparent, // 容器背景色 + // highlightColor: themeController + // .currentColor.sc21, // 点击时的背景色 + // padding: EdgeInsetsDirectional.fromSTEB( + // 40.rpx, 0.rpx, 40.rpx, 0.rpx), + // onTap: () {}, + // child: Container(), + // ), + ] + .divide(SizedBox(height: 0.rpx)) + .addToStart(SizedBox(height: 30.rpx)) + .addToEnd(SizedBox(height: 30.rpx)), + ), + ), + ), + ), + ], ), - ); - }), - ], + ), + ), + ), ), - ) - // width: bodysize!.maxWidth * 1, - - ); + ), + ), + ); } } diff --git a/lib/pages/mh_page/apply_repair_page.dart b/lib/pages/mh_page/apply_repair_page.dart index 3d2db80..d174463 100644 --- a/lib/pages/mh_page/apply_repair_page.dart +++ b/lib/pages/mh_page/apply_repair_page.dart @@ -2016,21 +2016,6 @@ class ApplyRepairPage extends GetView { return images; } - List> _getDropdownItems() { - List options = [ - '智能床垫AH-2型', - '智能床垫BY-H型', - '智能床垫BY-C型', - // 可以在这里添加更多选项 - ]; - - return options.map((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(); - } String checkRepairParam() { String message = ""; diff --git a/tool/add_tr_to_chinese.dart b/tool/add_tr_to_chinese.dart index 49b2c9b..565de2d 100644 --- a/tool/add_tr_to_chinese.dart +++ b/tool/add_tr_to_chinese.dart @@ -1,46 +1,173 @@ +// import 'dart:io'; + +// void main(List args) async { +// final targetPath = args.isNotEmpty ? args[0] : Directory.current.path; +// final type = FileSystemEntity.typeSync(targetPath); + +// if (type == FileSystemEntityType.notFound) { +// print('路径不存在: $targetPath'); +// return; +// } + +// if (type == FileSystemEntityType.file && targetPath.endsWith('.dart')) { +// await processDartFile(File(targetPath)); +// } else if (type == FileSystemEntityType.directory) { +// final directory = Directory(targetPath); +// print('扫描目录: $targetPath'); + +// await for (final entity +// in directory.list(recursive: true, followLinks: false)) { +// if (entity is File && entity.path.endsWith('.dart')) { +// await processDartFile(entity); +// } +// } +// print('处理完成'); +// } else { +// print('不支持的路径类型: $targetPath'); +// } +// } + +// Future processDartFile(File file) async { +// final content = await file.readAsString(); + +// // 获取注释范围 +// final commentRanges = getCommentRanges(content); + +// // 匹配带中文的引号字符串(单/双引号) +// final regex = RegExp(r'''(['"])([^'"]*?[\u4e00-\u9fa5][^'"]*?)\1'''); + +// final matches = regex.allMatches(content).toList(); +// if (matches.isEmpty) return; + +// final sb = StringBuffer(); +// int lastIndex = 0; + +// for (final match in matches) { +// final start = match.start; +// final end = match.end; + +// // 跳过注释中的内容 +// if (commentRanges.any((range) => start >= range[0] && start < range[1])) { +// continue; +// } + +// // 插入上次结束到当前匹配之间的代码 +// sb.write(content.substring(lastIndex, start)); + +// final fullMatch = match.group(0)!; + +// // 判断是否已处于 .tr 表达式中 +// if (isAlreadyTrCall(content, start, end)) { +// sb.write(fullMatch); // 不修改 +// } else { +// sb.write('$fullMatch.tr'); // 添加 .tr +// } + +// lastIndex = end; +// } + +// sb.write(content.substring(lastIndex)); + +// final result = sb.toString(); +// if (result != content) { +// await file.writeAsString(result); +// print('✅ 修改完成: ${file.path}'); +// } else { +// print('✔ 无需修改: ${file.path}'); +// } +// } + +// /// 判断该字符串是否已是 .tr 调用的一部分 +// bool isAlreadyTrCall(String content, int start, int end) { +// final after = content.substring(end); +// final before = content.substring(0, start); + +// // 检查匹配后是否直接跟 .tr (允许空格) +// final hasTrAfter = RegExp(r'^\s*\.tr\b').hasMatch(after); + +// // 检查匹配前是否已经出现 .tr (形如 .tr'xxx' 也考虑在内) +// final hasTrBefore = RegExp(r'\.tr\s*$').hasMatch(before); + +// return hasTrAfter || hasTrBefore; +// } + +// /// 找出所有注释区间 (start, end) +// List> getCommentRanges(String content) { +// final ranges = >[]; + +// final multiLine = RegExp(r'/\*[\s\S]*?\*/'); +// final singleLine = RegExp(r'//.*'); + +// for (final m in multiLine.allMatches(content)) { +// ranges.add([m.start, m.end]); +// } +// for (final m in singleLine.allMatches(content)) { +// ranges.add([m.start, m.end]); +// } +// return ranges; +// } import 'dart:io'; +import 'dart:convert'; void main(List args) async { - final targetPath = args.isNotEmpty ? args[0] : Directory.current.path; + if (args.length < 2) { + print('Usage: dart script.dart '); + return; + } + + final targetPath = args[0]; + final jsonFilePath = args[1]; + + // 加载JSON文件 + final jsonFile = File(jsonFilePath); + if (!jsonFile.existsSync()) { + print('JSON file not found: $jsonFilePath'); + return; + } + + final jsonContent = await jsonFile.readAsString(); + final jsonMap = json.decode(jsonContent) as Map; + final targetKeys = jsonMap.keys.toSet(); + final type = FileSystemEntity.typeSync(targetPath); if (type == FileSystemEntityType.notFound) { - print('路径不存在: $targetPath'); + print('Path not found: $targetPath'); return; } if (type == FileSystemEntityType.file && targetPath.endsWith('.dart')) { - await processDartFile(File(targetPath)); + await processDartFile(File(targetPath), targetKeys); } else if (type == FileSystemEntityType.directory) { final directory = Directory(targetPath); - print('扫描目录: $targetPath'); + print('Scanning directory: $targetPath'); await for (final entity in directory.list(recursive: true, followLinks: false)) { if (entity is File && entity.path.endsWith('.dart')) { - await processDartFile(entity); + await processDartFile(entity, targetKeys); } } - print('处理完成'); + print('Processing completed'); } else { - print('不支持的路径类型: $targetPath'); + print('Unsupported path type: $targetPath'); } } -Future processDartFile(File file) async { +Future processDartFile(File file, Set targetKeys) async { final content = await file.readAsString(); - - // 获取注释范围 final commentRanges = getCommentRanges(content); - - // 匹配带中文的引号字符串(单/双引号) final regex = RegExp(r'''(['"])([^'"]*?[\u4e00-\u9fa5][^'"]*?)\1'''); final matches = regex.allMatches(content).toList(); - if (matches.isEmpty) return; + if (matches.isEmpty) { + print('✓ No matches in: ${file.path}'); + return; + } final sb = StringBuffer(); int lastIndex = 0; + bool hasChanges = false; for (final match in matches) { final start = match.start; @@ -48,53 +175,50 @@ Future processDartFile(File file) async { // 跳过注释中的内容 if (commentRanges.any((range) => start >= range[0] && start < range[1])) { + sb.write(content.substring(lastIndex, end)); + lastIndex = end; continue; } - // 插入上次结束到当前匹配之间的代码 - sb.write(content.substring(lastIndex, start)); - final fullMatch = match.group(0)!; + final textContent = match.group(2)!; - // 判断是否已处于 .tr 表达式中 - if (isAlreadyTrCall(content, start, end)) { - sb.write(fullMatch); // 不修改 + // 检查是否在目标keys中 + if (targetKeys.contains(textContent)) { + // 检查是否已经包含.tr + if (!isAlreadyTrCall(content, start, end)) { + sb.write(content.substring(lastIndex, start)); + sb.write('$fullMatch.tr'); + hasChanges = true; + lastIndex = end; + } else { + sb.write(content.substring(lastIndex, end)); + lastIndex = end; + } } else { - sb.write('$fullMatch.tr'); // 添加 .tr + sb.write(content.substring(lastIndex, end)); + lastIndex = end; } - - lastIndex = end; } sb.write(content.substring(lastIndex)); - final result = sb.toString(); - if (result != content) { - await file.writeAsString(result); - print('✅ 修改完成: ${file.path}'); + if (hasChanges) { + await file.writeAsString(sb.toString()); + print('✓ Modified: ${file.path}'); } else { - print('✔ 无需修改: ${file.path}'); + print('✓ No changes needed: ${file.path}'); } } -/// 判断该字符串是否已是 .tr 调用的一部分 bool isAlreadyTrCall(String content, int start, int end) { - final after = content.substring(end); - final before = content.substring(0, start); - - // 检查匹配后是否直接跟 .tr (允许空格) - final hasTrAfter = RegExp(r'^\s*\.tr\b').hasMatch(after); - - // 检查匹配前是否已经出现 .tr (形如 .tr'xxx' 也考虑在内) - final hasTrBefore = RegExp(r'\.tr\s*$').hasMatch(before); - - return hasTrAfter || hasTrBefore; + // 检查字符串后面是否紧跟.tr + final afterString = content.substring(end); + return RegExp(r'^\s*\.tr\b').hasMatch(afterString); } -/// 找出所有注释区间 (start, end) List> getCommentRanges(String content) { final ranges = >[]; - final multiLine = RegExp(r'/\*[\s\S]*?\*/'); final singleLine = RegExp(r'//.*'); diff --git a/tool/extract_chinese.dart b/tool/extract_chinese.dart index 3dc0987..dfaeedc 100644 --- a/tool/extract_chinese.dart +++ b/tool/extract_chinese.dart @@ -13,21 +13,37 @@ void main(List args) async { } final dartFiles = []; - await for (var entity - in directory.list(recursive: true, followLinks: false)) { + await for (var entity in directory.list(recursive: true, followLinks: false)) { if (entity is File && entity.path.endsWith('.dart')) { dartFiles.add(entity); } } - final chineseReg = RegExp(r'[\u4e00-\u9fa5]+'); + final stringWithChineseReg = RegExp(r'''(['"])(?:(?!\1).)*[\u4e00-\u9fa5]+(?:(?!\1).)*\1'''); final chineseSet = {}; for (var file in dartFiles) { final content = await file.readAsString(); final uncommented = removeComments(content); - final matches = chineseReg.allMatches(uncommented); - chineseSet.addAll(matches.map((m) => m.group(0)!)); + + final matches = stringWithChineseReg.allMatches(uncommented); + for (var match in matches) { + final fullString = match.group(0)!; + final pure = fullString.substring(1, fullString.length - 1).trim(); // 去掉引号 + + // 跳过包含$的字符串(模板字符串) + if (pure.contains('\$')) continue; + + // 处理带点的字符串 + var processedText = pure; + if (pure.contains('.')) { + processedText = pure.substring(pure.lastIndexOf('.') + 1); + } + + if (processedText.isNotEmpty) { + chineseSet.add(processedText); + } + } } final resultMap = {for (var text in chineseSet) text: text}; @@ -39,8 +55,11 @@ void main(List args) async { print('中文文本已保存到: ${outputFile.path}'); } +// 移除注释内容 String removeComments(String source) { - source = source.replaceAll(RegExp(r'\/\*[\s\S]*?\*\/'), ''); - source = source.replaceAll(RegExp(r'\/\/.*'), ''); + // 移除多行注释 /* ... */ + source = source.replaceAll(RegExp(r'/\*[\s\S]*?\*/'), ''); + // 移除单行注释 // + source = source.replaceAll(RegExp(r'//.*'), ''); return source; -} +} \ No newline at end of file