mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-25 10:05:49 +08:00
* 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 和镜像源下载语言文件
- 下载后自动替换本地文件并重新加载翻译服务
255 lines
14 KiB
XML
255 lines
14 KiB
XML
<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="" 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="" 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="" 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="" 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>
|