语言脚本

This commit is contained in:
czz
2025-07-28 10:48:06 +08:00
parent 37ff573fd4
commit 92b6896176
5 changed files with 872 additions and 216 deletions

479
chinese_texts.json Normal file
View File

@@ -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.特殊字符和大写字母至少包含一个",
"请输入确认密码": "请输入确认密码",
"两次密码不一致": "两次密码不一致",
"请输入验证码": "请输入验证码",
"用户注册": "用户注册",
"注册成功": "注册成功",
"获取验证码": "获取验证码",
"编辑资料": "编辑资料",
"点击更换头像": "点击更换头像",
"找回密码": "找回密码",
"请输验证码": "请输验证码",
"网络未连接,请开启设备网络后重试": "网络未连接,请开启设备网络后重试",
"秒": "秒",
"请输入新密码": "请输入新密码",
"确认新密码": "确认新密码",
"用户拒绝授权": "用户拒绝授权",
"用户取消授权": "用户取消授权",
"退出": "退出",
"密码登录": "密码登录",
"短信登录": "短信登录",
"请输入账号": "请输入账号",
"我已阅读并同意": "我已阅读并同意",
"《用户协议》": "《用户协议》",
"与": "与",
"《隐私协议》": "《隐私协议》",
"注:首次登录会自动创建账号": "注:首次登录会自动创建账号",
"还没有账号?": "还没有账号?",
"前往注册": "前往注册",
"其他登录方式": "其他登录方式",
"未同意协议": "未同意协议",
"合肥眠花糖家具有限责任公司版权所有": "合肥眠花糖家具有限责任公司版权所有",
"请确认密码": "请确认密码",
"床垫全局": "床垫全局",
"床垫左侧": "床垫左侧",
"床垫右侧": "床垫右侧",
"柔性唤醒功能": "柔性唤醒功能",
"唤醒时间": "唤醒时间",
"开": "开",
"关": "关",
"按摩": "按摩",
"唤醒部位": "唤醒部位",
"自定义": "自定义",
"*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。": "*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。",
"输入手机号码": "输入手机号码",
"输入验证码": "输入验证码",
"输入新密码": "输入新密码",
"更新时间": "更新时间",
"是否在床": "是否在床",
"设备故障": "设备故障",
"网络状态": "网络状态",
"较弱": "较弱",
"离床": "离床",
"在床": "在床"
}

View File

@@ -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<MHLanguageController> {
// @override
// _LanguagePageState createState() => _LanguagePageState();
// }
MHLanguageController controller = Get.find();
BoxConstraints? bodysize;
// List<String> languageList = [
// '简体中文',
// '繁體中文',
// 'English',
// ];
// final Map<String, String> languageMap = {
// '简体中文': 'zh_CN',
// '繁體中文': 'zh_TW',
// 'English': 'en_US',
// };
class LanguagePage extends StatefulWidget {
const LanguagePage({super.key});
@override
State<LanguagePage> createState() => _LanguagePageState();
}
class _LanguagePageState extends State<LanguagePage> {
MHLanguageController languageController = Get.find();
@override
void initState() {
// languageController.initLanuageList();
super.initState();
}
// class _LanguagePageState extends State<LanguagePage> {
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<Widget>((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,
);
),
),
);
}
}

View File

@@ -2016,21 +2016,6 @@ class ApplyRepairPage extends GetView<ApplyRepairController> {
return images;
}
List<DropdownMenuItem<String>> _getDropdownItems() {
List<String> options = [
'智能床垫AH-2型',
'智能床垫BY-H型',
'智能床垫BY-C型',
// 可以在这里添加更多选项
];
return options.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList();
}
String checkRepairParam() {
String message = "";

View File

@@ -1,46 +1,173 @@
// import 'dart:io';
// void main(List<String> 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<void> 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<List<int>> getCommentRanges(String content) {
// final ranges = <List<int>>[];
// 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<String> args) async {
final targetPath = args.isNotEmpty ? args[0] : Directory.current.path;
if (args.length < 2) {
print('Usage: dart script.dart <target_path> <json_file_path>');
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<String, dynamic>;
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<void> processDartFile(File file) async {
Future<void> processDartFile(File file, Set<String> 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<void> 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<List<int>> getCommentRanges(String content) {
final ranges = <List<int>>[];
final multiLine = RegExp(r'/\*[\s\S]*?\*/');
final singleLine = RegExp(r'//.*');

View File

@@ -13,21 +13,37 @@ void main(List<String> args) async {
}
final dartFiles = <File>[];
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 = <String>{};
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<String> 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;
}
}