Эх сурвалжийг харах

完善语言切换 - 所有页面标题栏和内部文字跟随语言设置

磊 曹 1 долоо хоног өмнө
parent
commit
1a7aa2a496

+ 41 - 41
src/YZWater.Avalonia/Views/ViewAView.axaml

@@ -17,23 +17,23 @@
                 <Grid ColumnDefinitions="Auto,*,Auto,Auto,Auto" Margin="16,0">
                     <StackPanel Grid.Column="0" Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource SuccessBrush}" Width="4" Height="24" CornerRadius="2"/>
-                        <TextBlock Text="YZ WATER" FontSize="16" FontWeight="Bold"
+                        <TextBlock Text="{Binding TitleText}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" FontFamily="Consolas, monospace"
                                    VerticalAlignment="Center"/>
-                        <TextBlock Text="污水处理监控系统" FontSize="12"
+                        <TextBlock Text="{Binding SubtitleText}" FontSize="12"
                                    Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
 
                     <StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="8" VerticalAlignment="Center" Margin="24,0">
                         <Border Width="10" Height="10" CornerRadius="5" Background="{DynamicResource SuccessBrush}"/>
-                        <TextBlock Text="PLC CONNECTED" FontFamily="Consolas, monospace" FontSize="11"
+                        <TextBlock Text="{Binding PlcStatusText}" FontFamily="Consolas, monospace" FontSize="11"
                                    Foreground="{DynamicResource SuccessBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
 
                     <StackPanel Grid.Column="3" Orientation="Horizontal" Spacing="4" VerticalAlignment="Center" Margin="16,0">
-                        <Button Content="CONNECT" Command="{Binding ConnectPlcCommand}" Classes="btn-success" Padding="8,3" FontSize="10"/>
-                        <Button Content="DISCONNECT" Command="{Binding DisconnectPlcCommand}" Classes="btn-danger" Padding="8,3" FontSize="10"/>
-                        <Button Content="REFRESH" Command="{Binding RefreshDataCommand}" Classes="btn-info" Padding="8,3" FontSize="10"/>
+                        <Button Content="{Binding ConnectText}" Command="{Binding ConnectPlcCommand}" Classes="btn-success" Padding="8,3" FontSize="10"/>
+                        <Button Content="{Binding DisconnectText}" Command="{Binding DisconnectPlcCommand}" Classes="btn-danger" Padding="8,3" FontSize="10"/>
+                        <Button Content="{Binding RefreshText}" Command="{Binding RefreshDataCommand}" Classes="btn-info" Padding="8,3" FontSize="10"/>
                     </StackPanel>
 
                     <StackPanel Grid.Column="4" VerticalAlignment="Center" HorizontalAlignment="Right">
@@ -57,7 +57,7 @@
 
                         <StackPanel Grid.Row="0" Orientation="Horizontal" Spacing="8" Margin="0,0,0,8">
                             <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="16" CornerRadius="1"/>
-                            <TextBlock Text="PROCESS FLOW" FontFamily="Consolas, monospace"
+                            <TextBlock Text="{Binding ProcessFlowText}" FontFamily="Consolas, monospace"
                                        FontSize="12" FontWeight="Bold" Foreground="{DynamicResource TextSecondaryBrush}"/>
                         </StackPanel>
 
@@ -70,7 +70,7 @@
                                             Spacing="20" HorizontalAlignment="Center" Margin="0,0,0,8">
                                     <StackPanel>
                                         <controls:WaterTankControl Width="110" Height="130"
-                                                                   WaterLevel="{Binding Tank1Level}" Text="入口池"
+                                                                   WaterLevel="{Binding Tank1Level}" Text="{Binding Tank1Text}"
                                                                    WaterColor="{DynamicResource TankInletBrush}" BorderColor="{DynamicResource BorderBrush}"/>
                                         <Border Background="{DynamicResource BorderBrush}" Padding="6,2" Margin="0,2,0,0">
                                             <TextBlock Text="{Binding Tank1Level, StringFormat='LV: {0:F1}%'}"
@@ -81,7 +81,7 @@
                                     <TextBlock Text="→" FontSize="24" Foreground="{DynamicResource SuccessBrush}" VerticalAlignment="Center"/>
                                     <StackPanel>
                                         <controls:WaterTankControl Width="110" Height="130"
-                                                                   WaterLevel="{Binding Tank2Level}" Text="生化池"
+                                                                   WaterLevel="{Binding Tank2Level}" Text="{Binding Tank2Text}"
                                                                    WaterColor="{DynamicResource TankBioBrush}" BorderColor="{DynamicResource BorderBrush}"/>
                                         <Border Background="{DynamicResource BorderBrush}" Padding="6,2" Margin="0,2,0,0">
                                             <TextBlock Text="{Binding Tank2Level, StringFormat='LV: {0:F1}%'}"
@@ -92,7 +92,7 @@
                                     <TextBlock Text="→" FontSize="24" Foreground="{DynamicResource SuccessBrush}" VerticalAlignment="Center"/>
                                     <StackPanel>
                                         <controls:WaterTankControl Width="110" Height="130"
-                                                                   WaterLevel="{Binding Tank3Level}" Text="沉淀池"
+                                                                   WaterLevel="{Binding Tank3Level}" Text="{Binding Tank3Text}"
                                                                    WaterColor="{DynamicResource TankSedimentBrush}" BorderColor="{DynamicResource BorderBrush}"/>
                                         <Border Background="{DynamicResource BorderBrush}" Padding="6,2" Margin="0,2,0,0">
                                             <TextBlock Text="{Binding Tank3Level, StringFormat='LV: {0:F1}%'}"
@@ -103,7 +103,7 @@
                                     <TextBlock Text="→" FontSize="24" Foreground="{DynamicResource SuccessBrush}" VerticalAlignment="Center"/>
                                     <StackPanel>
                                         <controls:WaterTankControl Width="110" Height="130"
-                                                                   WaterLevel="{Binding Tank4Level}" Text="出口池"
+                                                                   WaterLevel="{Binding Tank4Level}" Text="{Binding Tank4Text}"
                                                                    WaterColor="{DynamicResource TankOutletBrush}" BorderColor="{DynamicResource BorderBrush}"/>
                                         <Border Background="{DynamicResource BorderBrush}" Padding="6,2" Margin="0,2,0,0">
                                             <TextBlock Text="{Binding Tank4Level, StringFormat='LV: {0:F1}%'}"
@@ -144,31 +144,31 @@
                                         <StackPanel>
                                             <controls:PumpControl Width="60" Height="68"
                                                                   IsRunning="{Binding Pump1Running}" Frequency="50" Text="P1"/>
-                                            <TextBlock Text="进水泵1" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Pump1Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                         <StackPanel>
                                             <controls:PumpControl Width="60" Height="68"
                                                                   IsRunning="{Binding Pump2Running}" Frequency="45" Text="P2"/>
-                                            <TextBlock Text="进水泵2" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Pump2Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                         <StackPanel>
                                             <controls:PumpControl Width="60" Height="68"
                                                                   IsRunning="{Binding Pump3Running}" Frequency="40" Text="P3"/>
-                                            <TextBlock Text="回流泵" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Pump3Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                         <StackPanel>
                                             <controls:PumpControl Width="60" Height="68"
                                                                   IsRunning="{Binding Pump4Running}" Frequency="35" Text="P4"/>
-                                            <TextBlock Text="排泥泵" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Pump4Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                         <StackPanel>
                                             <controls:PumpControl Width="60" Height="68"
                                                                   IsRunning="{Binding Pump5Running}" Frequency="55" Text="P5"/>
-                                            <TextBlock Text="加药泵" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Pump5Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                     </StackPanel>
@@ -178,13 +178,13 @@
                                         <StackPanel>
                                             <controls:FanControl Width="44" Height="44"
                                                                   IsRunning="{Binding Fan1Running}" Speed="1" Text="F1"/>
-                                            <TextBlock Text="风机1" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Fan1Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                         <StackPanel>
                                             <controls:FanControl Width="44" Height="44"
                                                                   IsRunning="{Binding Fan2Running}" Speed="1.5" Text="F2"/>
-                                            <TextBlock Text="风机2" FontFamily="Consolas, monospace" FontSize="10"
+                                            <TextBlock Text="{Binding Fan2Text}" FontFamily="Consolas, monospace" FontSize="10"
                                                        Foreground="{DynamicResource TextTertiaryBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
                                         </StackPanel>
                                     </StackPanel>
@@ -196,10 +196,10 @@
                                     <Border Grid.Row="0" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
                                             CornerRadius="2" Padding="8" Margin="0,0,0,6">
                                         <StackPanel HorizontalAlignment="Center" Spacing="4">
-                                            <TextBlock Text="MODE" FontFamily="Consolas, monospace"
+                                            <TextBlock Text="{Binding ModeText}" FontFamily="Consolas, monospace"
                                                        FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                             <controls:ValveControl Width="36" Height="36"
-                                                                   Status="{Binding ModeStatus}" Text="AUTO"
+                                                                   Status="{Binding ModeStatus}" Text="{Binding ModeText}"
                                                                    ValveColor="{DynamicResource SuccessBrush}" BackgroundColor="{DynamicResource BorderBrush}"/>
                                         </StackPanel>
                                     </Border>
@@ -208,10 +208,10 @@
                                     <Border Grid.Row="1" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
                                             CornerRadius="2" Padding="8" Margin="0,0,0,6">
                                         <StackPanel Spacing="6">
-                                            <TextBlock Text="REALTIME" FontFamily="Consolas, monospace"
+                                            <TextBlock Text="{Binding RealtimeText}" FontFamily="Consolas, monospace"
                                                        FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                             <StackPanel Spacing="1">
-                                                <TextBlock Text="INFLOW" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Text="{Binding InflowText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock FontFamily="Consolas, monospace" FontSize="15" FontWeight="Bold" Foreground="{DynamicResource SuccessBrush}">
                                                     <Run Text="{Binding InflowRate, StringFormat='{}{0:F1}'}"/>
                                                     <Run Text=" m³/h" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
@@ -219,7 +219,7 @@
                                             </StackPanel>
                                             <Border Background="{DynamicResource BorderBrush}" Height="1"/>
                                             <StackPanel Spacing="1">
-                                                <TextBlock Text="OUTFLOW" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Text="{Binding OutflowText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock FontFamily="Consolas, monospace" FontSize="15" FontWeight="Bold" Foreground="{DynamicResource TankOutletBrush}">
                                                     <Run Text="{Binding OutflowRate, StringFormat='{}{0:F1}'}"/>
                                                     <Run Text=" m³/h" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
@@ -227,7 +227,7 @@
                                             </StackPanel>
                                             <Border Background="{DynamicResource BorderBrush}" Height="1"/>
                                             <StackPanel Spacing="1">
-                                                <TextBlock Text="DELTA" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Text="{Binding DeltaText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock FontFamily="Consolas, monospace" FontSize="13" Foreground="{DynamicResource WarningBrush}">
                                                     <Run Text="{Binding FlowDelta, StringFormat='{}{0:F1}'}"/>
                                                     <Run Text=" m³/h" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
@@ -240,22 +240,22 @@
                                     <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1"
                                             CornerRadius="2" Padding="8">
                                         <StackPanel Spacing="5">
-                                            <TextBlock Text="STATISTICS" FontFamily="Consolas, monospace"
+                                            <TextBlock Text="{Binding StatisticsText}" FontFamily="Consolas, monospace"
                                                        FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                             <Grid ColumnDefinitions="*,Auto">
-                                                <TextBlock Grid.Column="0" Text="RUNTIME" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Grid.Column="0" Text="{Binding RuntimeText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock Grid.Column="1" Text="{Binding RunningTime}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextSecondaryBrush}"/>
                                             </Grid>
                                             <Grid ColumnDefinitions="*,Auto">
-                                                <TextBlock Grid.Column="0" Text="DEVICES" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Grid.Column="0" Text="{Binding DevicesText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock Grid.Column="1" Text="{Binding RunningDeviceCount, StringFormat='{}{0} ON'}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource SuccessBrush}"/>
                                             </Grid>
                                             <Grid ColumnDefinitions="*,Auto">
-                                                <TextBlock Grid.Column="0" Text="ALARM" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                                <TextBlock Grid.Column="0" Text="{Binding AlarmText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                                 <TextBlock Grid.Column="1" Text="{Binding AlarmCount, StringFormat='{}{0}'}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource DangerBrush}"/>
                                             </Grid>
                                             <Border Background="{DynamicResource BorderBrush}" Height="1"/>
-                                            <TextBlock Text="EFFICIENCY" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
+                                            <TextBlock Text="{Binding EfficiencyText}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextDisabledBrush}"/>
                                             <TextBlock FontFamily="Consolas, monospace" FontSize="16" FontWeight="Bold" Foreground="{DynamicResource SuccessBrush}">
                                                 <Run Text="{Binding Efficiency, StringFormat='{}{0:F0}'}"/>
                                                 <Run Text="%" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
@@ -301,19 +301,19 @@
                                 <Border Background="{DynamicResource BorderBrush}" Width="1" Height="16"/>
                                 <StackPanel Orientation="Horizontal" Spacing="4">
                                     <Border Width="8" Height="8" CornerRadius="4" Background="{Binding Valve1StatusColor}"/>
-                                    <TextBlock Text="V1" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                    <TextBlock Text="{Binding Valve1Text}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 </StackPanel>
                                 <StackPanel Orientation="Horizontal" Spacing="4">
                                     <Border Width="8" Height="8" CornerRadius="4" Background="{Binding Valve2StatusColor}"/>
-                                    <TextBlock Text="V2" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                    <TextBlock Text="{Binding Valve2Text}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 </StackPanel>
                                 <StackPanel Orientation="Horizontal" Spacing="4">
                                     <Border Width="8" Height="8" CornerRadius="4" Background="{Binding Valve3StatusColor}"/>
-                                    <TextBlock Text="V3" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                    <TextBlock Text="{Binding Valve3Text}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 </StackPanel>
                                 <StackPanel Orientation="Horizontal" Spacing="4">
                                     <Border Width="8" Height="8" CornerRadius="4" Background="{Binding Valve4StatusColor}"/>
-                                    <TextBlock Text="V4" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                    <TextBlock Text="{Binding Valve4Text}" FontFamily="Consolas, monospace" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 </StackPanel>
                             </StackPanel>
                         </Border>
@@ -328,7 +328,7 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
                                 <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="FLOW METERS" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
+                                <TextBlock Text="{Binding FlowMetersText}" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="*,*">
                                 <controls:GaugeControl Grid.Column="0" Width="110" Height="130"
@@ -346,7 +346,7 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
                                 <Border Background="{DynamicResource WarningBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="DEVICE STATUS" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
+                                <TextBlock Text="{Binding DeviceStatusText}" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <StackPanel Spacing="3">
                                 <controls:StatusCard Title="进水泵1" Status="{Binding Pump1Status}" Icon="P1" IsActive="{Binding Pump1Running}"/>
@@ -363,7 +363,7 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
                                 <Border Background="{DynamicResource DangerBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="ALARM" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource DangerBrush}"/>
+                                <TextBlock Text="{Binding AlarmText}" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource DangerBrush}"/>
                                 <TextBlock Text="{Binding AlarmCount, StringFormat='({0})'}" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource DangerBrush}"/>
                             </StackPanel>
                             <Border Background="{DynamicResource AlarmBgBrush}" BorderBrush="{DynamicResource DangerBrush}" BorderThickness="1" Padding="8">
@@ -378,19 +378,19 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
                                 <Border Background="{DynamicResource InfoBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="QUICK OPS" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
+                                <TextBlock Text="{Binding QuickOpsText}" FontFamily="Consolas, monospace" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <WrapPanel HorizontalAlignment="Center">
-                                <Button Content="START ALL" Margin="3" Padding="10,5"
+                                <Button Content="{Binding StartAllText}" Margin="3" Padding="10,5"
                                         FontFamily="Consolas, monospace" FontSize="10"
                                         Background="{DynamicResource BorderBrush}" Foreground="{DynamicResource SuccessBrush}" BorderBrush="{DynamicResource SuccessBrush}"/>
-                                <Button Content="STOP ALL" Margin="3" Padding="10,5"
+                                <Button Content="{Binding StopAllText}" Margin="3" Padding="10,5"
                                         FontFamily="Consolas, monospace" FontSize="10"
                                         Background="{DynamicResource BorderBrush}" Foreground="{DynamicResource DangerBrush}" BorderBrush="{DynamicResource DangerBrush}"/>
-                                <Button Content="ACK ALARM" Margin="3" Padding="10,5"
+                                <Button Content="{Binding AckAlarmText}" Margin="3" Padding="10,5"
                                         FontFamily="Consolas, monospace" FontSize="10"
                                         Background="{DynamicResource BorderBrush}" Foreground="{DynamicResource WarningBrush}" BorderBrush="{DynamicResource WarningBrush}"/>
-                                <Button Content="EXPORT" Margin="3" Padding="10,5"
+                                <Button Content="{Binding ExportText}" Margin="3" Padding="10,5"
                                         FontFamily="Consolas, monospace" FontSize="10"
                                         Background="{DynamicResource BorderBrush}" Foreground="{DynamicResource InfoBrush}" BorderBrush="{DynamicResource InfoBrush}"/>
                             </WrapPanel>

+ 17 - 17
src/YZWater.Avalonia/Views/ViewBView.axaml

@@ -15,9 +15,9 @@
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource InfoBrush}" Width="3" Height="20" CornerRadius="1"/>
-                        <TextBlock Text="PARAMETERS" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock Text="系统参数配置" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                        <TextBlock Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -32,23 +32,23 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,12">
                                 <Border Background="{DynamicResource InfoBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="PLC CONNECTION" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
+                                <TextBlock Text="{Binding PlcConnectionText}" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="100,*" RowDefinitions="Auto,Auto,Auto,Auto" Margin="4,0">
-                                <TextBlock Grid.Row="0" Grid.Column="0" Text="IP ADDRESS" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding IpAddressText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding PlcIp}" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="1" Grid.Column="0" Text="PORT" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding PortText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding PlcPort}" Minimum="1" Maximum="65535" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="2" Grid.Column="0" Text="AUTO CONN" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding AutoConnectText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <CheckBox Grid.Row="2" Grid.Column="1" IsChecked="{Binding AutoConnect}" Margin="0,4"/>
 
-                                <TextBlock Grid.Row="3" Grid.Column="0" Text="STATUS" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding StatusText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <StackPanel Grid.Row="3" Grid.Column="1" Orientation="Horizontal" Spacing="10" Margin="0,4">
                                     <TextBlock Text="{Binding ConnectionStatus}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}" VerticalAlignment="Center"/>
-                                    <Button Content="TEST" Command="{Binding TestConnectionCommand}" Classes="btn-info"
+                                    <Button Content="{Binding TestText}" Command="{Binding TestConnectionCommand}" Classes="btn-info"
                                             IsEnabled="{Binding !IsConnecting}"/>
                                 </StackPanel>
                             </Grid>
@@ -61,19 +61,19 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,12">
                                 <Border Background="{DynamicResource WarningBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="ALARM THRESHOLDS" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
+                                <TextBlock Text="{Binding AlarmThresholdsText}" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="120,*,60" RowDefinitions="Auto,Auto,Auto" Margin="4,0">
-                                <TextBlock Grid.Row="0" Grid.Column="0" Text="LEVEL HIGH" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding LevelHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="0" Grid.Column="1" Value="{Binding LevelHighAlarm}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
                                 <TextBlock Grid.Row="0" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
 
-                                <TextBlock Grid.Row="1" Grid.Column="0" Text="LEVEL LOW" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding LevelLowText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding LevelLowAlarm}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
                                 <TextBlock Grid.Row="1" Grid.Column="2" Text="%" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
 
-                                <TextBlock Grid.Row="2" Grid.Column="0" Text="FLOW HIGH" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding FlowHighText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Row="2" Grid.Column="1" Value="{Binding FlowHighAlarm}" Minimum="0" Maximum="1000" FormatString="F1" Margin="0,4"/>
                                 <TextBlock Grid.Row="2" Grid.Column="2" Text="m³/h" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             </Grid>
@@ -86,11 +86,11 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,12">
                                 <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="PUMP SETTINGS" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
+                                <TextBlock Text="{Binding PumpSettingsText}" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="120,*,60" Margin="4,0">
-                                <TextBlock Grid.Column="0" Text="FREQUENCY" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                                <TextBlock Grid.Column="0" Text="{Binding FrequencyText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                                 <NumericUpDown Grid.Column="1" Value="{Binding PumpFrequency}" Minimum="0" Maximum="100" FormatString="F1" Margin="0,4"/>
                                 <TextBlock Grid.Column="2" Text="Hz" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             </Grid>
@@ -104,8 +104,8 @@
                             <TextBlock Text="ACTIONS" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                        Foreground="{DynamicResource TextSecondaryBrush}" HorizontalAlignment="Center"/>
                             <StackPanel Orientation="Horizontal" Spacing="12" HorizontalAlignment="Center">
-                                <Button Content="SAVE CONFIG" Command="{Binding SaveConfigCommand}" Classes="btn-success"/>
-                                <Button Content="RESET DEFAULT" Command="{Binding ResetToDefaultCommand}" Classes="btn-warning"/>
+                                <Button Content="{Binding SaveConfigText}" Command="{Binding SaveConfigCommand}" Classes="btn-success"/>
+                                <Button Content="{Binding ResetDefaultText}" Command="{Binding ResetToDefaultCommand}" Classes="btn-warning"/>
                             </StackPanel>
                         </StackPanel>
                     </Border>
@@ -114,7 +114,7 @@
 
             <!-- 底部状态栏 -->
             <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
-                <TextBlock Text="CONFIG v1.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
+                <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>
         </Grid>

+ 10 - 10
src/YZWater.Avalonia/Views/ViewCView.axaml

@@ -16,9 +16,9 @@
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="20" CornerRadius="1"/>
-                        <TextBlock Text="FLOW RECORDS" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock Text="流量历史数据" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                        <TextBlock Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -31,16 +31,16 @@
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12" Margin="0,0,0,4">
                     <StackPanel Orientation="Horizontal" Spacing="16">
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="FROM" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="TO" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding EndDate}" Width="150"/>
                         </StackPanel>
-                        <Button Content="QUERY" Command="{Binding LoadFlowRecordsCommand}" Classes="btn-info"/>
-                        <Button Content="EXPORT CSV" Command="{Binding ExportDataCommand}" Classes="btn-success"/>
-                        <Button Content="PURGE OLD" Command="{Binding ClearOldDataCommand}" Classes="btn-danger"/>
+                        <Button Content="{Binding QueryText}" Command="{Binding LoadFlowRecordsCommand}" Classes="btn-info"/>
+                        <Button Content="{Binding ExportCsvText}" Command="{Binding ExportDataCommand}" Classes="btn-success"/>
+                        <Button Content="{Binding PurgeOldText}" Command="{Binding ClearOldDataCommand}" Classes="btn-danger"/>
                     </StackPanel>
                 </Border>
 
@@ -51,13 +51,13 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,0,0,8">
                                 <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="INFLOW TREND" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
+                                <TextBlock Text="{Binding InflowTrendText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <lvc:CartesianChart Series="{Binding InflowSeries}" XAxes="{Binding XAxes}" YAxes="{Binding YAxes}" Height="200"/>
 
                             <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,16,0,8">
                                 <Border Background="{DynamicResource InfoBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="OUTFLOW TREND" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
+                                <TextBlock Text="{Binding OutflowTrendText}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <lvc:CartesianChart Series="{Binding OutflowSeries}" XAxes="{Binding XAxes}" YAxes="{Binding YAxes}" Height="200"/>
                         </StackPanel>
@@ -81,7 +81,7 @@
 
             <!-- 底部 -->
             <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
-                <TextBlock Text="FLOW DATA v1.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
+                <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>
         </Grid>

+ 13 - 13
src/YZWater.Avalonia/Views/ViewDView.axaml

@@ -15,9 +15,9 @@
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource DangerBrush}" Width="3" Height="20" CornerRadius="1"/>
-                        <TextBlock Text="ALARM LOG" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock Text="报警历史记录" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                        <TextBlock Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                         <Border Background="{DynamicResource DangerBrush}" CornerRadius="10" Padding="8,2" Margin="8,0,0,0">
                             <TextBlock Text="{Binding UnconfirmedCount, StringFormat='{}{0}'}" FontFamily="{DynamicResource MonoFont}" FontSize="11"
                                        Foreground="White"/>
@@ -34,17 +34,17 @@
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12" Margin="0,0,0,4">
                     <StackPanel Orientation="Horizontal" Spacing="16">
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="FROM" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding FromText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding StartDate}" Width="150"/>
                         </StackPanel>
                         <StackPanel Orientation="Horizontal" Spacing="6">
-                            <TextBlock Text="TO" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                            <TextBlock Text="{Binding ToText}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                             <DatePicker SelectedDate="{Binding EndDate}" Width="150"/>
                         </StackPanel>
-                        <Button Content="QUERY" Command="{Binding LoadAlarmRecordsCommand}" Classes="btn-info"/>
-                        <Button Content="EXPORT" Command="{Binding ExportAlarmsCommand}" Classes="btn-success"/>
-                        <Button Content="ACK ALL" Command="{Binding ConfirmAllAlarmsCommand}" Classes="btn-warning"/>
-                        <Button Content="PURGE" Command="{Binding ClearHistoryCommand}" Classes="btn-danger"/>
+                        <Button Content="{Binding QueryText}" Command="{Binding LoadAlarmRecordsCommand}" Classes="btn-info"/>
+                        <Button Content="{Binding ExportText}" Command="{Binding ExportAlarmsCommand}" Classes="btn-success"/>
+                        <Button Content="{Binding AckAllText}" Command="{Binding ConfirmAllAlarmsCommand}" Classes="btn-warning"/>
+                        <Button Content="{Binding PurgeText}" Command="{Binding ClearHistoryCommand}" Classes="btn-danger"/>
                     </StackPanel>
                 </Border>
 
@@ -71,19 +71,19 @@
                         BorderBrush="{DynamicResource BorderBrush}" BorderThickness="1" Padding="12"
                         IsVisible="{Binding SelectedRecord, Converter={x:Static ObjectConverters.IsNotNull}}">
                     <Grid ColumnDefinitions="80,*" RowDefinitions="Auto,Auto,Auto,Auto">
-                        <TextBlock Grid.Row="0" Grid.Column="0" Text="TIME" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding TimeLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                         <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding DetailTime}"
                                    FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextPrimaryBrush}"/>
 
-                        <TextBlock Grid.Row="1" Grid.Column="0" Text="TYPE" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                        <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding TypeLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                         <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding DetailType}"
                                    FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource WarningBrush}"/>
 
-                        <TextBlock Grid.Row="2" Grid.Column="0" Text="MESSAGE" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                        <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding MessageLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                         <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding DetailMessage}"
                                    FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource DangerBrush}"/>
 
-                        <TextBlock Grid.Row="3" Grid.Column="0" Text="LEVEL" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                        <TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding LevelLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="10" Foreground="{DynamicResource TextTertiaryBrush}"/>
                         <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding DetailLevel}"
                                    FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextPrimaryBrush}"/>
                     </Grid>
@@ -92,7 +92,7 @@
 
             <!-- 底部 -->
             <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
-                <TextBlock Text="ALARM SYSTEM v1.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
+                <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>
         </Grid>

+ 10 - 10
src/YZWater.Avalonia/Views/ViewEView.axaml

@@ -15,9 +15,9 @@
                 <Grid Margin="16,0">
                     <StackPanel Orientation="Horizontal" Spacing="12" VerticalAlignment="Center">
                         <Border Background="{DynamicResource TextSecondaryBrush}" Width="3" Height="20" CornerRadius="1"/>
-                        <TextBlock Text="ABOUT" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
+                        <TextBlock Text="{Binding TitleText}" FontFamily="{DynamicResource MonoFont}" FontSize="16" FontWeight="Bold"
                                    Foreground="{DynamicResource TextPrimaryBrush}" VerticalAlignment="Center"/>
-                        <TextBlock Text="系统信息" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
+                        <TextBlock Text="{Binding SubtitleText}" FontSize="12" Foreground="{DynamicResource TextTertiaryBrush}" VerticalAlignment="Center"/>
                     </StackPanel>
                 </Grid>
             </Border>
@@ -48,7 +48,7 @@
                         <StackPanel Spacing="8">
                             <StackPanel Orientation="Horizontal" Spacing="6">
                                 <Border Background="{DynamicResource InfoBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="SYSTEM INFO" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
+                                <TextBlock Text="{Binding SystemInfoText}" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <TextBlock Text="{Binding Description}" TextWrapping="Wrap"
@@ -67,17 +67,17 @@
                         <StackPanel Spacing="8">
                             <StackPanel Orientation="Horizontal" Spacing="6">
                                 <Border Background="{DynamicResource SuccessBrush}" Width="3" Height="14" CornerRadius="1"/>
-                                <TextBlock Text="COMPANY" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
+                                <TextBlock Text="{Binding CompanyText}" FontFamily="{DynamicResource MonoFont}" FontSize="12" FontWeight="Bold"
                                            Foreground="{DynamicResource TextSecondaryBrush}"/>
                             </StackPanel>
                             <Grid ColumnDefinitions="100,*" RowDefinitions="Auto,Auto,Auto">
-                                <TextBlock Grid.Row="0" Grid.Column="0" Text="NAME" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding CompanyNameLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding CompanyName}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextPrimaryBrush}"/>
 
-                                <TextBlock Grid.Row="1" Grid.Column="0" Text="CONTACT" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding ContactLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding ContactPerson}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextPrimaryBrush}"/>
 
-                                <TextBlock Grid.Row="2" Grid.Column="0" Text="PHONE" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
+                                <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding PhoneLabel}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextTertiaryBrush}"/>
                                 <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding ContactPhone}" FontFamily="{DynamicResource MonoFont}" FontSize="11" Foreground="{DynamicResource TextPrimaryBrush}"/>
                             </Grid>
                         </StackPanel>
@@ -85,8 +85,8 @@
 
                     <!-- 操作 -->
                     <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="12">
-                        <Button Content="VISIT WEBSITE" Command="{Binding OpenWebsiteCommand}" Classes="btn-info"/>
-                        <Button Content="CHECK UPDATE" Command="{Binding CheckUpdateCommand}" Classes="btn-success"/>
+                        <Button Content="{Binding VisitWebsiteText}" Command="{Binding OpenWebsiteCommand}" Classes="btn-info"/>
+                        <Button Content="{Binding CheckUpdateText}" Command="{Binding CheckUpdateCommand}" Classes="btn-success"/>
                     </StackPanel>
 
                     <!-- 版权 -->
@@ -97,7 +97,7 @@
 
             <!-- 底部 -->
             <Border Grid.Row="2" Background="{DynamicResource SurfaceBgBrush}" BorderBrush="{DynamicResource BorderBrush}" BorderThickness="0,1,0,0">
-                <TextBlock Text="ABOUT v1.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
+                <TextBlock Text="v3.0" FontFamily="{DynamicResource MonoFont}" FontSize="10"
                            Foreground="{DynamicResource TextDisabledBrush}" VerticalAlignment="Center" Margin="16,0"/>
             </Border>
         </Grid>

+ 87 - 0
src/YZWater.Core/ViewModels/ViewAViewModel.cs

@@ -86,11 +86,98 @@ public partial class ViewAViewModel : ObservableObject
     // ─── 时间 ───
     [ObservableProperty] private DateTime _currentTime = DateTime.Now;
 
+    // ─── 翻译文字 ───
+    private readonly LanguageService _lang = LanguageService.Instance;
+    [ObservableProperty] private string _titleText;
+    [ObservableProperty] private string _subtitleText;
+    [ObservableProperty] private string _plcStatusText;
+    [ObservableProperty] private string _connectText;
+    [ObservableProperty] private string _disconnectText;
+    [ObservableProperty] private string _refreshText;
+    [ObservableProperty] private string _tank1Text;
+    [ObservableProperty] private string _tank2Text;
+    [ObservableProperty] private string _tank3Text;
+    [ObservableProperty] private string _tank4Text;
+    [ObservableProperty] private string _pump1Text;
+    [ObservableProperty] private string _pump2Text;
+    [ObservableProperty] private string _pump3Text;
+    [ObservableProperty] private string _pump4Text;
+    [ObservableProperty] private string _pump5Text;
+    [ObservableProperty] private string _fan1Text;
+    [ObservableProperty] private string _fan2Text;
+    [ObservableProperty] private string _valve1Text;
+    [ObservableProperty] private string _valve2Text;
+    [ObservableProperty] private string _valve3Text;
+    [ObservableProperty] private string _valve4Text;
+    [ObservableProperty] private string _modeText;
+    [ObservableProperty] private string _realtimeText;
+    [ObservableProperty] private string _inflowText;
+    [ObservableProperty] private string _outflowText;
+    [ObservableProperty] private string _deltaText;
+    [ObservableProperty] private string _statisticsText;
+    [ObservableProperty] private string _runtimeText;
+    [ObservableProperty] private string _devicesText;
+    [ObservableProperty] private string _alarmText;
+    [ObservableProperty] private string _efficiencyText;
+    [ObservableProperty] private string _quickOpsText;
+    [ObservableProperty] private string _startAllText;
+    [ObservableProperty] private string _stopAllText;
+    [ObservableProperty] private string _ackAlarmText;
+    [ObservableProperty] private string _exportText;
+    [ObservableProperty] private string _flowMetersText;
+    [ObservableProperty] private string _deviceStatusText;
+    [ObservableProperty] private string _processFlowText;
+
     public ViewAViewModel()
     {
+        UpdateTexts();
+        _lang.LanguageChanged += UpdateTexts;
         StartTimers();
     }
 
+    private void UpdateTexts()
+    {
+        TitleText = _lang.Get("AppName");
+        SubtitleText = _lang.Get("ProcessFlow");
+        PlcStatusText = _lang.Get("PlcConnected");
+        ConnectText = _lang.Get("Connect");
+        DisconnectText = _lang.Get("Disconnect");
+        RefreshText = _lang.Get("Refresh");
+        Tank1Text = _lang.Get("TankInlet");
+        Tank2Text = _lang.Get("TankBio");
+        Tank3Text = _lang.Get("TankSediment");
+        Tank4Text = _lang.Get("TankOutlet");
+        Pump1Text = _lang.Get("Pump1");
+        Pump2Text = _lang.Get("Pump2");
+        Pump3Text = _lang.Get("Pump3");
+        Pump4Text = _lang.Get("Pump4");
+        Pump5Text = _lang.Get("Pump5");
+        Fan1Text = _lang.Get("Fan1");
+        Fan2Text = _lang.Get("Fan2");
+        Valve1Text = _lang.Get("ValveInlet");
+        Valve2Text = _lang.Get("ValveAeration");
+        Valve3Text = _lang.Get("ValveReflux");
+        Valve4Text = _lang.Get("ValveOutlet");
+        ModeText = _lang.Get("Mode");
+        RealtimeText = _lang.Get("Realtime");
+        InflowText = _lang.Get("Inflow");
+        OutflowText = _lang.Get("Outflow");
+        DeltaText = _lang.Get("Delta");
+        StatisticsText = _lang.Get("Statistics");
+        RuntimeText = _lang.Get("Runtime");
+        DevicesText = _lang.Get("Devices");
+        AlarmText = _lang.Get("Alarm");
+        EfficiencyText = _lang.Get("Efficiency");
+        QuickOpsText = _lang.Get("QuickOps");
+        StartAllText = _lang.Get("StartAll");
+        StopAllText = _lang.Get("StopAll");
+        AckAlarmText = _lang.Get("AckAlarm");
+        ExportText = _lang.Get("Export");
+        FlowMetersText = _lang.Get("FlowMeters");
+        DeviceStatusText = _lang.Get("DeviceStatus");
+        ProcessFlowText = _lang.Get("ProcessFlow");
+    }
+
     private void StartTimers()
     {
         var timeTimer = new System.Timers.Timer(1000);

+ 47 - 0
src/YZWater.Core/ViewModels/ViewBViewModel.cs

@@ -38,11 +38,58 @@ public partial class ViewBViewModel : ObservableObject
     [ObservableProperty]
     private bool _isConnecting;
 
+    // ─── 翻译文字 ───
+    private readonly LanguageService _lang = LanguageService.Instance;
+    [ObservableProperty] private string _titleText;
+    [ObservableProperty] private string _subtitleText;
+    [ObservableProperty] private string _plcConnectionText;
+    [ObservableProperty] private string _ipAddressText;
+    [ObservableProperty] private string _portText;
+    [ObservableProperty] private string _autoConnectText;
+    [ObservableProperty] private string _statusText;
+    [ObservableProperty] private string _testText;
+    [ObservableProperty] private string _alarmThresholdsText;
+    [ObservableProperty] private string _levelHighText;
+    [ObservableProperty] private string _levelLowText;
+    [ObservableProperty] private string _flowHighText;
+    [ObservableProperty] private string _pumpSettingsText;
+    [ObservableProperty] private string _frequencyText;
+    [ObservableProperty] private string _saveConfigText;
+    [ObservableProperty] private string _resetDefaultText;
+    [ObservableProperty] private string _connectedText;
+    [ObservableProperty] private string _disconnectedText;
+    [ObservableProperty] private string _connectingText;
+
     public ViewBViewModel()
     {
+        UpdateTexts();
+        _lang.LanguageChanged += UpdateTexts;
         LoadConfig();
     }
 
+    private void UpdateTexts()
+    {
+        TitleText = _lang.Get("Parameters");
+        SubtitleText = _lang.Get("SysConfig");
+        PlcConnectionText = _lang.Get("PlcConnection");
+        IpAddressText = _lang.Get("IpAddress");
+        PortText = _lang.Get("Port");
+        AutoConnectText = _lang.Get("AutoConnect");
+        StatusText = _lang.Get("Status");
+        TestText = _lang.Get("Test");
+        AlarmThresholdsText = _lang.Get("AlarmThresholds");
+        LevelHighText = _lang.Get("LevelHigh");
+        LevelLowText = _lang.Get("LevelLow");
+        FlowHighText = _lang.Get("FlowHigh");
+        PumpSettingsText = _lang.Get("PumpSettings");
+        FrequencyText = _lang.Get("Frequency");
+        SaveConfigText = _lang.Get("SaveConfig");
+        ResetDefaultText = _lang.Get("ResetDefault");
+        ConnectedText = _lang.Get("Connected");
+        DisconnectedText = _lang.Get("Disconnected");
+        ConnectingText = _lang.Get("Connecting");
+    }
+
     /// <summary>
     /// 加载配置
     /// </summary>

+ 27 - 0
src/YZWater.Core/ViewModels/ViewCViewModel.cs

@@ -37,12 +37,39 @@ public partial class ViewCViewModel : ObservableObject
     [ObservableProperty]
     private List<FlowRecord> _flowRecords = new();
 
+    // ─── 翻译文字 ───
+    private readonly LanguageService _lang = LanguageService.Instance;
+    [ObservableProperty] private string _titleText;
+    [ObservableProperty] private string _subtitleText;
+    [ObservableProperty] private string _fromText;
+    [ObservableProperty] private string _toText;
+    [ObservableProperty] private string _queryText;
+    [ObservableProperty] private string _exportCsvText;
+    [ObservableProperty] private string _purgeOldText;
+    [ObservableProperty] private string _inflowTrendText;
+    [ObservableProperty] private string _outflowTrendText;
+
     public ViewCViewModel()
     {
+        UpdateTexts();
+        _lang.LanguageChanged += UpdateTexts;
         InitializeChart();
         _ = LoadFlowRecordsAsync();
     }
 
+    private void UpdateTexts()
+    {
+        TitleText = _lang.Get("FlowRecords");
+        SubtitleText = _lang.Get("FlowHistory");
+        FromText = _lang.Get("From");
+        ToText = _lang.Get("To");
+        QueryText = _lang.Get("Query");
+        ExportCsvText = _lang.Get("ExportCsv");
+        PurgeOldText = _lang.Get("PurgeOld");
+        InflowTrendText = _lang.Get("InflowTrend");
+        OutflowTrendText = _lang.Get("OutflowTrend");
+    }
+
     /// <summary>
     /// 初始化图表
     /// </summary>

+ 38 - 1
src/YZWater.Core/ViewModels/ViewDViewModel.cs

@@ -35,19 +35,56 @@ public partial class ViewDViewModel : ObservableObject
     [ObservableProperty] private string _detailMessage = "--";
     [ObservableProperty] private string _detailLevel = "--";
 
+    // ─── 翻译文字 ───
+    private readonly LanguageService _lang = LanguageService.Instance;
+    [ObservableProperty] private string _titleText;
+    [ObservableProperty] private string _subtitleText;
+    [ObservableProperty] private string _fromText;
+    [ObservableProperty] private string _toText;
+    [ObservableProperty] private string _queryText;
+    [ObservableProperty] private string _exportText;
+    [ObservableProperty] private string _ackAllText;
+    [ObservableProperty] private string _purgeText;
+    [ObservableProperty] private string _unconfirmedText;
+    [ObservableProperty] private string _alarmDetailText;
+    [ObservableProperty] private string _timeLabel;
+    [ObservableProperty] private string _typeLabel;
+    [ObservableProperty] private string _messageLabel;
+    [ObservableProperty] private string _levelLabel;
+
     partial void OnSelectedRecordChanged(AlarmRecord? value)
     {
         DetailTime = value?.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss") ?? "--";
         DetailType = value?.AlarmType ?? "--";
         DetailMessage = value?.AlarmMessage ?? "--";
-        DetailLevel = value != null ? $"Level {value.AlarmLevel}" : "--";
+        DetailLevel = value != null ? $"{_lang.Get("Level2")} {value.AlarmLevel}" : "--";
     }
 
     public ViewDViewModel()
     {
+        UpdateTexts();
+        _lang.LanguageChanged += UpdateTexts;
         _ = LoadAlarmRecordsAsync();
     }
 
+    private void UpdateTexts()
+    {
+        TitleText = _lang.Get("AlarmLog");
+        SubtitleText = _lang.Get("AlarmHistory");
+        FromText = _lang.Get("From");
+        ToText = _lang.Get("To");
+        QueryText = _lang.Get("Query");
+        ExportText = _lang.Get("Export");
+        AckAllText = _lang.Get("AckAll");
+        PurgeText = _lang.Get("Purge");
+        UnconfirmedText = _lang.Get("Unconfirmed");
+        AlarmDetailText = _lang.Get("AlarmDetail");
+        TimeLabel = _lang.Get("Time");
+        TypeLabel = _lang.Get("Type");
+        MessageLabel = _lang.Get("Message");
+        LevelLabel = _lang.Get("Level2");
+    }
+
     /// <summary>
     /// 加载报警记录
     /// </summary>

+ 35 - 20
src/YZWater.Core/ViewModels/ViewEViewModel.cs

@@ -33,14 +33,44 @@ public partial class ViewEViewModel : ObservableObject
     [ObservableProperty]
     private string _techStack = "Avalonia UI 11 | .NET 8 | FreeSql | HslCommunication";
 
+    // ─── 翻译文字 ───
+    private readonly LanguageService _lang = LanguageService.Instance;
+    [ObservableProperty] private string _titleText;
+    [ObservableProperty] private string _subtitleText;
+    [ObservableProperty] private string _systemInfoText;
+    [ObservableProperty] private string _companyText;
+    [ObservableProperty] private string _companyNameLabel;
+    [ObservableProperty] private string _contactLabel;
+    [ObservableProperty] private string _phoneLabel;
+    [ObservableProperty] private string _visitWebsiteText;
+    [ObservableProperty] private string _checkUpdateText;
+
     public ViewEViewModel()
     {
+        UpdateTexts();
+        _lang.LanguageChanged += () =>
+        {
+            UpdateTexts();
+            LoadCompanyInfo();
+        };
         LoadCompanyInfo();
     }
 
-    /// <summary>
-    /// 加载公司信息
-    /// </summary>
+    private void UpdateTexts()
+    {
+        TitleText = _lang.Get("About");
+        SubtitleText = _lang.Get("SystemInfo");
+        SystemInfoText = _lang.Get("SystemInfo");
+        CompanyText = _lang.Get("Company");
+        CompanyNameLabel = _lang.Get("CompanyName");
+        ContactLabel = _lang.Get("Contact");
+        PhoneLabel = _lang.Get("Phone");
+        VisitWebsiteText = _lang.Get("VisitWebsite");
+        CheckUpdateText = _lang.Get("CheckUpdate");
+        Description = _lang.Get("Description");
+        Copyright = _lang.Get("Copyright");
+    }
+
     private void LoadCompanyInfo()
     {
         var config = ConfigService.GetConfig();
@@ -52,27 +82,12 @@ public partial class ViewEViewModel : ObservableObject
         }
     }
 
-    /// <summary>
-    /// 打开官网
-    /// </summary>
     [RelayCommand]
-    private void OpenWebsite()
-    {
-        // 实际实现中应该打开浏览器
-        // System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
-        // {
-        //     FileName = "https://www.example.com",
-        //     UseShellExecute = true
-        // });
-    }
+    private void OpenWebsite() { }
 
-    /// <summary>
-    /// 检查更新
-    /// </summary>
     [RelayCommand]
     private async Task CheckUpdateAsync()
     {
-        // 实际实现中应该检查服务器是否有新版本
-        await Task.Delay(1000); // 模拟网络请求
+        await Task.Delay(1000);
     }
 }