Files
better-genshin-impact/BetterGenshinImpact/View/Windows/CheckUpdateWindow.xaml
辉鸭蛋 9f67726781 I18n v2 (#2709)
* feat(i18n): 添加界面与日志的国际化支持

- 新增 ITranslationService 接口及 JsonTranslationService 实现,提供基于 JSON 的翻译服务
- 添加 TrConverter 转换器,支持通过绑定动态翻译界面文本
- 引入 AutoTranslateInterceptor 行为,自动扫描并翻译界面中的静态文本
- 集成 TranslatingSerilogLoggerProvider,实现日志输出的实时翻译
- 在 App.xaml 中注册全局样式,为 Window、UserControl 和 Page 启用自动翻译

* refactor(AutoTranslateInterceptor): 优化自动翻译拦截器的加载与应用机制

- 移除 HomePage 中冗余的 EnableAutoTranslate 属性设置,改为继承属性
- 通过类构造函数注册全局 Loaded 事件处理器,替代在每个元素上单独添加
- 引入请求队列机制,批量处理待应用翻译的元素,避免重复调度
- 扩展属性类型检查,支持 object 类型以处理更多动态内容场景

* fix: 移除全局自动翻译拦截器以避免冲突

移除在 App.xaml 中为 Window、UserControl 和 Page 全局设置的 AutoTranslateInterceptor,
改为仅在 PickerWindow 中显式启用。这解决了全局样式可能导致的意外行为或冲突。

* feat(ui): 为多个窗口启用自动翻译拦截器

为 MapLabelSearchWindow、ArtifactOcrDialog、PromptDialog 等 14 个窗口添加了 AutoTranslateInterceptor.EnableAutoTranslate 属性,以启用自动翻译拦截功能。

* feat(i18n): 添加国际化目录支持并优化异常处理

* feat(ui): 添加软件UI语言设置并改进翻译服务

- 在通用设置页面新增UI语言选择控件,支持动态切换界面语言
- 修改游戏语言标签为“原神游戏语言”以明确区分
- 改进JsonTranslationService,支持UI语言切换时的实时翻译更新
- 优化AutoTranslateInterceptor,缓存原始文本值并在语言切换时恢复
- 添加属性变更监听机制,确保UI元素在语言切换后正确刷新

* feat(自动翻译): 添加排除自动翻译的依赖属性

在 AutoTranslateInterceptor 中新增 ExcludeAutoTranslate 附加属性,允许对特定依赖对象禁用自动翻译功能。当遍历元素进行翻译时,会检查此属性并跳过已标记排除的元素。

* feat(translation): 为缺失文本翻译添加详细上下文信息

扩展翻译服务以收集缺失文本的详细上下文,包括视图路径、元素类型、属性名等。
重构 `ITranslationService` 接口,引入 `TranslationSourceInfo` 类封装上下文信息。
修改 `AutoTranslateInterceptor` 自动收集 UI 元素信息,`JsonTranslationService` 合并多来源上下文。

* Revert "feat(自动翻译): 添加排除自动翻译的依赖属性"

This reverts commit a1c2334951.

* fix: 跳过 GridViewRowPresenter 中的文本翻译

添加 IsInGridViewRowPresenter 检查,避免在 GridViewRowPresenter 控件内进行自动翻译,防止潜在的界面显示问题。

* fix: 修复自动翻译拦截器在组合框上下文中的误触发

在自动翻译拦截器中添加了 IsInComboBoxContext 方法,用于检测依赖对象是否处于 ComboBox 或其相关弹出菜单的上下文中。当检测到对象位于组合框上下文时,跳过自动翻译逻辑,避免对下拉选项等界面元素进行不必要的翻译操作,从而解决潜在的界面干扰问题。

* feat(translation): 添加缺失翻译上报至 Supabase 的功能

- 新增 IMissingTranslationReporter 接口及 SupabaseMissingTranslationReporter 实现
- 在 JsonTranslationService 中集成缺失翻译上报逻辑
- 添加缺失翻译收集的配置设置(MissingTranslationCollectionSettings)
- 优化缺失翻译文件的序列化格式,将 Source 字段改为紧凑的数字表示
- 移除 ScriptRepoUpdater 中未使用的 using 语句
- 在 App.xaml.cs 中注册 SupabaseMissingTranslationReporter 服务

* fix: 修复自动翻译功能中原始值恢复和重复报告问题

- 移除未使用的法语翻译支持以简化语言选项
- 修复 Supabase 报告序列化时移除冗余字段
- 添加已缺失翻译键的缓存以避免重复报告
- 重构自动翻译拦截器,将原始值存储移至依赖属性
- 修复原始值恢复逻辑,确保正确遍历所有子元素

* feat(ui): 添加更新UI语言文件功能

- 在 ITranslationService 接口中添加 Reload 方法
- 在 JsonTranslationService 中实现 Reload 方法,支持重新加载语言文件并发送变更通知
- 在通用设置页面添加“更新”按钮,点击后从远程仓库下载最新语言文件
- 实现 OnUpdateUiLanguageAsync 命令,支持从 GitHub 和镜像源下载语言文件
- 下载后自动替换本地文件并重新加载翻译服务
2026-02-15 19:03:33 +08:00

255 lines
14 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<ui:FluentWindow x:Class="BetterGenshinImpact.View.Windows.CheckUpdateWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BetterGenshinImpact.View.Windows"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:vio="http://schemas.lepo.co/wpfui/2022/xaml/violeta"
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
xmlns:webview="clr-namespace:BetterGenshinImpact.View.Controls.Webview"
xmlns:behavior="clr-namespace:BetterGenshinImpact.View.Behavior"
x:Name="app"
Title="发现新版本"
Width="680"
MinHeight="10"
SizeToContent="Height"
Background="#202020"
ExtendsContentIntoTitleBar="True"
behavior:AutoTranslateInterceptor.EnableAutoTranslate="True"
FontFamily="{DynamicResource TextThemeFontFamily}"
WindowBackdropType="Auto"
WindowStartupLocation="CenterOwner"
mc:Ignorable="d">
<Grid>
<ui:Grid Name="MyGrid" Margin="0,48,0,0" RowDefinitions="Auto,*,Auto,Auto">
<webview:WebpagePanel x:Name="WebpagePanel"
Grid.Row="1"
Height="400"
Margin="12,0,12,0" />
<ui:Grid Name="UpdateStatusMessageGrid"
Grid.Row="0"
Margin="16,0,16,0"
ColumnDefinitions="Auto,*"
Visibility="{Binding ShowUpdateStatus, Converter={StaticResource BooleanToVisibilityConverter}}">
<vio:Loading Grid.Column="0" />
<ui:StackPanel Grid.Column="1" Margin="16,0,0,0">
<TextBlock Text="{Binding UpdateStatusMessage}" />
</ui:StackPanel>
</ui:Grid>
<!-- 新增:多渠道更新方式卡片 -->
<StackPanel Name="ServerPanel" Grid.Row="2" Margin="12,0,12,0">
<ui:CardControl Name="GitSourceCard" Margin="0,0,0,4" Padding="12,12">
<ui:CardControl.Icon>
<ui:FontIcon Glyph="&#xe13b;" Style="{StaticResource FaFontIconStyle}" />
</ui:CardControl.Icon>
<ui:CardControl.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ui:TextBlock Grid.Row="0"
Grid.Column="0"
FontTypography="Body"
Text="开源渠道"
TextWrapping="Wrap" />
<ui:TextBlock Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
Text="{Binding GitSourceDescription}"
TextWrapping="Wrap" />
</Grid>
</ui:CardControl.Header>
<StackPanel Orientation="Horizontal">
<ComboBox x:Name="GitSourceComboBox"
SelectedValue="{Binding SelectedGitSource}"
SelectedValuePath="Content"
Margin="0,0,8,0"
MinWidth="80">
<ComboBoxItem Content="Github" />
<ComboBoxItem Content="CNB" />
</ComboBox>
<ui:Button
Icon="{ui:SymbolIcon ArrowDownload24}"
Content="立即更新"
Command="{Binding UpdateFromGitHostPlatformCommand}" />
</StackPanel>
</ui:CardControl>
<ui:CardControl Name="SteambirdCard" Margin="0,0,0,4" Padding="12,12">
<ui:CardControl.Icon>
<ui:FontIcon Glyph="&#xf4ba;" Style="{StaticResource FaFontIconStyle}" />
</ui:CardControl.Icon>
<ui:CardControl.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<emoji:TextBlock Grid.Row="0"
Grid.Column="0"
Text="Steambird 服务 🆓"
TextWrapping="Wrap" />
<ui:TextBlock Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
Text="【国内】普通用户可点此直接更新"
TextWrapping="Wrap" />
</Grid>
</ui:CardControl.Header>
<StackPanel Orientation="Horizontal">
<ui:Button
Appearance="Success"
Icon="{ui:SymbolIcon ArrowDownload24}"
Content="立即更新"
Command="{Binding UpdateFromSteambirdCommand}" />
</StackPanel>
</ui:CardControl>
<ui:CardControl Margin="0,0,0,4" Padding="12,12">
<ui:CardControl.Icon>
<ui:FontIcon Glyph="&#xf0c2;" Style="{StaticResource FaFontIconStyle}" />
</ui:CardControl.Icon>
<ui:CardControl.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<emoji:TextBlock Grid.Row="0"
Grid.Column="0"
Text="Mirror酱服务 💰"
TextWrapping="Wrap" />
<ui:TextBlock Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
Text="【国内】Mirror酱用户可以输入CDK高速更新"
TextWrapping="Wrap" />
</Grid>
</ui:CardControl.Header>
<StackPanel Orientation="Horizontal">
<ui:Button
Name="EditCdkButton"
Margin="0,0,8,0"
Icon="{ui:SymbolIcon TicketDiagonal24}"
Content="修改CDK"
Command="{Binding EditCdkCommand}" />
<ui:Button
Icon="{ui:SymbolIcon ArrowDownload24}"
Content="立即更新"
Command="{Binding UpdateFromMirrorChyanCommand}" />
</StackPanel>
</ui:CardControl>
<!--<ui:CardControl Margin="0,0,0,8">
<ui:CardControl.Icon>
<ui:FontIcon Glyph="&#xf0c2;" Style="{StaticResource FaFontIconStyle}" />
</ui:CardControl.Icon>
<ui:CardControl.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<emoji:TextBlock Grid.Row="0"
Grid.Column="0"
Text="Hutao Cloud 胡桃云⚡"
TextWrapping="Wrap" />
<ui:TextBlock Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
Text="胡桃云CDN用户可使用 Hutao Cloud CDN 高速更新"
TextWrapping="Wrap" />
</Grid>
</ui:CardControl.Header>
<StackPanel Orientation="Horizontal">
<ui:Button
Appearance="Primary"
Icon="{ui:SymbolIcon ArrowBounce24}"
Content="唤起胡桃"
Command="{Binding OneKeyExecuteCommand}" />
</StackPanel>
</ui:CardControl>-->
</StackPanel>
<!-- 原有按钮区域 -->
<ui:Grid Grid.Row="3"
Margin="8"
ColumnDefinitions="*,Auto,Auto,Auto,Auto">
<ui:Button Grid.Column="0"
MinWidth="90"
Margin="8,0,8,0"
Command="{Binding BackgroundUpdateCommand}"
Content="后台更新"
Visibility="Collapsed" />
<Grid Grid.Column="0">
<ui:Button x:Name="OtherUpdateButton"
Icon="{ui:SymbolIcon Globe24}"
Appearance="Primary"
MinWidth="90"
Margin="8,0,8,0"
Command="{Binding OtherUpdateCommand}"
Content="手动下载" />
<!-- 气泡提示 -->
<Popup x:Name="OtherUpdateTipPopup"
IsOpen="{Binding ShowOtherUpdateTip}"
PlacementTarget="{Binding ElementName=OtherUpdateButton}"
Placement="Top"
HorizontalOffset="0"
VerticalOffset="-3"
AllowsTransparency="True"
PopupAnimation="Fade">
<Grid>
<Border Background="#FF4A4A4A"
CornerRadius="8"
Padding="12,8"
MaxWidth="200"
MouseLeftButtonDown="OnCloseTipClick"
Cursor="Hand">
<Border.Effect>
<DropShadowEffect Color="Black"
Opacity="0.3"
ShadowDepth="2"
BlurRadius="8"/>
</Border.Effect>
<emoji:TextBlock Text="💡 如果上方更新渠道无法正常更新,可以点击此按钮手动下载安装包进行更新"
Foreground="#FFE6E6E6"
TextWrapping="Wrap"
FontSize="12"/>
</Border>
<!-- 小三角形指示器 -->
<Polygon Points="0,0 10,0 5,8"
Fill="#FF4A4A4A"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Margin="0,0,0,-8"/>
</Grid>
</Popup>
</Grid>
<!--<ui:Button Grid.Column="1"
MinWidth="90"
Margin="8,0,8,0"
Appearance="Success"
Command="{Binding UpdateCommand}"
Content="立即更新" />-->
<ui:Button Name="IgnoreButton"
Grid.Column="2"
MinWidth="90"
Margin="8,0,8,0"
Command="{Binding IgnoreCommand}"
Content="不再提示" />
<ui:Button Grid.Column="3"
MinWidth="90"
Margin="8,0,8,0"
Command="{Binding CancelCommand}"
Content="取消" />
</ui:Grid>
</ui:Grid>
<ui:TitleBar Title="{Binding Title, ElementName=app}"
ShowMaximize="False"
ShowMinimize="False">
<ui:TitleBar.Icon>
<ui:ImageIcon Source="pack://application:,,,/Resources/Images/logo.png" />
</ui:TitleBar.Icon>
</ui:TitleBar>
</Grid>
</ui:FluentWindow>