更新默认本地语言

This commit is contained in:
wyf
2025-08-11 14:55:09 +08:00
parent 50e1ebea20
commit da6da14d6a
16 changed files with 1468 additions and 1290 deletions

View File

@@ -146,7 +146,7 @@
"其他手机登录页": {
"输入内容": "Enter phone number/email",
"输入验证码": "Enter verification code",
"获取验证码":"Get verification code",
"获取验证码": "Get code",
"登录": "Login",
"请输入手机号": "Please enter phone number/email",
"不正确手机号": "Please enter valid phone number or email",
@@ -176,9 +176,6 @@
"退出成功": "Logout successful",
"退出失败": "Logout failed"
},
"关于我们":{
"标题":"About Us"
},
"服务器": {
"失败": "Server error, please contact administrator"
},
@@ -236,7 +233,6 @@
},
"未命名": "Unnamed",
"未知时间": "Unknown",
"设备ID":"Device ID",
"更新时间": "Update time",
"已分享": "Shared",
"设备来源": "Device source",
@@ -349,9 +345,9 @@
"连接中...": "Connecting",
"刷新": "Refresh",
"版本": "Version:",
"日报":"Daily",
"报":"Monthly",
"报":"Weekly",
"日报": "Day",
"报": "Week",
"报": "Month",
"4g设备配置wifi提示": "4G device doesn't require WiFi configuration",
"微信客服提示": "Please install WeChat APP first to contact support",
"打开微信客服提示": "Opening WeChat support...",
@@ -422,6 +418,24 @@
"次": "times",
"秒": "sec",
"暂无": "none",
"失败": "Failed"
"失败": "Failed",
"关于我们": "About Us",
"周一": "Mon",
"周二": "Tue",
"周三": "Wed",
"周四": "Thu",
"周五": "Fri",
"周六": "Sat",
"周日": "Sun",
"无报告": "none",
"姓名": "Name",
"年龄": "Age",
"设备ID": "Device ID",
"体重": "Weight",
"分": "",
"位置权限说明": "Location Permission Description",
"获得位置信息,连接附近的蓝牙设备与推荐附近门店": "Obtain location information, connect to nearby Bluetooth devices, and recommend nearby stores",
"蓝牙权限说明": "Bluetooth Permission Description",
"搜索链接附近的蓝牙设备": "Search and connect to nearby Bluetooth devices",
"附近设备权限说明": "Nearby Device Permission Description"
}

View File

@@ -142,7 +142,6 @@
"配网失败": "配网失败",
"配网中": "配网中",
"需配网": "请给设备配置网络!"
},
"其他手机登录页": {
"输入内容": "输入手机号码/邮箱",
@@ -177,9 +176,6 @@
"退出成功": "退出成功",
"退出失败": "退出失败"
},
"关于我们":{
"标题":"关于我们"
},
"服务器": {
"失败": "服务器内部错误,请联系管理员"
},
@@ -237,7 +233,6 @@
},
"未命名": "未命名",
"未知时间": "-",
"设备ID":"设备ID",
"更新时间": "更新时间",
"已分享": "已分享",
"设备来源": "设备来源",
@@ -436,8 +431,24 @@
"暂无": "暂无",
"设备连接超时,请重试": "设备连接超时,请点击刷新重试",
"设备连接失败": "设备连接失败,请点击刷新重试",
"失败":"服务器内部错误,请联系管理员"
"失败": "服务器内部错误,请联系管理员",
"关于我们": "关于我们",
"周一": "周一",
"周二": "周二",
"周三": "周三",
"周四": "周四",
"周五": "周五",
"周六": "周六",
"周日": "周日",
"无报告": "无报告",
"姓名": "姓名",
"年龄": "年龄",
"设备ID": "设备ID",
"体重": "体重",
"分":"分",
"位置权限说明":"位置权限说明",
"获得位置信息,连接附近的蓝牙设备与推荐附近门店":"获得位置信息,连接附近的蓝牙设备与推荐附近门店",
"蓝牙权限说明":"蓝牙权限说明",
"搜索链接附近的蓝牙设备":"搜索链接附近的蓝牙设备",
"附近设备权限说明":"附近设备权限说明"
}

View File

@@ -176,9 +176,6 @@
"退出成功": "退出成功",
"退出失败": "退出失敗"
},
"关于我们":{
"标题":"關於我們"
},
"服务器": {
"失败": "服務器內部錯誤,請聯繫管理員"
},
@@ -421,5 +418,23 @@
"昨日数据": "昨日數據",
"次": "次",
"秒": "秒",
"失败": "失敗"
"失败": "失敗",
"关于我们": "關於我們",
"周一": "週一",
"周二": "週二",
"周三": "週三",
"周四": "週四",
"周五": "週五",
"周六": "週六",
"周日": "週日",
"无报告": "无报告",
"姓名": "姓名",
"年龄": "年齡",
"体重": "體重",
"分": "分",
"位置权限说明": "位置權限說明",
"获得位置信息,连接附近的蓝牙设备与推荐附近门店": "獲得位置信息,連接附近的藍牙設備與推薦附近門店",
"蓝牙权限说明": "藍牙權限說明",
"搜索链接附近的蓝牙设备": "搜索連接附近的藍牙設備",
"附近设备权限说明": "附近設備權限說明"
}

View File

@@ -1,10 +1,10 @@
class ServiceConstant {
// static const String baseHost = "zhmht.swes.com.cn:27021"; //服务地址 眠花糖测试地址
static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址
// static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址
// static const String baseHost = "zhmht.swes.com.cn:27020"; //服务地址 眠花糖正式地址
static const String baseHost = "vsbs-test.he-info.cn"; //服务地址 本地测试地址
// static const String baseHost = "vsbst-api.he-info.cn";//服务地址
// static const String service_address = "http://$baseHost";
static const String service_address = "https://$baseHost";
static const String service_address = "http://$baseHost";
// static const String service_address = "https://$baseHost";
static String server_service = "/vsbs_app_server"; //服务名称

View File

@@ -17,42 +17,6 @@ class SleepdateWidget extends StatelessWidget {
this.highlightColor = Colors.black, // 默认值黑色
});
@override
// Widget build(BuildContext context) {
// return ClickableContainer(
// onTap: onTap,
// backgroundColor: Colors.transparent,
// highlightColor: Colors.transparent,
// padding: EdgeInsets.all(4.rpx),
// child: Container(
// width: 90.rpx,
// height: 90.rpx,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(30.rpx),
// color: isSelected ? highlightColor : Colors.transparent, // 使用传入的颜色
// ),
// child: Padding(
// padding:
// EdgeInsetsDirectional.fromSTEB(10.rpx, 10.rpx, 10.rpx, 10.rpx),
// child: Container(
// decoration: BoxDecoration(
// color: Color(0xFF757575),
// shape: BoxShape.circle,
// ),
// alignment: Alignment.center,
// child: Text(
// '${date.day}',
// style: TextStyle(
// color: Colors.white,
// fontSize: 26.rpx,
// letterSpacing: 0.0,
// ),
// ),
// ),
// ),
// ),
// );
// }
@override
Widget build(BuildContext context) {
Color? fillColor;

View File

@@ -6,7 +6,6 @@ import 'package:ef/ef.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart';
import 'package:vbvs_app/controller/setting/language/language_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
@@ -40,7 +39,7 @@ class DeviceTypeController extends GetControllerEx<DeviceTypeModel> {
attr = GetModel(DeviceTypeModel()).obs;
}
RxList deviceTypeList = [].obs;
MHLanguageController languageController = Get.find();
LanguageController languageController = Get.find();
Future<ApiResponse> getDeviceType() async {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "请求失败".tr);

View File

@@ -181,6 +181,10 @@ class MessageController extends GetControllerEx<MessageModel> {
queryUrl += "?lang=$language";
}
}
if (type != null) {
queryUrl = "$queryUrl&type=$type";
}
queryUrl = "$queryUrl&mid=ALL";
var response = await EasyDartModule.dio.post(queryUrl);
if (response != null) {

View File

@@ -5,6 +5,8 @@ import 'package:ef/ef.dart';
import 'package:flutter/services.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:path/path.dart' as path;
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/language/AppLanguage.dart';
part 'mh_language_controller.g.dart'; // 由json_serializable自动生成的部分
@@ -47,10 +49,25 @@ class MHLanguageController extends GetControllerEx<MHLanguageModel> {
final Map<String, dynamic> manifestMap = json.decode(manifestContent);
// 筛选出 langs 目录下的 .json 文件
final langFiles = manifestMap.keys
int code = AppConstants().ent_type;
final langFiles;
if (APPPackageType.TH.code == code) {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/langs/') && key.endsWith('.json'))
.toList();
} else if (APPPackageType.MHT.code == code) {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/mhlangs/') && key.endsWith('.json'))
.toList();
} else {
langFiles = manifestMap.keys
.where((String key) =>
key.startsWith('assets/langs/') && key.endsWith('.json'))
.toList();
}
// 2. 遍历所有语言文件
for (final filePath in langFiles) {

View File

@@ -6,6 +6,7 @@ import 'package:get_storage/get_storage.dart';
import 'package:img_picker/img_picker.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
@@ -14,6 +15,7 @@ import 'package:vbvs_app/controller/home/home_controller.dart';
import 'package:vbvs_app/controller/login/login_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/model/user_data.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
@@ -225,7 +227,11 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
}
ApiResponse logOut() {
int code = AppConstants().ent_type;
if (APPPackageType.MHT.code == code) {
MHTHomeController mhtHomeController = Get.find();
mhtHomeController.personnelList.value = [];
}
ApiResponse apiResponse = ApiResponse(code: 1, msg: "退出成功".tr);
EasyDartModule.logger.info("退出登录");
DailyLogUtils.writeLog("退出登录");
@@ -246,9 +252,9 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
messageController.model.system_message_read = 0;
CountdownController countdownController = Get.find();
countdownController.countdown.value = 0;
mhtHomeController.personnelList.value = [];
return apiResponse;
}
ApiResponse deleteAccount() {
MHTHomeController mhtHomeController = Get.find();
ApiResponse apiResponse = ApiResponse(code: 1, msg: "注销成功".tr);

View File

@@ -91,7 +91,7 @@ Future<void> main() async {
final Locale? deviceLocale = Get.deviceLocale;
print('系统语言: ${deviceLocale?.languageCode}');
await loadLanguageSetting();
await loadLanguageSetting(deviceLocale?.languageCode);
await initLanguageSetting();
WidgetsFlutterBinding.ensureInitialized();
@@ -121,12 +121,37 @@ Future<void> main() async {
});
}
loadLanguageSetting() async {
await ef.kvdb.openDir("mht");
String? language = await ef.kvdb.read("mht/language");
// languageCode 系统默认语言码 en/zh
loadLanguageSetting(String? languageCode) async {
int code = AppConstants().ent_type;
String? language;
language ??= 'zh_CN';
await AppLanguage().loadLanguage(language, project: APPPackageType.MHT.code);
if (APPPackageType.MHT.code == code) {
await ef.kvdb.openDir("mht");
language = await ef.kvdb.read("mht/language");
} else if (APPPackageType.TH.code == code) {
await ef.kvdb.openDir("th");
language = await ef.kvdb.read("th/language");
} else {
await ef.kvdb.openDir("th");
language = await ef.kvdb.read("th/language");
}
// 如果 kvdb 没有存储
if (language == null || language.isEmpty) {
if (languageCode == null || languageCode.isEmpty) {
language = 'en_US'; // 系统默认为空时用 en_US
} else {
language = (languageCode.toLowerCase() == 'zh') ? 'zh_CN' : 'en_US';
}
}
await AppLanguage().loadLanguage(
language,
project: (APPPackageType.MHT.code == code)
? APPPackageType.MHT.code
: APPPackageType.TH.code,
);
}
void initwebService() {

View File

@@ -1,5 +1,6 @@
import 'package:EasyDartModule/EasyDartModule.dart' as edm;
import 'package:ef/ef.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:fluwx/fluwx.dart';
@@ -19,6 +20,8 @@ import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/pages/user/privacy_scheme_page.dart';
import 'package:vbvs_app/pages/user/user_scheme_page.dart';
class OtherLoginPage extends StatefulWidget {
const OtherLoginPage({super.key});
@@ -34,10 +37,32 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
CountdownController countdownController = Get.find();
LoginController loginController = Get.find();
late TapGestureRecognizer _tapRecognizer2;
late TapGestureRecognizer _tapRecognizer4;
@override
void dispose() {
_tapRecognizer2.dispose();
_tapRecognizer4.dispose();
super.dispose();
}
@override
void initState() {
// TODO: implement initState
super.initState();
_tapRecognizer2 = TapGestureRecognizer()
..onTap = () {
// 协议2点击事件逻辑
print('点击了协议2');
// Get.to(() => UserSchemePage());
Get.toNamed("/userSchemePage");
};
_tapRecognizer4 = TapGestureRecognizer()
..onTap = () {
// 协议4点击事件逻辑
print('点击了协议4');
Get.toNamed("/privacyPage");
};
super.initState();
LoginController loginController = Get.find();
Fluwx fluwx = loginController.fluwx;
@@ -668,6 +693,86 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
checkColor: Colors.white,
),
)),
// Expanded(
// child: Padding(
// padding: EdgeInsetsDirectional.fromSTEB(
// 0.rpx, 10.rpx, 0.rpx, 0.rpx),
// child: Container(
// width: bodysize.maxWidth,
// constraints: BoxConstraints(
// minWidth: 500.rpx,
// minHeight: 90.rpx,
// ),
// child: RichText(
// text: TextSpan(
// children: [
// TextSpan(
// text: '登录页.协议1'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议2'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// TextSpan(
// text: '登录页.协议3'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议4'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// TextSpan(
// text: '登录页.协议5'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议6'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// ),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
@@ -700,6 +805,7 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
color:
stringToColor("#FF9F66"),
),
recognizer: _tapRecognizer2,
),
TextSpan(
text: '登录页.协议3'.tr,
@@ -720,27 +826,28 @@ class _OtherLoginPageState extends State<OtherLoginPage> {
color:
stringToColor("#FF9F66"),
),
recognizer: _tapRecognizer4,
),
TextSpan(
text: '登录页.协议5'.tr,
style: TextStyle(
fontFamily: 'Inter',
letterSpacing: 0.0,
fontSize: 20.rpx,
color: themeController
.currentColor.sc3,
),
),
TextSpan(
text: '登录页.协议6'.tr,
style: TextStyle(
fontFamily: 'Inter',
letterSpacing: 0.0,
fontSize: 20.rpx,
color:
stringToColor("#FF9F66"),
),
),
// TextSpan(
// text: '登录页.协议5'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color: themeController
// .currentColor.sc3,
// ),
// ),
// TextSpan(
// text: '登录页.协议6'.tr,
// style: TextStyle(
// fontFamily: 'Inter',
// letterSpacing: 0.0,
// fontSize: 20.rpx,
// color:
// stringToColor("#FF9F66"),
// ),
// ),
],
),
),

View File

@@ -7,6 +7,7 @@ import 'package:vbvs_app/component/tool/ClickableContainer.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/main_bottom/global_controller.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/enum/LoginStatus.dart';
class EPage extends StatefulWidget {
const EPage({super.key});
@@ -69,7 +70,17 @@ class _EPageState extends State<EPage> {
highlightColor: Colors.transparent,
padding: EdgeInsets.all(0.rpx),
onTap: () {
UserInfoController userInfoController = Get.find();
bool isLoggedIn =
userInfoController.model.login == LoginStatus.LOGIN.code;
if (!isLoggedIn) {
TopSlideNotification.show(context,
text: "必须登录提示".tr,
textColor: themeController.currentColor.sc9);
Get.toNamed("/otherLoginPage");
} else {
TopSlideNotification.show(context, text: "待开发功能".tr);
}
},
child: Container(
// child: widget.webView,

View File

@@ -995,16 +995,14 @@ class _HomePageState extends State<HomePage> {
}
return Expanded(
child: SingleChildScrollView(child:
Column(
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 26.rpx), // 第一个上方间距
...List.generate(deviceList.length, (i) {
String mac = macList[i];
List<dynamic> dailyDataList =
reportData[mac]!;
Map? targetDevice =
deviceList.firstWhereOrNull(
List<dynamic> dailyDataList = reportData[mac]!;
Map? targetDevice = deviceList.firstWhereOrNull(
(device) => device['mac'] == mac,
);
List stateModule = [];
@@ -1020,11 +1018,9 @@ class _HomePageState extends State<HomePage> {
targetDevice: targetDevice!,
sleepDateWidgets: List.generate(
dailyDataList.length, (j) {
var dayData = dailyDataList[j];
DateTime date = DateTime
.fromMillisecondsSinceEpoch(
DateTime date =
DateTime.fromMillisecondsSinceEpoch(
dayData['time'] is String
? int.parse(dayData['time'])
: dayData['time'],
@@ -1059,8 +1055,7 @@ class _HomePageState extends State<HomePage> {
stateModule[j]['time'] =
currentTime;
stateModule[j]['mac'] = goalMac;
stateModule[j]['person'] =
person;
stateModule[j]['person'] = person;
return SleepDataModuleWidget(
data: stateModule[j]);
})
@@ -1073,8 +1068,7 @@ class _HomePageState extends State<HomePage> {
);
}),
],
)
),
)),
);
}),
],

View File

@@ -141,7 +141,8 @@ class MainPageBottomChange extends GetView<MainPageController> {
bool isLoggedIn = userInfoController.model.login ==
LoginStatus.LOGIN.code;
if ((index == 1 || index == 2) && !isLoggedIn) {
// if ((index == 1 || index == 2) && !isLoggedIn) {
if ((index == 2) && !isLoggedIn) {
TopSlideNotification.show(
context,
text: "必须登录提示".tr,

View File

@@ -6,7 +6,6 @@ import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/MyUtils.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/controller/setting/language/language_controller.dart';
import 'package:vbvs_app/language/AppLanguage.dart';
import 'package:vbvs_app/pages/device_bind/componnet/FancyCircleCheckbox.dart';
@@ -19,7 +18,7 @@ class LanguageSetting extends StatefulWidget {
}
class _LanguageSettingState extends State<LanguageSetting> {
MHLanguageController languageController = Get.find();
LanguageController languageController = Get.find();
@override
void initState() {
// languageController.initLanuageList();
@@ -129,6 +128,15 @@ class _LanguageSettingState extends State<LanguageSetting> {
.language_code); // 加载语言
languageController
.updateAll(); // 更新操作
try {
// ef.kv.set("language",
// language.language_code);
await ef.kvdb.write(
"th/language",
language.language_code);
} catch (e) {
print(e);
}
},
child: Row(
mainAxisSize: MainAxisSize.max,

View File

@@ -57,7 +57,7 @@ var routes = {
// "/loginPage": (contxt) => LoginPage(),
// "/otherLoginPage": (contxt) => OtherLoginPage(),
"/loginPage": (contxt) => OtherLoginPage(),
// "/otherLoginPage": (contxt) => OtherLoginPage(),
"/otherLoginPage": (contxt) => OtherLoginPage(),
"/deviceType": (contxt, {arguments}) => DeviceTypePage(),
"/blueteethDevice": (contxt) => BlueteethDevicePage(),
"/personPage": (contxt) => PersonPage(),
@@ -119,7 +119,9 @@ var onGenerateRoute = (RouteSettings settings) {
// 如果用户未登录且访问的不是登录页面等,展示提示并重定向
if (settings.name != "/loginPage" &&
settings.name != "/otherLoginPage" &&
settings.name != "/mianPageBottomChange") {
settings.name != "/mianPageBottomChange" &&
settings.name != "/userSchemePage" &&
settings.name != "/privacyPage") {
TopSlideNotification.show(
Get.context!,
text: "必须登录提示".tr,