基本完成APP的所有页面中的语言切换支持的开发和设计

This commit is contained in:
2026-04-24 15:24:43 +08:00
parent ba4519125e
commit 2e241cb9f5
26 changed files with 649 additions and 416 deletions

View File

@@ -2,6 +2,7 @@ import 'package:cc_ui_kit/cc_ui_kit.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:maibu_satabot_v2/core/localization/app_localizations.dart';
import '../bloc/remote_control_cubit.dart';
import 'emergency_stop_button.dart';
@@ -41,7 +42,7 @@ class CenterControlArea extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
_buildSliderBox(expandedWidth, "底盘", true,context),
_buildSliderBox(expandedWidth, AppLocalizations.of(context).translate('remote_control.chassis'), true,context),
SizedBox(height: totalWidth * 0.01),
],
),
@@ -57,9 +58,9 @@ class CenterControlArea extends StatelessWidget {
SizedBox(height: totalWidth * 0.05),
const Text(
'双击空白处切换视角',
style: TextStyle(fontSize: 8, color: Colors.grey),
Text(
AppLocalizations.of(context).translate('remote_control.switch_view_hint'),
style: const TextStyle(fontSize: 8, color: Colors.grey),
),
],
),
@@ -71,7 +72,7 @@ class CenterControlArea extends StatelessWidget {
width: expandedWidth,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [_buildSliderBox(expandedWidth, "割刀", false,context)],
children: [_buildSliderBox(expandedWidth, AppLocalizations.of(context).translate('remote_control.mower'), false,context)],
),
),
],
@@ -93,7 +94,9 @@ class CenterControlArea extends StatelessWidget {
svgStart: "assets/svgs/remote_up.svg",
svgCenter: switch (label) {
"割刀" => "assets/svgs/remote_scissors.svg",
"Mower" => "assets/svgs/remote_scissors.svg",
"底盘" => "assets/svgs/remote_layers.svg",
"Chassis" => "assets/svgs/remote_layers.svg",
_ => "assets/svgs/remote_layers.svg", // 下划线表示默认值
},
svgEnd: "assets/svgs/remote_down.svg",
@@ -111,12 +114,15 @@ class CenterControlArea extends StatelessWidget {
void _handleSliderAction(String label, String action, BuildContext context) {
debugPrint('🎯 [Slider 业务] label: $label, action: $action');
final loc = AppLocalizations.of(context);
// 🔥 根据 label 区分不同的设备
switch (label) {
case "底盘":
case "Chassis":
_handleChassisAction(action, context);
break;
case "割刀":
case "Mower":
_handleMowerAction(action, context);
break;
default:

View File

@@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:vibration/vibration.dart';
import 'package:maibu_satabot_v2/core/localization/app_localizations.dart';
import '../bloc/remote_control_cubit.dart';
@@ -158,7 +159,9 @@ class _EmergencyStopButtonState extends State<EmergencyStopButton>
),
const SizedBox(height: 6),
Text(
isEmergencyActive ? "急停中" : "急停",
isEmergencyActive
? AppLocalizations.of(context).translate('remote_control.emergency_stopping')
: AppLocalizations.of(context).translate('remote_control.emergency_stop'),
style: TextStyle(
color: Colors.white.withValues(alpha: 0.5),
fontSize: 14,

View File

@@ -3,6 +3,7 @@ import 'package:cc_ui_kit/cc_ui_kit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:vibration/vibration.dart';
import 'package:maibu_satabot_v2/core/localization/app_localizations.dart';
import '../bloc/remote_control_cubit.dart';
@@ -63,7 +64,7 @@ class _LeftJoystickAreaState extends State<LeftJoystickArea> {
),
const SizedBox(height: 18),
Text(
"前后控制",
AppLocalizations.of(context).translate('remote_control.forward_backward'),
style: TextStyle(
color: Colors.white.withOpacity(0.5),
fontSize: 12,

View File

@@ -2,6 +2,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:vibration/vibration.dart';
import 'package:maibu_satabot_v2/core/localization/app_localizations.dart';
import '../bloc/remote_control_cubit.dart';
@@ -58,7 +59,7 @@ class _RightJoystickAreaState extends State<RightJoystickArea> {
),
const SizedBox(height: 18),
Text(
"左右控制",
AppLocalizations.of(context).translate('remote_control.left_right'),
style: TextStyle(
color: Colors.white.withOpacity(0.5),
fontSize: 12,

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:maibu_satabot_v2/core/localization/app_localizations.dart';
import 'package:maibu_satabot_v2/features/remote_control/presentation/bloc/remote_control_state.dart';
import 'package:maibu_satabot_v2/features/remote_control/presentation/widgets/status_chip.dart';
import 'package:cc_ui_kit/cc_ui_kit.dart';
@@ -51,7 +52,9 @@ class TopStatusBar extends StatelessWidget {
// 2. 控制状态 (对应 StatusChipLeft)
StatusChip(
text: remoteState.hasPermission ? "正在控制" : "未在控制",
text: remoteState.hasPermission
? AppLocalizations.of(context).translate('remote_control.controlling')
: AppLocalizations.of(context).translate('remote_control.not_controlling'),
color: remoteState.hasPermission
? const Color(0xFF1DB954)
: Colors.red,
@@ -81,7 +84,7 @@ class TopStatusBar extends StatelessWidget {
// const SizedBox(width: 8),
// 5. 火技能按钮 (对应 SmallFunctionButton)
//_buildIconButton("assets/svgs/fire.svg", () {}),
_buildSliderBox("火技能按钮", false,context),
_buildSliderBox(AppLocalizations.of(context).translate('remote_control.fire_skill'), false,context),
const Spacer(),
_buildExpandIconButton(
@@ -127,7 +130,7 @@ class TopStatusBar extends StatelessWidget {
},
),
const SizedBox(width: 8),
_buildControlModeChip(remoteState.runningStatusModel.controlMode),
_buildControlModeChip(remoteState.runningStatusModel.controlMode, context),
const SizedBox(width: 8),
_buildVoltageChip(remoteState.runningStatusModel.voltage),
const SizedBox(width: 8),
@@ -245,10 +248,10 @@ class TopStatusBar extends StatelessWidget {
);
}
Widget _buildControlModeChip(String mode) {
Widget _buildControlModeChip(String mode, BuildContext context) {
String displayText;
if(mode == ''){
displayText = '无模式';
displayText = AppLocalizations.of(context).translate('remote_control.mode_none');
}else{
displayText = mode;
}