diff --git a/assets/mhlangs/fr_FR.json b/assets/mhlangs/fr_FR.json new file mode 100644 index 0000000..8f17e3d --- /dev/null +++ b/assets/mhlangs/fr_FR.json @@ -0,0 +1,662 @@ +{ + "语言名称": "Français", + "网页载入完毕": "Page chargée", + "关于我们": "À propos", + "地址管理": "Gestion des adresses", + "添加新地址": "Ajouter une adresse", + "默认": "Défaut", + "无详细地址": "Pas d'adresse détaillée", + "编辑": "Modifier", + "报修成功标题": "Réparation signalée avec succès", + "报修成功": "Réparation signalée avec succès", + "查看报修历史": "Voir l'historique des réparations", + "返回": "Retour", + "申请报修": "Demande de réparation", + "选择需要报修的设备": "Sélectionnez l'appareil à réparer", + "已绑设备": "Appareils liés", + "未知MAC": "MAC inconnu", + "未知型号": "Modèle inconnu", + "暂无可选设备": "Aucun appareil disponible pour le moment", + "请选择绑定设备": "Veuillez sélectionner un appareil à lier", + "查找": "Rechercher", + "设备系列": "Série de l'appareil", + "产品型号": "Modèle du produit", + "序列号": "Numéro de série", + "上传设备故障照片": "Télécharger des photos de la panne", + "请描述一下您的问题": "Veuillez décrire votre problème", + "问题描述(100个字以内)": "Description du problème (moins de 100 caractères)", + "联系方式": "Coordonnées", + "联系人": "Contact", + "手机号码": "Numéro de téléphone", + "提交报修信息": "Soumettre la demande de réparation", + "提交申请": "Soumettre la demande", + "请输入设备系列!": "Veuillez saisir la série de l'appareil !", + "请输入设备型号!": "Veuillez saisir le modèle de l'appareil !", + "请输入设备序列号id!": "Veuillez saisir le numéro de série de l'appareil !", + "请输入姓名!": "Veuillez saisir votre nom !", + "姓名必须为2到4个汉字!": "Le nom doit contenir 2 à 4 caractères chinois !", + "请输入手机号!": "Veuillez saisir votre numéro de téléphone !", + "无效的手机号!": "Numéro de téléphone invalide !", + "请输入问题描述!": "Veuillez saisir une description du problème !", + "请至少上传一张问题图片!": "Veuillez télécharger au moins une photo du problème !", + "体征检测设备": "Appareil de détection des signes vitaux", + "智能床": "Lit intelligent", + "智能床垫": "Matelas intelligent", + "未知设备": "Appareil inconnu", + "百度地图": "Baidu Maps", + "腾讯地图": "Tencent Maps", + "高德地图": "Gaode Maps", + "Apple地图": "Apple Plans", + "Google地图": "Google Maps", + "Google地图Go": "Google Maps Go", + "Petal地图": "Petal Maps", + "背部律动": "Mouvement du dos", + "力度调节": "Réglage de l'intensité", + "强": "Fort", + "弱": "Faible", + "按摩定时": "Minuterie de massage", + "恢复到默认设置": "Restaurer les paramètres par défaut", + "设置": "Paramètres", + "未命名": "Sans nom", + "已连接": "Connecté", + "未连接": "Non connecté", + "详情": "Détails", + "人员资料": "Profil personnel", + "房间选择": "Sélection de la pièce", + "设备校准": "Calibrage de l'appareil", + "体征传感器": "Capteur de signes vitaux", + "WIFI配置": "Configuration Wi-Fi", + "分享设备": "Partager l'appareil", + "解绑": "Dissocier", + "删除": "Supprimer", + "解绑成功": "Dissociation réussie", + "删除成功": "Suppression réussie", + "是否进行解绑?": "Voulez-vous dissocier ?", + "是否进行删除?": "Voulez-vous supprimer ?", + "我要预约": "Je veux réserver", + "体验日期": "Date de l'expérience", + "体验时段": "Créneau horaire", + "请选择时间": "Veuillez choisir l'heure", + "体验人员": "Participants", + "输入姓名": "Saisir le nom", + "手机号": "Numéro de téléphone", + "输入手机号": "Saisir le numéro de téléphone", + "提交预约": "Soumettre la réservation", + "预约编号:": "Numéro de réservation :", + "预约人员:": "Personne réservante :", + "手机号码:": "Numéro de téléphone :", + "体验时间:": "Heure de l'expérience :", + "预约门店:": "Magasin réservé :", + "SWES眠花糖杭州南星桥旗舰店": "Boutique phare SWES Mianhuatang Hangzhou Nanxingqiao", + "门店地址:": "Adresse du magasin :", + "浙江省杭州市上城区飞云江路45号一层": "1er étage, 45 Feiyunjiang Road, Shangcheng District, Hangzhou, Zhejiang", + "预约成功!": "Réservation réussie !", + "关闭": "Fermer", + "我的预约": "Mes réservations", + "双人版绑定标题": "Association version deux personnes", + "绑定全部": "Tout associer", + "主设备": "Appareil principal", + "可绑定": "Peut être associé", + "已被绑定": "Déjà associé", + "从设备": "Appareil secondaire", + "确定": "Confirm", + "取消": "cancel", + "无法绑定": "Impossible d'associer", + "无法绑定1": "Cet appareil a été détecté", + "无法绑定2": "déjà associé", + "无法绑定3": ", veuillez d'abord le dissocier avant de l'associer. Contactez le service client en cas de questions.", + "否": "Non", + "是": "Oui", + "密码为空": "Mot de passe vide", + "连接": "Connecter", + "继续": "Continuer", + "下次再说": "Une prochaine fois", + "注销账号": "Fermer le compte", + "注销智慧眠花糖账号": "Fermer le compte Smart Mianhuatang", + "账号注销后,你将无法使用以下功能,": "Après la fermeture du compte, vous ne pourrez plus utiliser les fonctionnalités suivantes :", + "并且当前有绑定以及被分享的智能床、智能床垫等设备的账号不能注销": "De plus, un compte ayant actuellement des lits intelligents, des matelas intelligents, etc., associés ou partagés ne peut pas être fermé.", + ",可先进行解绑后再进行注销操作。": ", vous pouvez d'abord les dissocier avant de fermer le compte.", + "无法控制智能床、智能床垫等设备": "Impossible de contrôler les lits intelligents, matelas intelligents, etc.", + "你将无法控制你的智能床、智能床垫等设备,以及与其相关的各种操作。": "Vous ne pourrez plus contrôler votre lit intelligent, votre matelas intelligent, etc., ni effectuer les opérations associées.", + "无法查询睡眠报告和体征数据": "Impossible de consulter les rapports de sommeil et les données des signes vitaux", + "注销账号后你将查询不到你以前的睡眠报告和实时数据。": "Après la fermeture du compte, vous ne pourrez plus consulter vos anciens rapports de sommeil et données en temps réel.", + "无法使用的其他功能": "Autres fonctionnalités indisponibles", + "包含设备报修、门店体验预约等。": "Incluant le signalement de pannes, les réservations d'expérience en magasin, etc.", + "信号强度": "Force du signal", + "设备状态": "État de l'appareil", + "其他设备正在绑定中,是否终止其他设备绑定?": "Un autre appareil est en cours d'association, voulez-vous interrompre l'association ?", + "是否确认绑定?": "Confirmez-vous l'association ?", + "连接异常": "Erreur de connexion", + "用户点击了取消": "L'utilisateur a cliqué sur Annuler", + "添加": "Ajouter", + "更新用户绑定流程": "Mettre à jour le processus d'association utilisateur", + "默认设备名称": "Nom d'appareil par défaut", + "SN": "SN", + "蓝牙地址": "Adresse Bluetooth", + "mac": "mac", + "网络": "Réseau", + "在线": "En ligne", + "离线": "Hors ligne", + "传感器": "Capteur", + "版本": "Version", + "蓝牙连接失败": "Échec de la connexion Bluetooth", + "不支持的设备类型": "Type d'appareil non pris en charge", + "未能获取到MAC地址": "Impossible d'obtenir l'adresse MAC", + "获取不到传感器mac,请重试": "Impossible d'obtenir le MAC du capteur, veuillez réessayer", + "获取设备状态": "Obtenir l'état de l'appareil", + "获取设备状态失败": "Échec de l'obtention de l'état de l'appareil", + "获取MAC失败": "Échec de l'obtention du MAC", + "获取MAC超时": "Délai d'obtention du MAC expiré", + "BLE返回数据格式不正确": "Format de données BLE incorrect", + "数据长度不足,无法解析MAC": "Longueur des données insuffisante, impossible d'analyser le MAC", + "未连接心率带": "Ceinture cardiaque non connectée", + "获取设备状态异常": "Erreur lors de l'obtention de l'état de l'appareil", + "设备状态请求失败": "Échec de la requête d'état de l'appareil", + "请求失败": "Échec de la requête", + "未知错误": "Erreur inconnue", + "传感器mac读取失败": "Échec de lecture du MAC du capteur", + "绑定成功": "Association réussie", + "服务器失败": "Échec du serveur", + "更新睡眠习惯": "Mettre à jour les habitudes de sommeil", + "TopSlideNotification 未显示:context 不可用或未挂载": "TopSlideNotification non affiché : contexte indisponible ou non monté", + "设备ID": "ID de l'appareil", + "设备ID:": "ID de l'appareil :", + "房间": "Pièce", + "未分配房间": "Pièce non attribuée", + "已绑定": "Déjà associé", + "控制": "Contrôler", + "已分享:": "Partagé à :", + "人": "personne(s)", + "来自": "De", + "的分享": "partage", + "睡眠报告": "Rapport de sommeil", + "未知类型设备": "Appareil de type inconnu", + "SWES 智能床": "Lit intelligent SWES", + "SWES 智能床垫": "Matelas intelligent SWES", + "标题": "Titre", + "分享标题": "Voulez-vous partager ?", + "分享内容": "Une fois l'appareil associé avec succès, si vous souhaitez partager votre sommeil avec des amis ou de la famille, vous pouvez le partager immédiatement. Après le partage, l'autre personne pourra voir les données de cet appareil et recevoir ses rapports de sommeil.", + "立即分享": "Partager maintenant", + "失败": "Échec", + "添加设备": "Ajouter un appareil", + "选择类型": "Sélectionner le type", + "权限提示": "Avertissement de permissions", + "应用需要蓝牙和位置权限才能扫描设备。请授予权限。": "L'application a besoin des permissions Bluetooth et localisation pour scanner les appareils. Veuillez les accorder.", + "蓝牙未开启": "Bluetooth non activé", + "请先打开蓝牙在进行设备扫描": "Veuillez d'abord activer le Bluetooth pour scanner les appareils", + "等待扫描": "En attente du scan", + "扫描中": "Scan en cours", + "最小信号强度": "Force minimale du signal", + "检索设备": "Rechercher des appareils", + "匹配出的外围设备": "Périphériques correspondants", + "蓝牙绑定提示": "Lors de l'ajout d'un appareil avec le téléphone, veuillez activer le Bluetooth, vous approcher à moins de 3 mètres de l'appareil cible.", + "校准未完成提示": "Le calibrage n'est pas terminé, confirmez-vous quitter le processus ?", + "下一步": "Suivant", + "离床校准": "Calibrage hors du lit", + "未完成": "Non terminé", + "已完成": "Terminé", + "位置校准": "Calibrage de position", + "床头": "Tête de lit", + "校准完成": "Calibrage terminé", + "校准失败": "Échec du calibrage", + "离床校准提示": "Veuillez quitter temporairement le lit et garder l'environnement calme pendant le calibrage", + "位置校准提示": "Veuillez vous allonger sur le côté indiqué par la flèche, puis cliquez sur Démarrer et restez immobile pendant 10 secondes", + "s后超时": "s avant expiration", + "开始校准": "Commencer le calibrage", + "重新校准": "Recalibrer", + "设备校准进度": "Progression du calibrage", + "设备校准完成": "Calibrage de l'appareil terminé", + "请校准人员保持在床状态": "Veuillez rester sur le lit", + "请校准人员暂时离开床铺": "Veuillez quitter temporairement le lit", + "请保持身体静止": "Veuillez rester immobile", + "查询绑定流程": "Vérifier le processus d'association", + "更新绑定流程": "Mettre à jour le processus d'association", + "请开始B侧校准": "Veuillez commencer le calibrage côté B", + "请校准人员到箭头指定一侧平躺 保持静止后点击开始,保持10秒": "Veuillez vous allonger sur le côté indiqué par la flèche, cliquez sur Démarrer après être resté immobile, et maintenez pendant 10 secondes", + "开始另外一侧校准": "Commencer le calibrage de l'autre côté", + "单侧校准完成,请移动到另外一侧": "Calibrage d'un côté terminé, veuillez passer de l'autre côté", + "保存用户信息": "Enregistrer les informations utilisateur", + "保存成功": "Enregistrement réussi", + "保存失败": "Échec de l'enregistrement", + "姓名": "Nom", + "请输入姓名": "Veuillez saisir votre nom", + "女": "Femme", + "男": "Homme", + "性别": "Sexe", + "身高(cm)": "Taille (cm)", + "体重(kg)": "Poids (kg)", + "生日": "Date de naissance", + "yyyy年MM月dd日": "yyyy-MM-dd", + "请输入联系方式": "Veuillez saisir vos coordonnées", + "未配置网络提示": "Cet appareil n'est pas configuré pour le réseau, confirmez-vous ignorer la configuration réseau ?", + "wifi配置": "Configuration Wi-Fi", + "可用WLAN": "Wi-Fi disponible", + "输入wifi密码": "Saisir le mot de passe Wi-Fi", + "配网成功": "Configuration réseau réussie", + "配网失败": "Échec de la configuration réseau", + "4g设备配置wifi提示": "Appareil 4G : configuration Wi-Fi", + "获取设备网络类型失败": "Échec de l'obtention du type de réseau de l'appareil", + "刷新": "Actualiser", + "获取wifi列表成功": "Liste Wi-Fi obtenue avec succès", + "获取wifi列表失败": "Échec d'obtention de la liste Wi-Fi", + "设备连接超时,请重试": "Délai de connexion à l'appareil expiré, veuillez réessayer", + "连接成功": "Connexion réussie", + "连接失败": "Échec de la connexion", + "设备连接失败": "Échec de connexion à l'appareil", + "扫描过程中发生错误": "Une erreur est survenue lors du scan", + "关闭蓝牙连接成功": "Connexion Bluetooth fermée avec succès", + "设备列表": "Liste des appareils", + "设备信息": "Informations de l'appareil", + "将以下设备分享给您的家人或朋友": "Partagez les appareils suivants avec votre famille ou vos amis", + "请输入对方手机号/邮箱号": "Veuillez saisir le numéro de téléphone/l'e-mail du destinataire", + "点击复制APP下载链接": "Cliquez pour copier le lien de téléchargement de l'application", + "允许对方控制和查看该设备": "Autoriser l'autre personne à contrôler et voir cet appareil", + "仅允许对方查看该设备": "Autoriser l'autre personne à voir cet appareil uniquement", + "发送邀请": "invitation", + "已分享用户": "Utilisateurs partagés", + "请选择省": "Veuillez sélectionner la province", + "请选择市": "Veuillez sélectionner la ville", + "请选择地区": "Veuillez sélectionner la région", + "请选择街道": "Veuillez sélectionner la rue", + "编辑地址": "Modifier l'adresse", + "地址信息": "Informations de l'adresse", + "收件人": "Destinataire", + "所在地区": "Région", + "详细地址": "Adresse détaillée", + "地址不能为空": "L'adresse ne peut pas être vide", + "名字不能为空": "Le nom ne peut pas être vide", + "详细地址不能为空": "L'adresse détaillée ne peut pas être vide", + "手机号不能为空": "Le numéro de téléphone ne peut pas être vide", + "无效的手机号码": "Numéro de téléphone invalide", + "保存": "Enregistrer", + "智能设备名称": "Nom de l'appareil intelligent", + "智能电动床": "Lit électrique intelligent", + "律动智能床垫": "Matelas intelligent à mouvement", + "更新设备信息": "Mettre à jour les informations de l'appareil", + "修改名称成功": "Nom modifié avec succès", + "请输入设备的名称": "Veuillez saisir le nom de l'appareil", + "完成": "Terminer", + "预约体验": "Réserver une expérience", + "待开发功能": "Fonctionnalité en développement", + "请输入门店名称": "Veuillez saisir le nom du magasin", + "咨询": "Consulter", + "未检测到导航软件": "Aucune application de navigation détectée", + "选择地图": "Choisir une carte", + "导航": "Navigation", + "预约": "Réservation", + "问题与帮助": "Questions et aide", + "设备列表请求失败": "Échec de la requête de liste d'appareils", + "设备列表请求成功": "Requête de liste d'appareils réussie", + "请求成功": "Requête réussie", + "用户操作:解绑设备": "Action utilisateur : dissocier l'appareil", + "操作失败": "Opération échouée", + "操作成功": "Opération réussie", + "请求人员信息列表": "Demander la liste des informations personnelles", + "请求睡眠信息列表": "Demander la liste des informations de sommeil", + "更新控制倒计时": "Mettre à jour le compte à rebours de contrôle", + "查询控制倒计时": "Vérifier le compte à rebours de contrôle", + "请先": "Veuillez d'abord", + "登录": "vous connecter", + "后,再查看睡眠报告": ", puis consulter le rapport de sommeil", + "暂无数据": "Aucune donnée pour le moment", + "发现新版本": "Nouvelle version disponible", + "知道了": "Compris", + "周一": "Mon", + "周二": "Tue", + "周三": "Wed", + "周四": "Thu", + "周五": "Fri", + "周六": "Sat", + "周日": "Sun", + "添加新设备": "Ajouter un nouvel appareil", + "暂无内容!": "Aucun contenu pour le moment !", + "切换语言": "Changer de langue", + "左": "Gauche", + "全局": "Global", + "右": "Droite", + "一键助眠": "Sommeil en un clic", + "疲劳缓解": "Soulagement de la fatigue", + "全身放松": "Détente complète", + "腿部律动": "Mouvement des jambes", + "垂直律动": "Mouvement vertical", + "加热": "Chauffage", + "柔性唤醒": "Réveil en douceur", + "记忆": "Mémoire", + "消息详情": "Détails du message", + "同意": "Accepter", + "已同意": "Déjà accepté", + "已过期": "Expiré", + "未知状态": "Statut inconnu", + "消息中心": "Centre de messages", + "全部已读": "Tout marquer comme lu", + "系统消息": "Messages système", + "体征消息": "Messages de signes vitaux", + "查看详情": "Voir les détails", + "未知数据": "-", + "未知指标": "Indicateur inconnu", + "无需处理": "Aucun traitement nécessaire", + "待处理": "En attente", + "已处理": "Traité", + "已超时": "Expiré", + "取消预约": "Annuler la réservation", + "必须登录提示": "Veuillez d'abord vous connecter", + "微信用户": "Utilisateur WeChat", + "我的智能设备": "Mes appareils intelligents", + "我绑定或关联的智能床,智能床垫等智能设备": "Mes lits intelligents, matelas intelligents, etc., associés ou liés", + "门店体验": "Expérience en magasin", + "如果想免费体验智能设备,可在此进行提前预约": "Si vous souhaitez essayer gratuitement des appareils intelligents, vous pouvez réserver à l'avance ici", + "设备报修": "Signalement de panne d'appareil", + "当您的智能设备需要报修时,可以通过该功能联系解决,": "Lorsque votre appareil intelligent a besoin d'être réparé, vous pouvez contacter via cette fonctionnalité.", + "网上商城": "Boutique en ligne", + "最新的智能产品线上购买服务": "Service d'achat en ligne des derniers produits intelligents", + "用于收货和报修时联系您": "Utilisé pour vous contacter lors de la livraison ou d'une réparation", + "常见的问题汇总,如:智能床连接流程、如何查看睡眠报告": "Questions fréquentes, comme : processus de connexion du lit intelligent, comment consulter les rapports de sommeil", + "在线客服": "Service client en ligne", + "购买和使用智能床过程中,如果遇到疑问可与客服进行联系": "Si vous avez des questions lors de l'achat ou de l'utilisation d'un lit intelligent, contactez le service client", + "修改密码": "Modifier le mot de passe", + "点击了容器": "Cliqué sur le conteneur", + "当前版本": "Version actuelle", + "简体中文": "Chinois simplifié", + "用户协议": "Accord utilisateur", + "隐私协议": "Politique de confidentialité", + "退出登录": "Se déconnecter", + "ICP备案号:浙ICP备2023000785号-1": "Numéro d'enregistrement ICP : Zhe ICP Bei 2023000785-1", + "Copyright © 202-2025 嘉兴太和信息技术有限责任公司 版权所有": "Copyright © 202-2025 Jiaxing Taihe Information Technology Co., Ltd. Tous droits réservés", + "Copyright © 202-2025 杭州欢睡科技有限公司 版权所有": "Copyright © 202-2025 Hangzhou Huanshui Technology Co., Ltd. Tous droits réservés", + "请选择身高": "Veuillez sélectionner la taille", + "请选择体重": "Veuillez sélectionner le poids", + "请输入正确的联系人电话": "Veuillez saisir un numéro de téléphone valide", + "更新失败": "Échec de la mise à jour", + "系列:": "Série :", + "型号:": "Modèle :", + "序列号:": "Numéro de série :", + "报修单号:": "Numéro de ticket :", + "提交时间:": "Heure de soumission :", + "问题描述:": "Description du problème :", + "报修状态": "Statut de la réparation", + "页面返回事件": "Événement de retour de page", + "审核中": "En cours d'examen", + "审核通过": "Examen approuvé", + "维修中": "En cours de réparation", + "维修完成": "Réparation terminée", + "已评价": "Déjà évalué", + "报修须知": "Instructions de réparation", + "尊敬的用户,感谢您选择我司产品。在使用过程中,如果设备出现故障需要维修,请首先确认设备是否正确连接控制器或网络,检查设置是否正常,排除误操作问题。若问题依然存在,请记录下设备名称、设备编号、和具体故障内容,方便我们快速地为您提供帮助。您可以通过智慧眠花糖APP保修页面直接报修或拨打 ": "Cher utilisateur, merci d'avoir choisi nos produits. Si l'appareil présente une panne nécessitant une réparation, veuillez d'abord vérifier qu'il est correctement connecté au contrôleur ou au réseau, vérifiez les paramètres, et excluez les erreurs de manipulation. Si le problème persiste, notez le nom de l'appareil, son numéro de série et les détails de la panne pour nous aider à vous assister rapidement. Vous pouvez signaler la panne via la page de garantie de l'application Smart Mianhuatang ou appeler le ", + " 反馈。": " pour nous contacter.", + "我要报修": "Je veux signaler une panne", + "报修历史": "Historique des réparations", + "亩核通过": "Approuvé", + "查询房间列表": "Demander la liste des pièces", + "更新成功": "Mise à jour réussie", + "评价": "Évaluation", + "我要评价": "Je veux évaluer", + "差": "Mauvais", + "较差": "Médiocre", + "一般": "Moyen", + "优秀": "Bon", + "完美": "Excellent", + "未评分": "Non noté", + "再多的溢美之词,都比不上您真心的评价。我们愿付出200%的努力,只为您100%的满意~感谢您的支持与厚爱!": "Aucun éloge ne vaut votre évaluation sincère. Nous nous engageons à 200 % pour votre satisfaction à 100 % ! Merci pour votre soutien et votre affection !", + "提交": "Soumettre", + "请输入关键字": "Veuillez saisir un mot-clé", + "搜索": "Rechercher", + "解除分享": "Retirer le partage", + "再按一次退出程序": "Appuyez à nouveau pour quitter", + "睡眠习惯": "Habitudes de sommeil", + "睡眠隐私": "Confidentialité du sommeil", + "睡眠隐私功能": "Fonction de confidentialité du sommeil", + "开始时间": "Heure de début", + "结束时间": "Heure de fin", + "*注:开启睡眠隐私功能后,在设置的时间段内,将不会采集您的睡眠数据。": "*Note : Une fois la confidentialité du sommeil activée, vos données de sommeil ne seront pas collectées pendant la période définie.", + "查询设备绑定人员列表": "Demander la liste des personnes associées à l'appareil", + "未知数据格式": "Format de données inconnu", + "后,再进行设备控制": ", puis contrôler l'appareil", + "请选择登录方式": "Veuillez choisir le mode de connexion", + "账户不能为空": "Le compte ne peut pas être vide", + "密码不能为空": "Le mot de passe ne peut pas être vide", + "请输入手机号": "Veuillez saisir votre numéro de téléphone", + "请输入正确的手机号": "Veuillez saisir un numéro de téléphone valide", + "验证码不能为空": "Le code de vérification ne peut pas être vide", + "需要同意协议": "Vous devez accepter les accords", + "用户登录": "Connexion utilisateur", + "发送验证码": "Envoyer le code de vérification", + "发送验证码成功": "Code de vérification envoyé avec succès", + "请先安装微信APP,再使用微信登录": "Veuillez d'abord installer WeChat, puis vous connecter avec WeChat", + "微信登录": "Connexion WeChat", + "请先安装微信APP,再联系客服": "Veuillez d'abord installer WeChat, puis contacter le service client", + "请输入密码": "Veuillez saisir votre mot de passe", + "密码格式提示": "1. Le mot de passe doit comporter au moins 8 caractères\n2. Le mot de passe doit contenir des lettres et des chiffres\n3. Doit contenir au moins un caractère spécial ou une majuscule", + "请输入确认密码": "Veuillez confirmer votre mot de passe", + "两次密码不一致": "Les mots de passe ne correspondent pas", + "请输入验证码": "Veuillez entrer", + "用户注册": "Inscription utilisateur", + "注册成功": "Inscription réussie", + "获取验证码": "Cliquez", + "编辑资料": "Modifier le profil", + "点击更换头像": "Cliquez pour changer la photo de profil", + "找回密码": "Récupérer le mot de passe", + "请输验证码": "Veuillez entrer", + "网络未连接,请开启设备网络后重试": "Pas de connexion réseau, veuillez activer le réseau et réessayer", + "秒": "seconde(s)", + "请输入新密码": "Veuillez saisir un nouveau mot de passe", + "确认新密码": "Confirmer le nouveau mot de passe", + "用户拒绝授权": "Utilisateur a refusé l'autorisation", + "用户取消授权": "Utilisateur a annulé l'autorisation", + "退出": "Quitter", + "密码登录": "mot de passe", + "短信登录": "Message court", + "请输入账号": "Veuillez saisir votre compte", + "我已阅读并同意": "J'ai lu et j'accepte", + "《用户协议》": "l'Accord utilisateur", + "与": "et la", + "《隐私协议》": "Politique de confidentialité", + "注:首次登录会自动创建账号": "Remarque : La première connexion crée automatiquement un compte", + "还没有账号?": "Pas encore de compte ?", + "前往注册": "S'inscrire", + "其他登录方式": "Autres modes de connexion", + "未同意协议": "Accords non acceptés", + "合肥眠花糖家具有限责任公司版权所有": "Hefei Mianhuatang Furniture Co., Ltd. Tous droits réservés", + "请确认密码": "Veuillez confirmer le mot de passe", + "床垫全局": "Matelas global", + "床垫左侧": "Côté gauche du matelas", + "床垫右侧": "Côté droit du matelas", + "柔性唤醒功能": "Fonction de réveil en douceur", + "唤醒时间": "Heure de réveil", + "开": "Activé", + "关": "Désactivé", + "按摩": "Massage", + "唤醒部位": "Zone de réveil", + "自定义": "Personnalisé", + "*注:开启该功能后,在设置的时间点,设备将启动一段固定时长的柔性唤醒功能。": "*Note : Une fois cette fonction activée, à l'heure définie, l'appareil démarrera une fonction de réveil en douceur d'une durée fixe.", + "输入手机号码": "Saisir le numéro de téléphone", + "输入验证码": "Saisir le code de vérification", + "输入新密码": "Saisir le nouveau mot de passe", + "更新时间": "Heure de mise à jour", + "是否在床": "Sur le lit ?", + "设备故障": "Panne de l'appareil", + "网络状态": "État du réseau", + "较弱": "Faible", + "离床": "Hors du lit", + "在床": "Sur le lit", + "首页": "Accueil", + "报告": "Rapport", + "我的": "Moi", + "查询失败": "Échec de la requête", + "退出成功": "Déconnexion réussie", + "最长字符为8个字": "Longueur maximale : 8 caractères", + "未选择图片": "Aucune image sélectionnée", + "上传成功": "Téléchargement réussi", + "头像上传失败": "Échec du téléchargement de la photo de profil", + "请输入正确的手机号/邮箱号": "Veuillez saisir un numéro de téléphone ou une adresse e-mail valide", + "上传限制": "Limite de téléchargement", + "用户未存在手机号": "L'utilisateur n'a pas de numéro de téléphone", + "选择生日": "Choisir la date de naissance", + "日报": "Jour", + "周报": "Semaine", + "月报": "Mois", + "名称": "Nom", + "本周": "Cette semaine", + "上周": "Semaine dernière", + "范围": "Plage", + "本月": "Ce mois-ci", + "上月": "Mois dernier", + "与上月对比": "Comparaison avec le mois dernier", + "最低分": "Score minimum", + "本周平均分": "ave", + "最高分": "max", + "每日得分": "Score quotidien", + "本周睡眠时长": "Durée de sommeil cette semaine", + "用户本周睡眠分数的汇总": "Résumé des scores de sommeil de l'utilisateur cette semaine", + "用户本月睡眠分数的汇总": "Résumé des scores de sommeil de l'utilisateur ce mois-ci", + "参考范围": "Plage de référence", + "与上周对比": "Comparaison avec la semaine dernière", + "本月平均分": "ave", + "选择月份": "Sélectionner le mois", + "一": "Lun", + "二": "Mar", + "三": "Mer", + "四": "Jeu", + "五": "Ven", + "六": "Sam", + "日": "Dim", + "选择语言": "Choisir la langue", + "person_info_A": "Profil personnel A", + "person_info_B": "Profil personnel B", + "本月睡眠时长是指从月初到月末,用户每天实际睡眠的时间总和": "La durée de sommeil mensuelle est la somme du temps de sommeil réel de l'utilisateur chaque jour, du début à la fin du mois.", + "本月睡眠时长": "Durée de sommeil mensuelle", + "睡眠分数与上月分数进行对比,是通过量化分析近期睡眠质量变化,可了解自身睡眠状态的波动情况,进而调整用户的作息习惯。": "La comparaison du score de sommeil avec celui du mois dernier permet d'analyser quantitativement les changements récents de qualité de sommeil, de comprendre les fluctuations de l'état de sommeil et d'ajuster les habitudes de l'utilisateur.", + "本周睡眠时长是指从周一到周日内,每天实际睡眠的时间总和。": "La durée de sommeil hebdomadaire est la somme du temps de sommeil réel chaque jour, du lundi au dimanche.", + "睡眠分数与上周分数进行对比,是通过量化分析近期睡眠质量变化,可了解自身睡眠状态的波动情况,进而调整用户的作息习惯。": "La comparaison du score de sommeil avec celui de la semaine dernière permet d'analyser quantitativement les changements récents de qualité de sommeil, de comprendre les fluctuations de l'état de sommeil et d'ajuster les habitudes de l'utilisateur.", + "选择性别": "Sélectionner le sexe", + "选择身高": "Sélectionner la taille", + "选择体重": "Sélectionner le poids", + "年": "Année", + "月": "Mois", + "day": "Jour", + "设备名称": "Nom de l'appareil", + "身高": "Taille", + "体重": "Poids", + "体征传感器A": "Capteur de signes vitaux A", + "体征传感器B": "Capteur de signes vitaux B", + "该设备只可被一个用户绑定,": "Cet appareil ne peut être associé qu'à un seul utilisateur,", + "解绑后": "après dissociation,", + "其他用户才可以绑定": "d'autres utilisateurs pourront l'associer.", + "请输入联系人": "Veuillez saisir le contact", + "正在打开微信客服...": "Ouverture du service client WeChat...", + "起床时间:": "Heure de lever :", + "入睡时间:": "Heure d'endormissement :", + "起床时间": "Réveil", + "入睡时间": "Endormi", + "次": "fois", + "次/分": "fois/min", + "毫秒": "milliseconde(s)", + "sleep_duration": "Durée de sommeil", + "deep_sleep": "Sommeil profond", + "light_sleep": "Sommeil léger", + "小时": "heure(s)", + "今日": "Aujourd'hui", + "30天平均分": "Moyenne sur 30 jours", + "睡眠评分": "score", + "睡眠等级": "grade", + "睡眠规律性": "Régularité du sommeil", + "睡眠规律性是指个体睡眠模式在时间、时长、环境等方面呈现出的稳定性和一致性,是衡量睡眠质量的重要指标之一。": "La régularité du sommeil fait référence à la stabilité et à la cohérence des modèles de sommeil d'un individu en termes de temps, de durée, d'environnement, etc. C'est un indicateur important de la qualité du sommeil.", + "分钟": "minute(s)", + "睡眠时长": "Durée de sommeil", + "当前属于": "Actuellement classé comme", + "与昨日对比分析": "Analyse comparative avec hier", + "基于时间维度的横向比较分析方法,通过将当前(今日)的数据、状态、行为等与前一日(昨日)的同类信息进行对照,识别差异、趋势或变化规律,查看用户短期时间序列的动态变化。": "Méthode d'analyse comparative horizontale basée sur le temps, en comparant les données, états, comportements actuels (aujourd'hui) avec ceux de la veille (hier) pour identifier les différences, tendances ou changements, et observer les variations dynamiques à court terme de l'utilisateur.", + "今日数据": "Données d'aujourd'hui", + "昨日数据": "Données d'hier", + "心率散点图": "Nuage de points de fréquence cardiaque", + "心电散点图是用非线性的图形方法描记的连续心冲击图的RR间期图,因图形由散点组成,又称散点图。": "Le nuage de points ECG est un graphique des intervalles RR d'un balistocardiogramme continu enregistré avec une méthode graphique non linéaire. Comme le graphique est composé de points dispersés, on l'appelle aussi nuage de points.", + "心率数据": "Données de fréquence cardiaque", + "心率数据是指用户在睡眠过程中基本心率数据,可初步判断睡眠中的心血管负荷及自主神经功能状态,为睡眠健康评估提供重要依据。": "Les données de fréquence cardiaque sont les données de base de la fréquence cardiaque de l'utilisateur pendant le sommeil, permettant d'évaluer initialement la charge cardiovasculaire et l'état du système nerveux autonome pendant le sommeil, fournissant une base importante pour l'évaluation de la santé du sommeil.", + "正常范围": "Plage normale", + "心率变异性(HRV)": "Variabilité de la fréquence cardiaque (HRV)", + "心率变异性(HRV)是指心脏每次跳动间隔时间的差异程度,反映自主神经系统(交感神经和副交感神经)对心脏的调节能力,是评估心血管健康和压力状态的重要指标。": "La variabilité de la fréquence cardiaque (HRV) fait référence au degré de variation des intervalles entre les battements du cœur, reflétant la capacité du système nerveux autonome (sympathique et parasympathique) à réguler le cœur. C'est un indicateur important pour évaluer la santé cardiovasculaire et l'état de stress.", + "测量值": "Valeur mesurée", + "趋势": "Tendance", + "呼吸数据": "Données respiratoires", + "呼吸数据是指用户在睡眠过程中呼吸的基本数据,是评估睡眠呼吸质量、筛查睡眠呼吸障碍的核心指标。": "Les données respiratoires sont les données de base de la respiration de l'utilisateur pendant le sommeil, un indicateur clé pour évaluer la qualité de la respiration pendant le sommeil et dépister les troubles respiratoires du sommeil.", + "打鼾监测": "Surveillance du ronflement", + "打鼾监测是指用户在睡眠过程中打鼾频次的图表说明。": "La surveillance du ronflement est une représentation graphique de la fréquence des ronflements de l'utilisateur pendant le sommeil.", + "呼吸暂停监测": "Surveillance des apnées", + "呼吸暂停监测是指用户在睡眠过程中产生的呼吸暂停的图表说明。": "La surveillance des apnées est une représentation graphique des apnées survenant pendant le sommeil de l'utilisateur.", + "心理健康评估": "Évaluation de la santé mentale", + "心率健康评估主要通过用户睡眠报告中的时间点、体征数据及HRV数据等信息,来判断其心理健康水平、疲劳程度。": "L'évaluation de la santé cardiaque utilise principalement les informations du rapport de sommeil de l'utilisateur, comme les points temporels, les données de signes vitaux et les données HRV, pour juger de son niveau de santé mentale et de fatigue.", + "慢性病风险指数": "Indice de risque de maladies chroniques", + "慢性病风险指数是通过整合个体的生理指标、生活方式等多维度数据,构建的量化评估模型,用于预测用户未来患慢性非传染性疾病(如高血压、糖尿病、冠心病、癌症等)的风险概率。": "L'indice de risque de maladies chroniques est un modèle d'évaluation quantitative construit en intégrant des données multidimensionnelles telles que les indicateurs physiologiques et le mode de vie d'un individu, utilisé pour prédire la probabilité de risque de développer des maladies chroniques non transmissibles (comme l'hypertension, le diabète, les maladies coronariennes, le cancer, etc.) à l'avenir.", + "自主神经平衡指数": "Indice d'équilibre du système nerveux autonome", + "自主神经平衡指数 是评估人体自主神经系统(ANS)功能状态的重要指标,主要反映交感神经和副交感神经的活性平衡关系。": "L'indice d'équilibre du système nerveux autonome est un indicateur important pour évaluer l'état fonctionnel du système nerveux autonome (SNA) humain, reflétant principalement la relation d'équilibre entre l'activité sympathique et parasympathique.", + "皮肤指数": "Indice cutané", + "皮肤指数通过用户睡眠过程中的体征数据,计算皮肤电反应,生成综合评估指标,用于睡眠中的生理应激状态或自主神经活动。": "L'indice cutané calcule la réponse électrodermale à partir des données de signes vitaux de l'utilisateur pendant le sommeil, générant un indicateur d'évaluation global utilisé pour l'état de stress physiologique ou l'activité du système nerveux autonome pendant le sommeil.", + "删除后": "Après suppression,", + "该设备的历史数据将被清除": "les données historiques de cet appareil seront effacées.", + "有一条新的设备分享消息": "Vous avez un nouveau message de partage d'appareil", + "去查看": "Voir", + "正常值": "Plage normale :", + "绑定设备": "Associer un appareil", + "设备分享提醒": "Rappel de partage d'appareil", + "生命体征": "Signes vitaux", + "无报告": "Aucun rapport", + "注销账号成功": "Compte fermé avec succès", + "注销账号失败": "Échec de la fermeture du compte", + "是否确认注销?": "Confirmez-vous la fermeture du compte ?", + "设备已被用户解绑,将取消当前分享!": "L'appareil a été dissocié par l'utilisateur, le partage actuel sera annulé !", + "设备解绑提醒": "Rappel de dissociation d'appareil", + "位置权限说明": "Explication de la permission de localisation", + "获得位置信息,连接附近的蓝牙设备与推荐附近门店": "Obtenir la localisation pour connecter les appareils Bluetooth à proximité et recommander des magasins près de chez vous", + "获得位置信息,连接附近的蓝牙设备与推荐附近门店和首页获取天气情况": "Obtenir la localisation pour connecter les appareils Bluetooth à proximité, recommander des magasins et obtenir la météo sur la page d'accueil", + "蓝牙权限说明": "Explication de la permission Bluetooth", + "搜索链接附近的蓝牙设备": "Rechercher et connecter des appareils Bluetooth à proximité", + "附近设备权限说明": "Explication de la permission d'appareils à proximité", + "平均心率": "Fréquence cardiaque moyenne", + "平均hrv": "HRV moyenne", + "平均呼吸": "Fréquence respiratoire moyenne", + "在床时长": "Temps au lit", + "生命体征指的是睡眠周期的整体数据。": "Les signes vitaux font référence aux données globales du cycle de sommeil.", + "头像限制": "La photo de profil ne doit pas dépasser 5 Mo", + "睡眠报告提示": "Le contenu de cette page n'est pas un standard médical, les données sont fournies à titre indicatif uniquement.", + "MAC号": "Numéro MAC", + "web控制更新": "Mise à jour du contrôle Web", + "新版本号": "Nouveau numéro de version", + "点击确认退出app,重新进入": "Cliquez pour confirmer la sortie de l'application et la rouvrir", + "设备升级": "Mise à niveau de l'appareil", + "最新版本": "Dernière version", + "升级进度": "Progression de la mise à niveau", + "立即升级": "Mettre à niveau maintenant", + "取消升级": "Annuler la mise à niveau", + "通知设置": "Paramètres de notification", + "睡眠报告通知": "Notification de rapport de sommeil", + "糖管家": "Sugar Butler", + "蓝牙连接成功": "Connexion Bluetooth réussie", + "蓝牙已断开,请点击下方刷新按钮重试": "Bluetooth déconnecté, veuillez cliquer sur le bouton d'actualisation ci-dessous pour réessayer", + "设备维护": "Maintenance de l'appareil", + "远程诊断": "Diagnostic à distance", + "批量升级": "Mise à niveau par lot", + "重置": "Réinitialiser", + "升级": "Mettre à niveau", + "自动升级": "Mise à niveau automatique", + "超出数量限制,请等待": "Limite de quantité dépassée, veuillez patienter", + "图形参考": "Référence graphique", + "正常心率窦性图": "Graphique de rythme sinusal normal", + "窦性心律不齐图": "Graphique d'arythmie sinusale", + "持续性房颤图": "Graphique de fibrillation auriculaire persistante", + "阵法性房颤图": "Graphique de fibrillation auriculaire paroxystique", + "选择城市": "Sélectionner une ville", + "请选择城市": "Ville", + "输入关键词": "Saisir un mot-clé", + "输入国家、省份或城市": "Saisir un pays, une province ou une ville", + "安卓启用网络提示": "Réseau non activé, veuillez activer la connexion réseau", + "ios启用网络提示": "Réseau non activé, veuillez activer la connexion réseau", + "隐私协议加载失败": "Échec du chargement de la politique de confidentialité", + "请检查网络连接后重试": "Veuillez vérifier votre connexion réseau et réessayer", + "开始": "Démarrer", + "结束": "Terminer", + "时长": "Durée :", + "请选择时区": "Fuseau horaire", + "邮箱登录": "Mail", + "慢病管理": "maladie", + "请选择慢病": "maladies chroniques", + "获得位置信息,连接附近的蓝牙设备": "Obtenir la localisation pour connecter les appareils Bluetooth à proximité" +} \ No newline at end of file diff --git a/lib/common/util/base64Tool.dart b/lib/common/util/base64Tool.dart new file mode 100644 index 0000000..7777abe --- /dev/null +++ b/lib/common/util/base64Tool.dart @@ -0,0 +1,24 @@ +import 'dart:convert'; + +class Base64Tool { + /// 编码为 URL 安全的 Base64(网络请求用这个就够了) + static String encode(String text) { + final base64Str = base64.encode(utf8.encode(text)); + return base64Str + .replaceAll('+', '-') + .replaceAll('/', '_') + .replaceAll('=', ''); + } + + /// 解码 URL 安全的 Base64 + static String decode(String urlSafeBase64) { + var base64Str = urlSafeBase64.replaceAll('-', '+').replaceAll('_', '/'); + + // 补充等号 + while (base64Str.length % 4 != 0) { + base64Str += '='; + } + + return utf8.decode(base64.decode(base64Str)); + } +} diff --git a/lib/enum/NetworkType.dart b/lib/enum/NetworkType.dart new file mode 100644 index 0000000..431666f --- /dev/null +++ b/lib/enum/NetworkType.dart @@ -0,0 +1,13 @@ +// 网络类型枚举 +enum NetworkType { + none('无网络'), + wifi('WiFi'), + cellular('移动网络'), + ethernet('以太网'), + bluetooth('蓝牙'), + vpn('VPN'), + other('其他网络'); + + final String description; + const NetworkType(this.description); +} \ No newline at end of file diff --git a/lib/enum/SignalLevel.dart b/lib/enum/SignalLevel.dart new file mode 100644 index 0000000..de37cdf --- /dev/null +++ b/lib/enum/SignalLevel.dart @@ -0,0 +1,12 @@ +// 信号强度等级枚举 +enum SignalLevel { + none(0, '无信号'), + poor(1, '信号弱'), + fair(2, '信号中'), + good(3, '信号良'), + excellent(4, '信号强'); + + final int level; + final String description; + const SignalLevel(this.level, this.description); +} diff --git a/lib/network/NetworkStatusController.dart b/lib/network/NetworkStatusController.dart new file mode 100644 index 0000000..16a991a --- /dev/null +++ b/lib/network/NetworkStatusController.dart @@ -0,0 +1,327 @@ +import 'dart:async'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:vbvs_app/enum/NetworkType.dart'; +import 'package:vbvs_app/enum/SignalLevel.dart'; +import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart'; + +class NetworkStatusController extends GetxController { + static NetworkStatusController get instance => + Get.find(); + + // 响应式变量 + final Rx _networkType = NetworkType.none.obs; + final Rx _signalLevel = SignalLevel.none.obs; + final RxInt _signalStrength = 0.obs; + final RxBool _isLoading = true.obs; + + // 上一次发送的网络状态(用于避免重复发送相同状态) + String _lastSentNetworkType = ''; + int _lastSentSignalStrength = 0; + + // 实例 + final Connectivity _connectivity = Connectivity(); + StreamSubscription? _subscription; + + // Getters + NetworkType get networkType => _networkType.value; + SignalLevel get signalLevel => _signalLevel.value; + int get signalStrength => _signalStrength.value; + bool get isLoading => _isLoading.value; + + // 便利方法 + bool get isUsingWifi => networkType == NetworkType.wifi; + bool get isUsingCellular => networkType == NetworkType.cellular; + bool get isConnected => networkType != NetworkType.none; + + @override + void onInit() { + super.onInit(); + print('网络-----> NetworkStatusController onInit() 开始执行'); + _initNetworkMonitoring(); + } + + Future _initNetworkMonitoring() async { + _isLoading.value = true; + + try { + // 初始检查 + await _checkNetworkStatus(); + + // 监听网络变化 + _subscription = _connectivity.onConnectivityChanged + .listen((List results) { + _updateNetworkType(results); + _checkNetworkStatus(); + }); + + // 定期刷新网络状态(每10秒) + Timer.periodic(const Duration(seconds: 10), (timer) { + _checkNetworkStatus(); + }); + + print('网络-----> 网络监控初始化完成'); + } catch (e) { + print('网络-----> 网络监控初始化失败: $e'); + } finally { + _isLoading.value = false; + } + } + + Future _checkNetworkStatus() async { + try { + // 获取连接类型 + final connectivityResults = await _connectivity.checkConnectivity(); + _updateNetworkType(connectivityResults); + + // 根据网络类型设置信号强度 + _updateSignalLevelAndStrength(); + + // 打印当前网络状态 + _logCurrentNetworkStatus(); + + // 发送网络状态到 WebView + _sendNetworkStatusToWebView(); + } catch (e) { + print('网络-----> 检查网络状态失败: $e'); + } + } + + /// 发送网络状态到 WebView + void _sendNetworkStatusToWebView() { + try { + // 检查网络状态是否发生变化 + String currentNetworkType = _getNetworkTypeString(); + int currentSignalStrength = _signalStrength.value; + + // 如果状态没有变化,不重复发送 + // if (currentNetworkType == _lastSentNetworkType && + // currentSignalStrength == _lastSentSignalStrength) { + // return; + // } + + // 更新上一次发送的状态 + _lastSentNetworkType = currentNetworkType; + _lastSentSignalStrength = currentSignalStrength; + + // 准备要发送的数据 + Map networkData = { + 'networkType': currentNetworkType, + 'signalStrength': currentSignalStrength, + }; + + print('网络-----> 发送网络状态到 WebView: $networkData'); + + // 通过 WebviewTestController 发送到 WebView + if (Get.isRegistered()) { + final webviewTestController = Get.find(); + + // 检查 jsbridge 是否可用 + if (webviewTestController.web.jsbridge?.dart != null) { + webviewTestController.web.jsbridge?.dart?.switchNetWork(networkData); + print('网络-----> 网络状态已成功发送到 WebView'); + } else { + print('网络-----> WebView jsbridge 不可用'); + } + } else { + print('网络-----> WebviewTestController 未注册'); + } + } catch (e) { + print('网络-----> 发送网络状态到 WebView 失败: $e'); + } + } + + /// 获取网络类型字符串 + String _getNetworkTypeString() { + if (isUsingWifi) { + return 'wifi'; + } else if (isUsingCellular) { + return 'cellular'; + } else { + return 'none'; + } + } + + void _logCurrentNetworkStatus() { + print('网络-----> 当前网络类型: ${_networkType.value.description}'); + print('网络-----> 当前信号等级: ${_signalLevel.value.description}'); + print('网络-----> 当前信号强度: ${_signalStrength.value}dBm'); + print('网络-----> 是否连接: ${isConnected ? "是" : "否"}'); + print('网络-----> 发送到WebView的类型: ${_getNetworkTypeString()}'); + } + + void _updateNetworkType(List results) { + if (results.isEmpty) { + _networkType.value = NetworkType.none; + print('网络-----> 网络类型变化: 无网络连接'); + return; + } + + ConnectivityResult mainResult = results.first; + + // 优先选择WiFi + if (results.contains(ConnectivityResult.wifi)) { + mainResult = ConnectivityResult.wifi; + } else if (results.contains(ConnectivityResult.mobile)) { + mainResult = ConnectivityResult.mobile; + } + + NetworkType newType; + + switch (mainResult) { + case ConnectivityResult.wifi: + newType = NetworkType.wifi; + break; + case ConnectivityResult.mobile: + newType = NetworkType.cellular; + break; + case ConnectivityResult.ethernet: + newType = NetworkType.ethernet; + break; + case ConnectivityResult.bluetooth: + newType = NetworkType.bluetooth; + break; + case ConnectivityResult.vpn: + newType = NetworkType.vpn; + break; + case ConnectivityResult.other: + newType = NetworkType.other; + break; + case ConnectivityResult.none: + default: + newType = NetworkType.none; + break; + } + + if (newType != _networkType.value) { + _networkType.value = newType; + print('网络-----> 网络类型变化: ${newType.description}'); + } + } + + void _updateSignalLevelAndStrength() { + // 根据网络类型设置信号等级和强度 + switch (_networkType.value) { + case NetworkType.none: + _signalLevel.value = SignalLevel.none; + _signalStrength.value = 0; + break; + + case NetworkType.wifi: + // WiFi连接 + _signalLevel.value = SignalLevel.good; + _signalStrength.value = -65; // WiFi正常连接强度 + break; + + case NetworkType.cellular: + // 移动网络 + _signalLevel.value = SignalLevel.good; + _signalStrength.value = -85; // 移动网络正常强度 + break; + + default: + // 其他网络类型 + _signalLevel.value = SignalLevel.good; + _signalStrength.value = -60; + break; + } + + print( + '网络-----> 信号等级: ${_signalLevel.value.description}, 强度: ${_signalStrength.value}dBm'); + } + + /// 手动刷新网络状态并发送到 WebView + Future refresh() async { + await _checkNetworkStatus(); + } + + /// 获取网络状态描述 + String getNetworkStatusDescription() { + if (isUsingWifi) { + return 'WiFi,信号${signalLevel.description}'; + } else if (isUsingCellular) { + return '移动网络,信号${signalLevel.description}'; + } else { + return '无网络连接'; + } + } + + /// 获取网络状态颜色 + Color getNetworkStatusColor() { + switch (signalLevel) { + case SignalLevel.excellent: + case SignalLevel.good: + return Colors.green; + case SignalLevel.fair: + return Colors.orange; + case SignalLevel.poor: + case SignalLevel.none: + return Colors.red; + } + } + + /// 获取WiFi图标 + IconData getWifiIcon() { + if (!isUsingWifi) return Icons.signal_wifi_off; + + switch (signalLevel) { + case SignalLevel.excellent: + return Icons.signal_wifi_4_bar; + case SignalLevel.good: + return Icons.signal_wifi_4_bar; + case SignalLevel.fair: + return Icons.signal_wifi_4_bar; + case SignalLevel.poor: + return Icons.signal_wifi_4_bar; + case SignalLevel.none: + return Icons.signal_wifi_off; + } + } + + /// 获取蜂窝网络图标 + IconData getCellularIcon() { + switch (signalLevel) { + case SignalLevel.excellent: + case SignalLevel.good: + return Icons.signal_cellular_4_bar; + case SignalLevel.fair: + return Icons.signal_cellular_4_bar; + case SignalLevel.poor: + return Icons.signal_cellular_4_bar; + case SignalLevel.none: + return Icons.signal_cellular_0_bar; + } + } + + /// 获取当前应该显示的图标 + IconData getCurrentNetworkIcon() { + if (isUsingWifi) { + return getWifiIcon(); + } else if (isUsingCellular) { + return getCellularIcon(); + } else { + return Icons.signal_wifi_off; + } + } + + /// 获取当前网络状态数据(供外部调用) + Map getCurrentNetworkData() { + return { + 'networkType': _getNetworkTypeString(), + 'signalStrength': signalStrength, + }; + } + + /// 手动发送网络状态到 WebView(供外部调用) + void sendNetworkStatus() { + _sendNetworkStatusToWebView(); + } + + @override + void onClose() { + _subscription?.cancel(); + print('网络-----> NetworkStatusController 已关闭'); + super.onClose(); + } +} \ No newline at end of file