Merge pull request #877 from DGP-Studio/develop

1.7.0 Stable
This commit is contained in:
DismissedLight
2023-09-01 19:52:57 +08:00
committed by GitHub
126 changed files with 4300 additions and 1661 deletions

View File

@@ -4,6 +4,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Snap.Hutao.SourceGeneration.Primitive;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -16,6 +17,7 @@ namespace Snap.Hutao.SourceGeneration.Automation;
internal sealed class ConstructorGenerator : IIncrementalGenerator
{
private const string AttributeName = "Snap.Hutao.Core.Annotation.ConstructorGeneratedAttribute";
private const string CompilerGenerated = "System.Runtime.CompilerServices.CompilerGeneratedAttribute";
//private static readonly DiagnosticDescriptor genericTypeNotSupportedDescriptor = new("SH102", "Generic type is not supported to generate .ctor", "Type [{0}] is not supported", "Quality", DiagnosticSeverity.Error, true);
@@ -98,6 +100,11 @@ internal sealed class ConstructorGenerator : IIncrementalGenerator
foreach (IFieldSymbol fieldSymbol in fields)
{
if (fieldSymbol.Name.AsSpan()[0] is '<')
{
continue;
}
bool shoudSkip = false;
foreach (SyntaxReference syntaxReference in fieldSymbol.DeclaringSyntaxReferences)
{

View File

@@ -20,7 +20,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" PrivateAssets="all" Version="3.3.4" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.6.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" />
</ItemGroup>
</Project>

View File

@@ -12,7 +12,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
<PackageReference Include="coverlet.collector" Version="6.0.0">

View File

@@ -94,6 +94,7 @@
<x:String x:Key="UI_MarkTower">https://static.snapgenshin.com/Bg/UI_MarkTower.png</x:String>
<x:String x:Key="UI_Icon_Intee_Explore_1">https://static.snapgenshin.com/Bg/UI_Icon_Intee_Explore_1.png</x:String>
<x:String x:Key="UI_MarkQuest_Events_Proce">https://static.snapgenshin.com/Bg/UI_MarkQuest_Events_Proce.png</x:String>
<x:String x:Key="UI_ItemIcon_201">https://static.snapgenshin.com/ItemIcon/UI_ItemIcon_201.png</x:String>
<x:String x:Key="UI_ItemIcon_204">https://static.snapgenshin.com/ItemIcon/UI_ItemIcon_204.png</x:String>
<x:String x:Key="UI_ItemIcon_210">https://static.snapgenshin.com/ItemIcon/UI_ItemIcon_210.png</x:String>
<x:String x:Key="UI_ItemIcon_220021">https://static.snapgenshin.com/ItemIcon/UI_ItemIcon_220021.png</x:String>
@@ -173,327 +174,6 @@
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="{StaticResource CompatCornerRadius}"/>
</Style>
<Style x:Key="WebView2ContentDialogStyle" TargetType="ContentDialog">
<Setter Property="Foreground" Value="{ThemeResource ContentDialogForeground}"/>
<Setter Property="Background" Value="{ThemeResource ContentDialogBackground}"/>
<Setter Property="BorderThickness" Value="{ThemeResource ContentDialogBorderWidth}"/>
<Setter Property="BorderBrush" Value="{ThemeResource ContentDialogBorderBrush}"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentDialog">
<Border x:Name="Container">
<Grid x:Name="LayoutRoot" Visibility="Collapsed">
<Rectangle x:Name="SmokeLayerBackground" Fill="{ThemeResource ContentDialogSmokeFill}"/>
<Border
x:Name="BackgroundElement"
MinWidth="{ThemeResource ContentDialogMinWidth}"
MinHeight="{ThemeResource ContentDialogMinHeight}"
MaxWidth="{ThemeResource ContentDialogMaxWidth}"
MaxHeight="{ThemeResource ContentDialogMaxHeight}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="{TemplateBinding Background}"
BackgroundSizing="InnerBorderEdge"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
FlowDirection="{TemplateBinding FlowDirection}"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform x:Name="ScaleTransform"/>
</Border.RenderTransform>
<Grid x:Name="DialogSpace" CornerRadius="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ScrollViewer
x:Name="ContentScrollViewer"
HorizontalScrollBarVisibility="Disabled"
IsTabStop="False"
VerticalScrollBarVisibility="Disabled"
ZoomMode="Disabled">
<Grid
Padding="0"
BorderBrush="{ThemeResource ContentDialogSeparatorBorderBrush}"
BorderThickness="{ThemeResource ContentDialogSeparatorThickness}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ContentControl
x:Name="Title"
Margin="{ThemeResource ContentDialogTitleMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Content="{TemplateBinding Title}"
ContentTemplate="{TemplateBinding TitleTemplate}"
FontFamily="{StaticResource ContentControlThemeFontFamily}"
FontSize="20"
FontWeight="SemiBold"
Foreground="{TemplateBinding Foreground}"
IsTabStop="False">
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<ContentPresenter
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
ContentTransitions="{TemplateBinding ContentTransitions}"
MaxLines="2"
TextWrapping="Wrap"/>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
<ContentPresenter
x:Name="Content"
Grid.Row="1"
Margin="0,0,0,8"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
FontFamily="{StaticResource ContentControlThemeFontFamily}"
FontSize="{StaticResource ControlContentThemeFontSize}"
Foreground="{TemplateBinding Foreground}"
TextWrapping="Wrap"/>
</Grid>
</ScrollViewer>
<Grid
x:Name="CommandSpace"
Grid.Row="1"
Padding="8,0,8,8"
HorizontalAlignment="Stretch"
VerticalAlignment="Bottom"
XYFocusKeyboardNavigation="Enabled">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="PrimaryColumn" Width="*"/>
<ColumnDefinition x:Name="FirstSpacer" Width="0"/>
<ColumnDefinition x:Name="SecondaryColumn" Width="0"/>
<ColumnDefinition x:Name="SecondSpacer" Width="{ThemeResource ContentDialogButtonSpacing}"/>
<ColumnDefinition x:Name="CloseColumn" Width="*"/>
</Grid.ColumnDefinitions>
<Button
x:Name="PrimaryButton"
HorizontalAlignment="Stretch"
Content="{TemplateBinding PrimaryButtonText}"
ElementSoundMode="FocusOnly"
IsEnabled="{TemplateBinding IsPrimaryButtonEnabled}"
IsTabStop="False"
Style="{TemplateBinding PrimaryButtonStyle}"/>
<Button
x:Name="SecondaryButton"
HorizontalAlignment="Stretch"
Content="{TemplateBinding SecondaryButtonText}"
ElementSoundMode="FocusOnly"
IsEnabled="{TemplateBinding IsSecondaryButtonEnabled}"
IsTabStop="False"
Style="{TemplateBinding SecondaryButtonStyle}"/>
<Button
x:Name="CloseButton"
Grid.Column="4"
HorizontalAlignment="Stretch"
Content="{TemplateBinding CloseButtonText}"
ElementSoundMode="FocusOnly"
IsTabStop="False"
Style="{TemplateBinding CloseButtonStyle}"/>
</Grid>
</Grid>
</Border>
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="DialogShowingStates">
<VisualStateGroup.Transitions>
<VisualTransition To="DialogHidden">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="IsHitTestVisible">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="False"/>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleX">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0"/>
<SplineDoubleKeyFrame
KeySpline="{StaticResource ControlFastOutSlowInKeySpline}"
KeyTime="{StaticResource ControlFastAnimationDuration}"
Value="1.05"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleY">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0"/>
<SplineDoubleKeyFrame
KeySpline="{StaticResource ControlFastOutSlowInKeySpline}"
KeyTime="{StaticResource ControlFastAnimationDuration}"
Value="1.05"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Opacity">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.0"/>
<LinearDoubleKeyFrame KeyTime="{StaticResource ControlFasterAnimationDuration}" Value="0.0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
<VisualTransition To="DialogShowing">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleX">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.05"/>
<SplineDoubleKeyFrame
KeySpline="{StaticResource ControlFastOutSlowInKeySpline}"
KeyTime="{StaticResource ControlNormalAnimationDuration}"
Value="1.0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ScaleTransform" Storyboard.TargetProperty="ScaleY">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="1.05"/>
<SplineDoubleKeyFrame
KeySpline="{StaticResource ControlFastOutSlowInKeySpline}"
KeyTime="{StaticResource ControlNormalAnimationDuration}"
Value="1.0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Opacity">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0.0"/>
<LinearDoubleKeyFrame KeyTime="{StaticResource ControlFasterAnimationDuration}" Value="1.0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="DialogHidden"/>
<VisualState x:Name="DialogShowing">
<VisualState.Setters>
<Setter Target="PrimaryButton.IsTabStop" Value="True"/>
<Setter Target="SecondaryButton.IsTabStop" Value="True"/>
<Setter Target="CloseButton.IsTabStop" Value="True"/>
<Setter Target="LayoutRoot.Visibility" Value="Visible"/>
<Setter Target="BackgroundElement.TabFocusNavigation" Value="Cycle"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="DialogShowingWithoutSmokeLayer">
<VisualState.Setters>
<Setter Target="PrimaryButton.IsTabStop" Value="True"/>
<Setter Target="SecondaryButton.IsTabStop" Value="True"/>
<Setter Target="CloseButton.IsTabStop" Value="True"/>
<Setter Target="LayoutRoot.Visibility" Value="Visible"/>
<Setter Target="LayoutRoot.Background" Value="{x:Null}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="DialogSizingStates">
<VisualState x:Name="DefaultDialogSizing"/>
<VisualState x:Name="FullDialogSizing">
<VisualState.Setters>
<Setter Target="BackgroundElement.VerticalAlignment" Value="Stretch"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="ButtonsVisibilityStates">
<VisualState x:Name="AllVisible">
<VisualState.Setters>
<Setter Target="FirstSpacer.Width" Value="{ThemeResource ContentDialogButtonSpacing}"/>
<Setter Target="SecondaryColumn.Width" Value="*"/>
<Setter Target="SecondaryButton.(Grid.Column)" Value="2"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="NoneVisible">
<VisualState.Setters>
<Setter Target="CommandSpace.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PrimaryVisible">
<VisualState.Setters>
<Setter Target="PrimaryButton.(Grid.Column)" Value="4"/>
<Setter Target="SecondaryButton.Visibility" Value="Collapsed"/>
<Setter Target="CloseButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="SecondaryVisible">
<VisualState.Setters>
<Setter Target="SecondaryButton.(Grid.Column)" Value="4"/>
<Setter Target="PrimaryButton.Visibility" Value="Collapsed"/>
<Setter Target="CloseButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="CloseVisible">
<VisualState.Setters>
<Setter Target="PrimaryButton.Visibility" Value="Collapsed"/>
<Setter Target="SecondaryButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PrimaryAndSecondaryVisible">
<VisualState.Setters>
<Setter Target="SecondaryButton.(Grid.Column)" Value="4"/>
<Setter Target="CloseButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PrimaryAndCloseVisible">
<VisualState.Setters>
<Setter Target="SecondaryButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="SecondaryAndCloseVisible">
<VisualState.Setters>
<Setter Target="PrimaryButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="DefaultButtonStates">
<VisualState x:Name="NoDefaultButton"/>
<VisualState x:Name="PrimaryAsDefaultButton">
<VisualState.Setters>
<Setter Target="PrimaryButton.Style" Value="{StaticResource AccentButtonStyle}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="SecondaryAsDefaultButton">
<VisualState.Setters>
<Setter Target="SecondaryButton.Style" Value="{StaticResource AccentButtonStyle}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="CloseAsDefaultButton">
<VisualState.Setters>
<Setter Target="CloseButton.Style" Value="{StaticResource AccentButtonStyle}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="DialogBorderStates">
<VisualState x:Name="NoBorder"/>
<VisualState x:Name="AccentColorBorder">
<VisualState.Setters>
<Setter Target="BackgroundElement.BorderBrush" Value="{ThemeResource SystemControlForegroundAccentBrush}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="shci:CachedImage">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{ThemeResource ApplicationForegroundThemeBrush}"/>

View File

@@ -0,0 +1,19 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Windows.UI;
namespace Snap.Hutao.Control;
internal sealed class ColorSegment : IColorSegment
{
public ColorSegment(Color color, double value)
{
Color = color;
Value = value;
}
public Color Color { get; set; }
public double Value { get; set; }
}

View File

@@ -3,10 +3,10 @@
using Microsoft.UI.Xaml;
namespace Snap.Hutao.View.Helper;
namespace Snap.Hutao.Control.Helper;
[SuppressMessage("", "SH001")]
[DependencyProperty("SquareLength", typeof(double), 0D, nameof(OnSquareLengthChanged), IsAttached = true, AttachedType = typeof(Microsoft.UI.Xaml.FrameworkElement))]
[DependencyProperty("SquareLength", typeof(double), 0D, nameof(OnSquareLengthChanged), IsAttached = true, AttachedType = typeof(FrameworkElement))]
public sealed partial class FrameworkElementHelper
{
private static void OnSquareLengthChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)

View File

@@ -0,0 +1,13 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Windows.UI;
namespace Snap.Hutao.Control;
internal interface IColorSegment
{
Color Color { get; }
double Value { get; }
}

View File

@@ -0,0 +1,18 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml.Markup;
namespace Snap.Hutao.Control.Markup;
[MarkupExtensionReturnType(ReturnType = typeof(int))]
internal sealed class Int32Extension : MarkupExtension
{
public string Value { get; set; } = default!;
protected override object ProvideValue()
{
_ = int.TryParse(Value, out int result);
return result;
}
}

View File

@@ -0,0 +1,18 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml.Markup;
namespace Snap.Hutao.Control.Markup;
[MarkupExtensionReturnType(ReturnType = typeof(uint))]
internal sealed class UInt32Extension : MarkupExtension
{
public string Value { get; set; } = default!;
protected override object ProvideValue()
{
_ = uint.TryParse(Value, out uint result);
return result;
}
}

View File

@@ -1,6 +1,7 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml.Media;
using System.Buffers.Binary;
using System.Runtime.CompilerServices;
using Windows.UI;

View File

@@ -0,0 +1,44 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Shapes;
using System.Runtime.InteropServices;
namespace Snap.Hutao.Control;
[DependencyProperty("Source", typeof(List<IColorSegment>), default!, nameof(OnSourceChanged))]
internal sealed partial class SegmentedBar : ContentControl
{
private readonly LinearGradientBrush brush = new() { StartPoint = new(0, 0), EndPoint = new(1, 0), };
public SegmentedBar()
{
Content = new Rectangle()
{
Fill = brush,
};
}
private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
SegmentedBar segmentedBar = (SegmentedBar)obj;
GradientStopCollection collection = segmentedBar.brush.GradientStops;
collection.Clear();
if (args.NewValue as List<IColorSegment> is [_, ..] list)
{
double total = list.Sum(seg => seg.Value);
double offset = 0;
foreach (ref readonly IColorSegment segment in CollectionsMarshal.AsSpan(list))
{
collection.Add(new GradientStop() { Color = segment.Color, Offset = offset, });
offset += segment.Value / total;
collection.Add(new GradientStop() { Color = segment.Color, Offset = offset, });
}
}
}
}

View File

@@ -100,5 +100,270 @@
<!-- TODO: When will DefaultInfoBarStyle added -->
<Style TargetType="InfoBar">
<Setter Property="FontFamily" Value="{StaticResource MiSans}"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="CloseButtonStyle" Value="{StaticResource InfoBarCloseButtonStyle}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{ThemeResource InfoBarBorderBrush}"/>
<Setter Property="BorderThickness" Value="{ThemeResource InfoBarBorderThickness}"/>
<Setter Property="AutomationProperties.LandmarkType" Value="Custom"/>
<Setter Property="AutomationProperties.IsDialog" Value="True"/>
<Setter Property="CornerRadius" Value="{ThemeResource ControlCornerRadius}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="InfoBar">
<Border
x:Name="ContentRoot"
VerticalAlignment="Top"
Background="{ThemeResource InfoBarInformationalSeverityBackgroundBrush}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<!-- Background is used here so that it overrides the severity status color if set. -->
<Grid
MinHeight="{ThemeResource InfoBarMinHeight}"
Padding="{StaticResource InfoBarContentRootPadding}"
HorizontalAlignment="Stretch"
Background="{TemplateBinding Background}"
CornerRadius="{TemplateBinding CornerRadius}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<!-- Icon -->
<ColumnDefinition Width="*"/>
<!-- Title, message, and action -->
<ColumnDefinition Width="Auto"/>
<!-- Close button -->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid x:Name="StandardIconArea" Visibility="Collapsed">
<TextBlock
x:Name="IconBackground"
Grid.Column="0"
Margin="{StaticResource InfoBarIconMargin}"
VerticalAlignment="Top"
AutomationProperties.AccessibilityView="Raw"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource InfoBarIconFontSize}"
Foreground="{ThemeResource InfoBarInformationalSeverityIconBackground}"
Text="{StaticResource InfoBarIconBackgroundGlyph}"/>
<TextBlock
x:Name="StandardIcon"
Grid.Column="0"
Margin="{StaticResource InfoBarIconMargin}"
VerticalAlignment="Top"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource InfoBarIconFontSize}"
Foreground="{ThemeResource InfoBarInformationalSeverityIconForeground}"
Text="{StaticResource InfoBarInformationalIconGlyph}"/>
</Grid>
<Viewbox
x:Name="UserIconBox"
Grid.Column="0"
MaxWidth="{ThemeResource InfoBarIconFontSize}"
MaxHeight="{ThemeResource InfoBarIconFontSize}"
Margin="{ThemeResource InfoBarIconMargin}"
VerticalAlignment="Top"
Child="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.IconElement}"
Visibility="Collapsed"/>
<InfoBarPanel
Grid.Column="1"
Margin="{StaticResource InfoBarPanelMargin}"
HorizontalOrientationPadding="{StaticResource InfoBarPanelHorizontalOrientationPadding}"
VerticalOrientationPadding="{StaticResource InfoBarPanelVerticalOrientationPadding}">
<TextBlock
x:Name="Title"
FontSize="{StaticResource InfoBarTitleFontSize}"
FontWeight="{StaticResource InfoBarTitleFontWeight}"
Foreground="{ThemeResource InfoBarTitleForeground}"
InfoBarPanel.HorizontalOrientationMargin="{StaticResource InfoBarTitleHorizontalOrientationMargin}"
InfoBarPanel.VerticalOrientationMargin="{StaticResource InfoBarTitleVerticalOrientationMargin}"
Text="{TemplateBinding Title}"
TextWrapping="WrapWholeWords"/>
<TextBlock
x:Name="Message"
FontSize="{StaticResource InfoBarMessageFontSize}"
FontWeight="{StaticResource InfoBarMessageFontWeight}"
Foreground="{ThemeResource InfoBarMessageForeground}"
InfoBarPanel.HorizontalOrientationMargin="{StaticResource InfoBarMessageHorizontalOrientationMargin}"
InfoBarPanel.VerticalOrientationMargin="{StaticResource InfoBarMessageVerticalOrientationMargin}"
Text="{TemplateBinding Message}"
TextWrapping="WrapWholeWords"/>
<ContentPresenter
VerticalAlignment="Top"
Content="{TemplateBinding ActionButton}"
InfoBarPanel.HorizontalOrientationMargin="{StaticResource InfoBarActionHorizontalOrientationMargin}"
InfoBarPanel.VerticalOrientationMargin="{StaticResource InfoBarActionVerticalOrientationMargin}">
<ContentPresenter.Resources>
<Style BasedOn="{StaticResource DefaultHyperlinkButtonStyle}" TargetType="HyperlinkButton">
<Style.Setters>
<Setter Property="Margin" Value="{StaticResource InfoBarHyperlinkButtonMargin}"/>
<Setter Property="Foreground" Value="{ThemeResource InfoBarHyperlinkButtonForeground}"/>
</Style.Setters>
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</InfoBarPanel>
<ContentPresenter
Grid.Row="1"
Grid.Column="1"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"/>
<Button
Name="CloseButton"
Grid.Column="2"
Command="{TemplateBinding CloseButtonCommand}"
CommandParameter="{TemplateBinding CloseButtonCommandParameter}"
Style="{TemplateBinding CloseButtonStyle}">
<Button.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<StaticResource x:Key="ButtonBackground" ResourceKey="AppBarButtonBackground"/>
<StaticResource x:Key="ButtonBackgroundPointerOver" ResourceKey="AppBarButtonBackgroundPointerOver"/>
<StaticResource x:Key="ButtonBackgroundPressed" ResourceKey="AppBarButtonBackgroundPressed"/>
<StaticResource x:Key="ButtonBackgroundDisabled" ResourceKey="AppBarButtonBackgroundDisabled"/>
<StaticResource x:Key="ButtonForeground" ResourceKey="AppBarButtonForeground"/>
<StaticResource x:Key="ButtonForegroundPointerOver" ResourceKey="AppBarButtonForegroundPointerOver"/>
<StaticResource x:Key="ButtonForegroundPressed" ResourceKey="AppBarButtonForegroundPressed"/>
<StaticResource x:Key="ButtonForegroundDisabled" ResourceKey="AppBarButtonForegroundDisabled"/>
<StaticResource x:Key="ButtonBorderBrush" ResourceKey="AppBarButtonBorderBrush"/>
<StaticResource x:Key="ButtonBorderBrushPointerOver" ResourceKey="AppBarButtonBorderBrushPointerOver"/>
<StaticResource x:Key="ButtonBorderBrushPressed" ResourceKey="AppBarButtonBorderBrushPressed"/>
<StaticResource x:Key="ButtonBorderBrushDisabled" ResourceKey="AppBarButtonBorderBrushDisabled"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<StaticResource x:Key="ButtonBackground" ResourceKey="AppBarButtonBackground"/>
<StaticResource x:Key="ButtonBackgroundPointerOver" ResourceKey="AppBarButtonBackgroundPointerOver"/>
<StaticResource x:Key="ButtonBackgroundPressed" ResourceKey="AppBarButtonBackgroundPressed"/>
<StaticResource x:Key="ButtonBackgroundDisabled" ResourceKey="AppBarButtonBackgroundDisabled"/>
<StaticResource x:Key="ButtonForeground" ResourceKey="AppBarButtonForeground"/>
<StaticResource x:Key="ButtonForegroundPointerOver" ResourceKey="AppBarButtonForegroundPointerOver"/>
<StaticResource x:Key="ButtonForegroundPressed" ResourceKey="AppBarButtonForegroundPressed"/>
<StaticResource x:Key="ButtonForegroundDisabled" ResourceKey="AppBarButtonForegroundDisabled"/>
<StaticResource x:Key="ButtonBorderBrush" ResourceKey="AppBarButtonBorderBrush"/>
<StaticResource x:Key="ButtonBorderBrushPointerOver" ResourceKey="AppBarButtonBorderBrushPointerOver"/>
<StaticResource x:Key="ButtonBorderBrushPressed" ResourceKey="AppBarButtonBorderBrushPressed"/>
<StaticResource x:Key="ButtonBorderBrushDisabled" ResourceKey="AppBarButtonBorderBrushDisabled"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
<StaticResource x:Key="ButtonBackground" ResourceKey="AppBarButtonBackground"/>
<StaticResource x:Key="ButtonBackgroundPointerOver" ResourceKey="AppBarButtonBackgroundPointerOver"/>
<StaticResource x:Key="ButtonBackgroundPressed" ResourceKey="AppBarButtonBackgroundPressed"/>
<StaticResource x:Key="ButtonBackgroundDisabled" ResourceKey="AppBarButtonBackgroundDisabled"/>
<StaticResource x:Key="ButtonForeground" ResourceKey="AppBarButtonForeground"/>
<StaticResource x:Key="ButtonForegroundPointerOver" ResourceKey="AppBarButtonForegroundPointerOver"/>
<StaticResource x:Key="ButtonForegroundPressed" ResourceKey="AppBarButtonForegroundPressed"/>
<StaticResource x:Key="ButtonForegroundDisabled" ResourceKey="AppBarButtonForegroundDisabled"/>
<StaticResource x:Key="ButtonBorderBrush" ResourceKey="AppBarButtonBorderBrush"/>
<StaticResource x:Key="ButtonBorderBrushPointerOver" ResourceKey="AppBarButtonBorderBrushPointerOver"/>
<StaticResource x:Key="ButtonBorderBrushPressed" ResourceKey="AppBarButtonBorderBrushPressed"/>
<StaticResource x:Key="ButtonBorderBrushDisabled" ResourceKey="AppBarButtonBorderBrushDisabled"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Button.Resources>
<Viewbox
Width="{StaticResource InfoBarCloseButtonGlyphSize}"
Height="{StaticResource InfoBarCloseButtonGlyphSize}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<SymbolIcon Symbol="{StaticResource InfoBarCloseButtonSymbol}"/>
</Viewbox>
</Button>
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SeverityLevels">
<VisualState x:Name="Informational"/>
<VisualState x:Name="Error">
<VisualState.Setters>
<Setter Target="ContentRoot.Background" Value="{ThemeResource InfoBarErrorSeverityBackgroundBrush}"/>
<Setter Target="IconBackground.Foreground" Value="{ThemeResource InfoBarErrorSeverityIconBackground}"/>
<Setter Target="StandardIcon.Text" Value="{StaticResource InfoBarErrorIconGlyph}"/>
<Setter Target="StandardIcon.Foreground" Value="{ThemeResource InfoBarErrorSeverityIconForeground}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Warning">
<VisualState.Setters>
<Setter Target="ContentRoot.Background" Value="{ThemeResource InfoBarWarningSeverityBackgroundBrush}"/>
<Setter Target="IconBackground.Foreground" Value="{ThemeResource InfoBarWarningSeverityIconBackground}"/>
<Setter Target="StandardIcon.Text" Value="{StaticResource InfoBarWarningIconGlyph}"/>
<Setter Target="StandardIcon.Foreground" Value="{ThemeResource InfoBarWarningSeverityIconForeground}"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Success">
<VisualState.Setters>
<Setter Target="ContentRoot.Background" Value="{ThemeResource InfoBarSuccessSeverityBackgroundBrush}"/>
<Setter Target="IconBackground.Foreground" Value="{ThemeResource InfoBarSuccessSeverityIconBackground}"/>
<Setter Target="StandardIcon.Text" Value="{StaticResource InfoBarSuccessIconGlyph}"/>
<Setter Target="StandardIcon.Foreground" Value="{ThemeResource InfoBarSuccessSeverityIconForeground}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="IconStates">
<VisualState x:Name="StandardIconVisible">
<VisualState.Setters>
<Setter Target="UserIconBox.Visibility" Value="Collapsed"/>
<Setter Target="StandardIconArea.Visibility" Value="Visible"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="UserIconVisible">
<VisualState.Setters>
<Setter Target="UserIconBox.Visibility" Value="Visible"/>
<Setter Target="StandardIconArea.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="NoIconVisible"/>
</VisualStateGroup>
<VisualStateGroup>
<VisualState x:Name="CloseButtonVisible"/>
<VisualState x:Name="CloseButtonCollapsed">
<VisualState.Setters>
<Setter Target="CloseButton.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="InfoBarVisibility">
<VisualState x:Name="InfoBarVisible"/>
<VisualState x:Name="InfoBarCollapsed">
<VisualState.Setters>
<Setter Target="ContentRoot.Visibility" Value="Collapsed"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup>
<VisualState x:Name="ForegroundNotSet"/>
<VisualState x:Name="ForegroundSet">
<VisualState.Setters>
<Setter Target="Title.Foreground" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Foreground}"/>
<Setter Target="Message.Foreground" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Foreground}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -150,7 +150,7 @@ internal sealed class Activation : IActivation
// Increase launch times
LocalSetting.Set(SettingKeys.LaunchTimes, LocalSetting.Get(SettingKeys.LaunchTimes, 0) + 1);
if (false && LocalSetting.Get(SettingKeys.Major1Minor7Revision0GuideState, (uint)GuideState.None) < (uint)GuideState.Completed)
if (LocalSetting.Get(SettingKeys.Major1Minor7Revision0GuideState, (uint)GuideState.Language) < (uint)GuideState.Completed)
{
await taskContext.SwitchToMainThreadAsync();
serviceProvider.GetRequiredService<GuideWindow>();
@@ -243,11 +243,6 @@ internal sealed class Activation : IActivation
{
try
{
if (serviceProvider.GetRequiredService<IHutaoUserService>() is IHutaoUserServiceInitialization hutaoUserServiceInitialization)
{
await hutaoUserServiceInitialization.InitializeInternalAsync().ConfigureAwait(false);
}
await serviceProvider
.GetRequiredService<IDailyNoteService>()
.RefreshDailyNotesAsync()

View File

@@ -115,6 +115,11 @@ internal static class LocalSetting
return Get<Windows.Foundation.Rect>(key, defaultValue);
}
public static ApplicationDataCompositeValue Get(string key, ApplicationDataCompositeValue defaultValue)
{
return Get<ApplicationDataCompositeValue>(key, defaultValue);
}
/// <inheritdoc cref="Set{T}(string, T)"/>
public static void Set(string key, byte value)
{
@@ -217,6 +222,11 @@ internal static class LocalSetting
Set<Windows.Foundation.Rect>(key, value);
}
public static void Set(string key, ApplicationDataCompositeValue value)
{
Set<ApplicationDataCompositeValue>(key, value);
}
/// <summary>
/// 获取设置项的值
/// </summary>

View File

@@ -48,4 +48,9 @@ internal static class SettingKeys
/// 1.7.0 版本指引状态
/// </summary>
public const string Major1Minor7Revision0GuideState = "Major1Minor7Revision0GuideState";
/// <summary>
/// 排除的系统公告
/// </summary>
public const string ExcludedAnnouncementIds = "ExcludedAnnouncementIds";
}

View File

@@ -26,7 +26,7 @@ internal sealed class JumpListInterop : IJumpListInterop
list.Items.Clear();
JumpListItem launchGameItem = JumpListItem.CreateWithArguments(Activation.LaunchGame, SH.CoreJumpListHelperLaunchGameItemDisplayName);
launchGameItem.Logo = "ms-appx:///Resource/Icon/UI_GuideIcon_PlayMethod.png".ToUri();
launchGameItem.Logo = "ms-appx:///Resource/Navigation/LaunchGame.png".ToUri();
list.Items.Add(launchGameItem);

View File

@@ -84,6 +84,11 @@ internal static partial class EnumerableExtension
return false;
}
public static void RemoveLast<T>(this IList<T> collection)
{
collection.RemoveAt(collection.Count - 1);
}
/// <summary>
/// 转换到新类型的列表
/// </summary>

View File

@@ -4,17 +4,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvg="using:Snap.Hutao.View.Guide"
mc:Ignorable="d">
<Grid x:Name="RootGrid">
<mxi:Interaction.Behaviors>
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>

View File

@@ -14,24 +14,6 @@
Height="44"
Margin="48,0,0,0"/>
<cwuc:SwitchPresenter x:Name="ContentSwitchPresenter">
<cwuc:SwitchPresenter.ContentTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</cwuc:SwitchPresenter.ContentTransitions>
<cwuc:Case>
<cwuc:Case.Value>
<x:Boolean>True</x:Boolean>
</cwuc:Case.Value>
<shv:WelcomeView/>
</cwuc:Case>
<cwuc:Case>
<cwuc:Case.Value>
<x:Boolean>False</x:Boolean>
</cwuc:Case.Value>
<shv:MainView/>
</cwuc:Case>
</cwuc:SwitchPresenter>
<shv:MainView/>
</Grid>
</Window>

View File

@@ -1,11 +1,8 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml;
using Snap.Hutao.Core.Setting;
using Snap.Hutao.Core.Windowing;
using Snap.Hutao.Message;
using Windows.Foundation;
using Windows.Win32.UI.WindowsAndMessaging;
@@ -17,7 +14,7 @@ namespace Snap.Hutao;
[HighQuality]
[Injection(InjectAs.Singleton)]
[SuppressMessage("", "CA1001")]
internal sealed partial class MainWindow : Window, IWindowOptionsSource, IRecipient<WelcomeStateCompleteMessage>
internal sealed partial class MainWindow : Window, IWindowOptionsSource
{
private const int MinWidth = 848;
private const int MinHeight = 524;
@@ -35,11 +32,8 @@ internal sealed partial class MainWindow : Window, IWindowOptionsSource, IRecipi
InitializeComponent();
windowOptions = new(this, TitleBarView.DragArea, new(1200, 741), true);
ExtendedWindow<MainWindow>.Initialize(this, serviceProvider);
serviceProvider.GetRequiredService<IMessenger>().Register(this);
logger = serviceProvider.GetRequiredService<ILogger<MainWindow>>();
// If not complete we should present the welcome view.
ContentSwitchPresenter.Value = StaticResource.IsAnyUnfulfilledContractPresent();
closedEventHander = OnClosed;
Closed += closedEventHander;
}
@@ -54,12 +48,6 @@ internal sealed partial class MainWindow : Window, IWindowOptionsSource, IRecipi
pInfo->ptMinTrackSize.Y = (int)Math.Max(MinHeight * scalingFactor, pInfo->ptMinTrackSize.Y);
}
/// <inheritdoc/>
public void Receive(WelcomeStateCompleteMessage message)
{
ContentSwitchPresenter.Value = false;
}
private void OnClosed(object sender, WindowEventArgs args)
{
logger.LogInformation("MainWindow Closed");

View File

@@ -1,12 +0,0 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Message;
/// <summary>
/// 欢迎状态完成消息
/// </summary>
[HighQuality]
internal sealed class WelcomeStateCompleteMessage
{
}

View File

@@ -119,7 +119,7 @@ internal sealed partial class GachaItem
ArchiveId = archiveId,
GachaType = item.GachaType,
QueryType = item.UIGFGachaType,
ItemId = uint.Parse(item.ItemId, CultureInfo.CurrentCulture),
ItemId = uint.Parse(item.ItemId, CultureInfo.CurrentCulture), // TODO: catch the FormatException and throw v2.3 incompat exception
Time = item.Time,
Id = item.Id,
};

View File

@@ -1,6 +1,8 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using System.Runtime.Versioning;
namespace Snap.Hutao.Model.Entity;
/// <summary>
@@ -86,10 +88,16 @@ internal sealed partial class SettingEntry
/// <summary>
/// 启动游戏 多倍启动
/// </summary>
[Obsolete("不再支持多开")]
public const string MultipleInstances = "Launch.MultipleInstances";
/// <summary>
/// 语言
/// </summary>
public const string Culture = "Culture";
/// <summary>
/// 自定义极验接口
/// </summary>
public const string GeetestCustomCompositeUrl = "GeetestCustomCompositeUrl";
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -1536,6 +1536,69 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 游戏进程已退出 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseProcessExited {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseProcessExited", resourceCulture);
}
}
/// <summary>
/// 查找类似 正在初始化游戏进程 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseProcessInitializing {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseProcessInitializing", resourceCulture);
}
}
/// <summary>
/// 查找类似 游戏进程已启动 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseProcessStarted {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseProcessStarted", resourceCulture);
}
}
/// <summary>
/// 查找类似 解锁帧率上限失败,正在结束游戏进程 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseUnlockFpsFailed {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseUnlockFpsFailed", resourceCulture);
}
}
/// <summary>
/// 查找类似 解锁帧率上限成功 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseUnlockFpsSucceed {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseUnlockFpsSucceed", resourceCulture);
}
}
/// <summary>
/// 查找类似 正在尝试解锁帧率上限 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseUnlockingFps {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseUnlockingFps", resourceCulture);
}
}
/// <summary>
/// 查找类似 等待游戏进程退出 的本地化字符串。
/// </summary>
internal static string ServiceGameLaunchPhaseWaitingProcessExit {
get {
return ResourceManager.GetString("ServiceGameLaunchPhaseWaitingProcessExit", resourceCulture);
}
}
/// <summary>
/// 查找类似 选择游戏本体 的本地化字符串。
/// </summary>
@@ -2031,6 +2094,33 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 预测 的本地化字符串。
/// </summary>
internal static string ViewControlStatisticsSegmentedItemContentPrediction {
get {
return ResourceManager.GetString("ViewControlStatisticsSegmentedItemContentPrediction", resourceCulture);
}
}
/// <summary>
/// 查找类似 比例 的本地化字符串。
/// </summary>
internal static string ViewControlStatisticsSegmentedItemContentProportion {
get {
return ResourceManager.GetString("ViewControlStatisticsSegmentedItemContentProportion", resourceCulture);
}
}
/// <summary>
/// 查找类似 统计 的本地化字符串。
/// </summary>
internal static string ViewControlStatisticsSegmentedItemContentStatistics {
get {
return ResourceManager.GetString("ViewControlStatisticsSegmentedItemContentStatistics", resourceCulture);
}
}
/// <summary>
/// 查找类似 养成计划 的本地化字符串。
/// </summary>
@@ -2274,6 +2364,87 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 请输入请求接口的 Url 复合模板 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlCompositInputHint {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlCompositInputHint", resourceCulture);
}
}
/// <summary>
/// 查找类似 接口需要返回形如上方所示的 Json 数据,多余的数据会被忽略 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlReturnDataDescription1 {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlReturnDataDescription1", resourceCulture);
}
}
/// <summary>
/// 查找类似 &quot;code&quot; 为 0 时,指示验证成功,其他的值均视为验证失败 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlReturnDataDescription2 {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlReturnDataDescription2", resourceCulture);
}
}
/// <summary>
/// 查找类似 返回数据 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlReturnDataHeader {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlReturnDataHeader", resourceCulture);
}
}
/// <summary>
/// 查找类似 {0} 将在实际请求时替换为 gt 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlSampleDescription1 {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlSampleDescription1", resourceCulture);
}
}
/// <summary>
/// 查找类似 {1} 将在实际请求时替换为 challenge 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlSampleDescription2 {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlSampleDescription2", resourceCulture);
}
}
/// <summary>
/// 查找类似 将会通过 GET 方式对接口发送请求 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlSampleDescription3 {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlSampleDescription3", resourceCulture);
}
}
/// <summary>
/// 查找类似 示例 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlSampleHeader {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlSampleHeader", resourceCulture);
}
}
/// <summary>
/// 查找类似 配置无感验证接口 的本地化字符串。
/// </summary>
internal static string ViewDialogGeetestCustomUrlTitle {
get {
return ResourceManager.GetString("ViewDialogGeetestCustomUrlTitle", resourceCulture);
}
}
/// <summary>
/// 查找类似 导出 App 的本地化字符串。
/// </summary>
@@ -2454,6 +2625,132 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 我已阅读并同意 的本地化字符串。
/// </summary>
internal static string ViewGuideStepAgreementIHaveReadText {
get {
return ResourceManager.GetString("ViewGuideStepAgreementIHaveReadText", resourceCulture);
}
}
/// <summary>
/// 查找类似 问题报告方式与流程 的本地化字符串。
/// </summary>
internal static string ViewGuideStepAgreementIssueReport {
get {
return ResourceManager.GetString("ViewGuideStepAgreementIssueReport", resourceCulture);
}
}
/// <summary>
/// 查找类似 Snap Hutao 开源许可 的本地化字符串。
/// </summary>
internal static string ViewGuideStepAgreementOpenSourceLicense {
get {
return ResourceManager.GetString("ViewGuideStepAgreementOpenSourceLicense", resourceCulture);
}
}
/// <summary>
/// 查找类似 用户数据与隐私权益 的本地化字符串。
/// </summary>
internal static string ViewGuideStepAgreementPrivacyPolicy {
get {
return ResourceManager.GetString("ViewGuideStepAgreementPrivacyPolicy", resourceCulture);
}
}
/// <summary>
/// 查找类似 用户使用协议与法律声明 的本地化字符串。
/// </summary>
internal static string ViewGuideStepAgreementTermOfService {
get {
return ResourceManager.GetString("ViewGuideStepAgreementTermOfService", resourceCulture);
}
}
/// <summary>
/// 查找类似 文档 的本地化字符串。
/// </summary>
internal static string ViewGuideStepDocument {
get {
return ResourceManager.GetString("ViewGuideStepDocument", resourceCulture);
}
}
/// <summary>
/// 查找类似 环境 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironment {
get {
return ResourceManager.GetString("ViewGuideStepEnvironment", resourceCulture);
}
}
/// <summary>
/// 查找类似 安装完成后重启胡桃以查看是否正常生效 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironmentAfterInstallDescription {
get {
return ResourceManager.GetString("ViewGuideStepEnvironmentAfterInstallDescription", resourceCulture);
}
}
/// <summary>
/// 查找类似 如果上方的图标中存在乱码,请前往 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironmentFontDescription1 {
get {
return ResourceManager.GetString("ViewGuideStepEnvironmentFontDescription1", resourceCulture);
}
}
/// <summary>
/// 查找类似 下载并自行安装图标字体 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironmentFontDescription2 {
get {
return ResourceManager.GetString("ViewGuideStepEnvironmentFontDescription2", resourceCulture);
}
}
/// <summary>
/// 查找类似 若未检测到 WebView2 运行时信息,可以前往 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironmentWebView2Description1 {
get {
return ResourceManager.GetString("ViewGuideStepEnvironmentWebView2Description1", resourceCulture);
}
}
/// <summary>
/// 查找类似 下载并自行安装运行时 的本地化字符串。
/// </summary>
internal static string ViewGuideStepEnvironmentWebView2Description2 {
get {
return ResourceManager.GetString("ViewGuideStepEnvironmentWebView2Description2", resourceCulture);
}
}
/// <summary>
/// 查找类似 语言 的本地化字符串。
/// </summary>
internal static string ViewGuideStepLanguage {
get {
return ResourceManager.GetString("ViewGuideStepLanguage", resourceCulture);
}
}
/// <summary>
/// 查找类似 资源 的本地化字符串。
/// </summary>
internal static string ViewGuideStepStaticResource {
get {
return ResourceManager.GetString("ViewGuideStepStaticResource", resourceCulture);
}
}
/// <summary>
/// 查找类似 深渊统计 的本地化字符串。
/// </summary>
@@ -2833,7 +3130,7 @@ namespace Snap.Hutao.Resource.Localization {
}
/// <summary>
/// 查找类似 {1:00.000%} 概率 {0} 抽后获得五星物品 的本地化字符串。
/// 查找类似 {1:P3} 概率 {0} 抽后获得五星物品 的本地化字符串。
/// </summary>
internal static string ViewModelGachaLogPredictedPullLeftToOrange {
get {
@@ -2842,7 +3139,7 @@ namespace Snap.Hutao.Resource.Localization {
}
/// <summary>
/// 查找类似 {0:00.000%} 概率下一抽获得五星物品 的本地化字符串。
/// 查找类似 {0:P3} 概率下一抽获得五星物品 的本地化字符串。
/// </summary>
internal static string ViewModelGachaLogProbabilityOfNextPullIsOrange {
get {
@@ -2904,6 +3201,42 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 我已阅读并同意上方的条款 的本地化字符串。
/// </summary>
internal static string ViewModelGuideActionAgreement {
get {
return ResourceManager.GetString("ViewModelGuideActionAgreement", resourceCulture);
}
}
/// <summary>
/// 查找类似 完成 的本地化字符串。
/// </summary>
internal static string ViewModelGuideActionComplete {
get {
return ResourceManager.GetString("ViewModelGuideActionComplete", resourceCulture);
}
}
/// <summary>
/// 查找类似 下一步 的本地化字符串。
/// </summary>
internal static string ViewModelGuideActionNext {
get {
return ResourceManager.GetString("ViewModelGuideActionNext", resourceCulture);
}
}
/// <summary>
/// 查找类似 下载资源文件中,请稍候 的本地化字符串。
/// </summary>
internal static string ViewModelGuideActionStaticResourceBegin {
get {
return ResourceManager.GetString("ViewModelGuideActionStaticResourceBegin", resourceCulture);
}
}
/// <summary>
/// 查找类似 请输入正确的邮箱 的本地化字符串。
/// </summary>
@@ -3363,6 +3696,15 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 刷新时间 的本地化字符串。
/// </summary>
internal static string ViewPageAvatarPropertyRefreshTimeToggle {
get {
return ResourceManager.GetString("ViewPageAvatarPropertyRefreshTimeToggle", resourceCulture);
}
}
/// <summary>
/// 查找类似 评分 的本地化字符串。
/// </summary>
@@ -3769,7 +4111,7 @@ namespace Snap.Hutao.Resource.Localization {
}
/// <summary>
/// 查找类似 每期深渊首次上传可免费获得5天时长 的本地化字符串。
/// 查找类似 每期深渊首次上传可免费获得 3 天时长 的本地化字符串。
/// </summary>
internal static string ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription {
get {
@@ -4911,6 +5253,42 @@ namespace Snap.Hutao.Resource.Localization {
}
}
/// <summary>
/// 查找类似 配置 的本地化字符串。
/// </summary>
internal static string ViewPageSettingGeetestCustomUrlAction {
get {
return ResourceManager.GetString("ViewPageSettingGeetestCustomUrlAction", resourceCulture);
}
}
/// <summary>
/// 查找类似 配置当请求触发人机验证时使用的验证接口 的本地化字符串。
/// </summary>
internal static string ViewPageSettingGeetestCustomUrlDescription {
get {
return ResourceManager.GetString("ViewPageSettingGeetestCustomUrlDescription", resourceCulture);
}
}
/// <summary>
/// 查找类似 配置验证请求接口 的本地化字符串。
/// </summary>
internal static string ViewPageSettingGeetestCustomUrlHeader {
get {
return ResourceManager.GetString("ViewPageSettingGeetestCustomUrlHeader", resourceCulture);
}
}
/// <summary>
/// 查找类似 无感验证 的本地化字符串。
/// </summary>
internal static string ViewPageSettingGeetestVerificationHeader {
get {
return ResourceManager.GetString("ViewPageSettingGeetestVerificationHeader", resourceCulture);
}
}
/// <summary>
/// 查找类似 胡桃账号 的本地化字符串。
/// </summary>

View File

@@ -60,45 +60,45 @@
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
@@ -153,6 +153,9 @@
<data name="ControlPanelPanelSelectorDropdownListName" xml:space="preserve">
<value>List</value>
</data>
<data name="CoreExceptionServiceDatabaseCorruptedMessage" xml:space="preserve">
<value>Database is corrupted: {0}</value>
</data>
<data name="CoreExceptionServiceUserdataCorruptedMessage" xml:space="preserve">
<value>User data archive is corrupted: {0}</value>
</data>
@@ -183,6 +186,9 @@
<data name="FilePickerImportCommit" xml:space="preserve">
<value>Import</value>
</data>
<data name="GuideWindowTitle" xml:space="preserve">
<value>Welcome to Snap Hutao, Traveler ~</value>
</data>
<data name="LaunchGameTitle" xml:space="preserve">
<value>Select Account to Launch</value>
</data>
@@ -231,9 +237,24 @@
<data name="ModelBindingUserInitializationFailed" xml:space="preserve">
<value>Network Error</value>
</data>
<data name="ModelEntityDailyNoteNotRefreshed" xml:space="preserve">
<value>Not refreshed</value>
</data>
<data name="ModelEntityDailyNoteRefreshTimeFormat" xml:space="preserve">
<value>Refresh at {0:yyyy/MM/dd HH:mm:ss}</value>
</data>
<data name="ModelEntitySpiralAbyssScheduleFormat" xml:space="preserve">
<value>Schedule {0}</value>
</data>
<data name="ModelInterchangeUIGFItemTypeAvatar" xml:space="preserve">
<value>Character</value>
</data>
<data name="ModelInterchangeUIGFItemTypeUnknown" xml:space="preserve">
<value>Unknown</value>
</data>
<data name="ModelInterchangeUIGFItemTypeWeapon" xml:space="preserve">
<value>Weapon</value>
</data>
<data name="ModelIntrinsicAssociationTypeFatui" xml:space="preserve">
<value>Fatui</value>
<comment>Need EXACT same string in game</comment>
@@ -351,6 +372,9 @@
<value>Sword</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataAvatarPlayerName" xml:space="preserve">
<value>Traveler</value>
</data>
<data name="ModelMetadataFetterInfoBirthdayFormat" xml:space="preserve">
<value>{0}/{1}</value>
</data>
@@ -375,7 +399,7 @@
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataMaterialLocalSpecialtyRegex" xml:space="preserve">
<value>^[\u4e00-\u9fa5]{2}区域特产$</value>
<value>^[\u4e00-\u9fa5]{2}Local Specialty$</value>
<comment>If you don't know what is regex, DO NOT TRANSLATE THIS!</comment>
</data>
<data name="ModelMetadataMaterialWeaponAscensionMaterial" xml:space="preserve">
@@ -506,6 +530,24 @@
<value>Anemo RES</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorNotRefreshed" xml:space="preserve">
<value>Dev Plan: N/A</value>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorRefreshTimeFormat" xml:space="preserve">
<value>Avatar Calculator: {0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordNotRefreshed" xml:space="preserve">
<value>My Characters: N/A</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordRefreshTimeFormat" xml:space="preserve">
<value>My Characters: {0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseNotRefreshed" xml:space="preserve">
<value>Enka: N/A</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseRefreshTimeFormat" xml:space="preserve">
<value>Character Showcase: {0:MM-dd HH:mm}</value>
</data>
<data name="ServiceCultivationProjectCurrentUserdataCourrpted" xml:space="preserve">
<value>Failed to save development plan status</value>
</data>
@@ -584,6 +626,9 @@
<data name="ServiceGachaLogHutaoCloudServiceNotAllowed" xml:space="preserve">
<value>Wish history uploading service is not available</value>
</data>
<data name="ServiceGachaLogUIGFImportItemInvalidFormat" xml:space="preserve">
<value>Data contains unexpected item, Id: {0}</value>
</data>
<data name="ServiceGachaLogUrlProviderAuthkeyRequestFailed" xml:space="preserve">
<value>Failed to request authkey</value>
</data>
@@ -602,9 +647,15 @@
<data name="ServiceGachaLogUrlProviderStokenUnsupported" xml:space="preserve">
<value>SToken refresh does not support HoYoLab account</value>
</data>
<data name="ServiceGachaLogUrlProviderUrlLanguageNotMatchCurrentLocale" xml:space="preserve">
<value>UIGF file language: {0} does not match Snap Hutao language: {1}, please retry after switching client language to target UIGF file language</value>
</data>
<data name="ServiceGachaStatisticsFactoryItemIdInvalid" xml:space="preserve">
<value>Unsupported Item ID: {0}</value>
</data>
<data name="ServiceGachaUIGFImportLanguageNotMatch" xml:space="preserve">
<value>UIGF file language: {0} does not match Snap Hutao language: {1}, please retry after switching client language to target UIGF file language</value>
</data>
<data name="ServiceGameDetectGameAccountMultiMatched" xml:space="preserve">
<value>Multiple matching accounts detected, please delete duplicate accounts</value>
</data>
@@ -614,6 +665,27 @@
<data name="ServiceGameFileOperationExceptionMessage" xml:space="preserve">
<value>Failed to operate on game file: {0}</value>
</data>
<data name="ServiceGameLaunchPhaseProcessExited" xml:space="preserve">
<value>Game process closed</value>
</data>
<data name="ServiceGameLaunchPhaseProcessInitializing" xml:space="preserve">
<value>Initializing game process…</value>
</data>
<data name="ServiceGameLaunchPhaseProcessStarted" xml:space="preserve">
<value>Game process started</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsFailed" xml:space="preserve">
<value>Failed to unlock frame rate limit, closing game process…</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsSucceed" xml:space="preserve">
<value>Successfully unlocked frame rate limit</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockingFps" xml:space="preserve">
<value>Trying to unlock frame rate limit…</value>
</data>
<data name="ServiceGameLaunchPhaseWaitingProcessExit" xml:space="preserve">
<value>Waiting for the game process to close…</value>
</data>
<data name="ServiceGameLocatorFileOpenPickerCommitText" xml:space="preserve">
<value>Select game executable</value>
</data>
@@ -623,6 +695,15 @@
<data name="ServiceGameLocatorUnityLogGamePathNotFound" xml:space="preserve">
<value>Game path not found in Unity log file</value>
</data>
<data name="ServiceGamePackageConvertMoveFileBackupFormat" xml:space="preserve">
<value>Backup{0}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRenameFormat" xml:space="preserve">
<value>Rename{0} to{1}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRestoreFormat" xml:space="preserve">
<value>Replace: {0}</value>
</data>
<data name="ServiceGamePackageRenameDataFolderFailed" xml:space="preserve">
<value>Failed to change data folder name</value>
</data>
@@ -632,6 +713,9 @@
<data name="ServiceGamePackageRequestPackageVerionFailed" xml:space="preserve">
<value>Requesting Package Version failed</value>
</data>
<data name="ServiceGamePackageRequestScatteredFileFailed" xml:space="preserve">
<value>Failed to download client file: {0}</value>
</data>
<data name="ServiceGamePathLocateFailed" xml:space="preserve">
<value>Unable to find game path. Edit it in the Setting page.</value>
</data>
@@ -666,7 +750,7 @@
<value>Wish history data backup service will be available until\n{0:yyyy-MM-dd HH:mm:ss}</value>
</data>
<data name="ServiceMetadataFileNotFound" xml:space="preserve">
<value>无法找到缓存的元数据文件</value>
<value>Unable to find cached metadata file</value>
</data>
<data name="ServiceMetadataNotInitialized" xml:space="preserve">
<value>Metadata service has not been initialized or failed to initialize</value>
@@ -680,6 +764,15 @@
<data name="ServiceMetadataVersionNotSupported" xml:space="preserve">
<value>Your Snap Hutao version is too low. Please update as soon as possible.</value>
</data>
<data name="ServiceSignInClaimRewardFailedFormat" xml:space="preserve">
<value>Check-in failed, {0}</value>
</data>
<data name="ServiceSignInRewardListRequestFailed" xml:space="preserve">
<value>Fetch Signin reward list failed</value>
</data>
<data name="ServiceSignInSuccessRewardFormat" xml:space="preserve">
<value>Check-in successfully, {0} x {1}</value>
</data>
<data name="ServiceUserCurrentMultiMatched" xml:space="preserve">
<value>Multiple users recorded as selected</value>
</data>
@@ -746,12 +839,27 @@
<data name="ViewControlStatisticsCardPurpleText" xml:space="preserve">
<value>4 Stars</value>
</data>
<data name="ViewControlStatisticsCardToLastOrangeText" xml:space="preserve">
<value>Last 5 Stars</value>
</data>
<data name="ViewControlStatisticsCardToLastPurpleText" xml:space="preserve">
<value>Last 4 Stars</value>
</data>
<data name="ViewControlStatisticsCardUpAveragePullText" xml:space="preserve">
<value>Luckiness Avg</value>
</data>
<data name="ViewControlStatisticsCardUpText" xml:space="preserve">
<value>UP</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentPrediction" xml:space="preserve">
<value>Prediction</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentProportion" xml:space="preserve">
<value>Proportion</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentStatistics" xml:space="preserve">
<value>Statistics</value>
</data>
<data name="ViewCultivationHeader" xml:space="preserve">
<value>Dev Plan</value>
</data>
@@ -792,7 +900,7 @@
<value>Create new plan</value>
</data>
<data name="ViewDialogCultivatePromotionDeltaTitle" xml:space="preserve">
<value>Add to current plan</value>
<value>Add to Current Dev Plan</value>
</data>
<data name="ViewDialogDailyNoteNotificationDailyTaskNotify" xml:space="preserve">
<value>Daily Commission Availability Notification</value>
@@ -800,6 +908,9 @@
<data name="ViewDialogDailyNoteNotificationExpeditionNotify" xml:space="preserve">
<value>Expedition Reward Notification</value>
</data>
<data name="ViewDialogDailyNoteNotificationHomeCoinNotifyThreshold" xml:space="preserve">
<value>Original Resin Alarm Threshold</value>
</data>
<data name="ViewDialogDailyNoteNotificationResinNotifyThreshold" xml:space="preserve">
<value>Realm Currency Alarm Threshold</value>
</data>
@@ -830,6 +941,33 @@
<data name="ViewDialogGachaLogUrlTitle" xml:space="preserve">
<value>Input wish history URL manually</value>
</data>
<data name="ViewDialogGeetestCustomUrlCompositInputHint" xml:space="preserve">
<value>Input request Url with composit template</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription1" xml:space="preserve">
<value>The interface requires a return of Json data as shown above. Extra data will be ignored</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription2" xml:space="preserve">
<value>If "code" is 0, the authentication is successful, otherwise the authentication is failed</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataHeader" xml:space="preserve">
<value>Returned data</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription1" xml:space="preserve">
<value>{0} will be replaced with gt during a request</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription2" xml:space="preserve">
<value>{1} will be replaced with challenge during a request</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription3" xml:space="preserve">
<value>Requests will be sent to interfaces via GET</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleHeader" xml:space="preserve">
<value>Example</value>
</data>
<data name="ViewDialogGeetestCustomUrlTitle" xml:space="preserve">
<value>Configure no authentication interface</value>
</data>
<data name="ViewDialogImportExportApp" xml:space="preserve">
<value>Export App</value>
</data>
@@ -890,11 +1028,53 @@
<data name="ViewGachaLogHeader" xml:space="preserve">
<value>Wish History</value>
</data>
<data name="ViewGuideStepAgreementIHaveReadText" xml:space="preserve">
<value>I've read and agreed to</value>
</data>
<data name="ViewGuideStepAgreementIssueReport" xml:space="preserve">
<value>Issue Reporting Approach and Process</value>
</data>
<data name="ViewGuideStepAgreementOpenSourceLicense" xml:space="preserve">
<value>Snap Hutao Open Source License</value>
</data>
<data name="ViewGuideStepAgreementPrivacyPolicy" xml:space="preserve">
<value>User Data and Privacy Notice</value>
</data>
<data name="ViewGuideStepAgreementTermOfService" xml:space="preserve">
<value>User Agreement and Legal Notices</value>
</data>
<data name="ViewGuideStepDocument" xml:space="preserve">
<value>Documentation</value>
</data>
<data name="ViewGuideStepEnvironment" xml:space="preserve">
<value>Environments</value>
</data>
<data name="ViewGuideStepEnvironmentAfterInstallDescription" xml:space="preserve">
<value>Restart Snap Hutao after the installation to check if it takes effect</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription1" xml:space="preserve">
<value>If icons above are mojibake or unable to load, please visit</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription2" xml:space="preserve">
<value>to download and install the font</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description1" xml:space="preserve">
<value>If no Webview2 runtime information detected, please visit</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description2" xml:space="preserve">
<value>to download and install runtime</value>
</data>
<data name="ViewGuideStepLanguage" xml:space="preserve">
<value>Language</value>
</data>
<data name="ViewGuideStepStaticResource" xml:space="preserve">
<value>Assets</value>
</data>
<data name="ViewHutaoDatabaseHeader" xml:space="preserve">
<value>Abyss Stats</value>
</data>
<data name="ViewInfoBarToggleTitle" xml:space="preserve">
<value>有新的通知</value>
<value>New notification</value>
</data>
<data name="ViewLaunchGameHeader" xml:space="preserve">
<value>Game Launcher</value>
@@ -983,6 +1163,9 @@
<data name="ViewModelDailyNoteRegisterTaskFail" xml:space="preserve">
<value>Failed to add Scheduled Task, please try again in administrator mode</value>
</data>
<data name="ViewModelDailyNoteRequestProgressTitle" xml:space="preserve">
<value>Fetching Realtime Notes data, please wait</value>
</data>
<data name="ViewModelExportSuccessMessage" xml:space="preserve">
<value>Successfully saved to selected patch</value>
</data>
@@ -1014,10 +1197,10 @@
<value>Import Failed</value>
</data>
<data name="ViewModelGachaLogPredictedPullLeftToOrange" xml:space="preserve">
<value>{1:00.000%} 概率 {0} 抽后获得五星物品</value>
<value>{1:P3} chance to get a 5-star item after {0} wishes</value>
</data>
<data name="ViewModelGachaLogProbabilityOfNextPullIsOrange" xml:space="preserve">
<value>{0:00.000%} 概率下一抽获得五星物品</value>
<value>{0:P3} chance to get a 5-star item in the next wish</value>
</data>
<data name="ViewModelGachaLogRefreshFail" xml:space="preserve">
<value>Failed to fetch wish history</value>
@@ -1037,6 +1220,21 @@
<data name="ViewModelGachaLogUploadToHutaoCloudProgress" xml:space="preserve">
<value>Uploading to Snap Hutao Cloud Service</value>
</data>
<data name="ViewModelGuideActionAgreement" xml:space="preserve">
<value>I've Read and Agreed Conditions Above</value>
</data>
<data name="ViewModelGuideActionComplete" xml:space="preserve">
<value>Complete</value>
</data>
<data name="ViewModelGuideActionNext" xml:space="preserve">
<value>Next</value>
</data>
<data name="ViewModelGuideActionStaticResourceBegin" xml:space="preserve">
<value>Dowloading Assets</value>
</data>
<data name="ViewModelHutaoPassportEmailNotValidHint" xml:space="preserve">
<value>Please enter correct email address.</value>
</data>
<data name="ViewModelImportFromClipboardErrorTitle" xml:space="preserve">
<value>Text format in clipboard is incorrect</value>
</data>
@@ -1134,7 +1332,7 @@
<value>Import</value>
</data>
<data name="ViewPageAchievementRemoveArchive" xml:space="preserve">
<value>Delete current archive</value>
<value>Delete Current Archive</value>
</data>
<data name="ViewPageAchievementSearchPlaceholder" xml:space="preserve">
<value>Search achievement name, description or ID</value>
@@ -1158,7 +1356,7 @@
<value>No character data fetched</value>
</data>
<data name="ViewPageAvatarPropertyExportAsImage" xml:space="preserve">
<value>Export as image</value>
<value>Export as Image</value>
</data>
<data name="ViewPageAvatarPropertyHeader" xml:space="preserve">
<value>Character Attributes</value>
@@ -1187,6 +1385,9 @@
<data name="ViewPageAvatarPropertyRefreshFromHoyolabGameRecordDescription" xml:space="preserve">
<value>Sync most data other than character talent</value>
</data>
<data name="ViewPageAvatarPropertyRefreshTimeToggle" xml:space="preserve">
<value>Refresh Time</value>
</data>
<data name="ViewPageAvatarPropertyScore" xml:space="preserve">
<value>Rating</value>
</data>
@@ -1230,7 +1431,7 @@
<value>Delete list</value>
</data>
<data name="ViewPageCultivationRemoveProject" xml:space="preserve">
<value>Delete current plan</value>
<value>Delete Current Plan</value>
</data>
<data name="ViewPageCultivationWikiAvatarDescription" xml:space="preserve">
<value>Add any character to Development Plan</value>
@@ -1271,11 +1472,23 @@
<data name="ViewPageDailyNoteResinDiscountUsed" xml:space="preserve">
<value>Cost-halving Used</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefresh" xml:space="preserve">
<value>Auto Refresh</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefreshDescription" xml:space="preserve">
<value>Refresh the Realtime Notes added after the selected time</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshElevatedHint" xml:space="preserve">
<value>These options are only allowed to modify in non-admin mode</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshHeader" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="ViewPageDailyNoteSlientModeDescription" xml:space="preserve">
<value>Do not disturb during Genshin gaming</value>
</data>
<data name="ViewPageDailyNoteSlientModeHeader" xml:space="preserve">
<value>Do not disturb</value>
<value>Do Not Disturb</value>
</data>
<data name="ViewPageDailyNoteVerify" xml:space="preserve">
<value>Verify Current User and Role</value>
@@ -1311,7 +1524,7 @@
<value>Download the Cloud Archive of This Uid</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription" xml:space="preserve">
<value>Free 5 days after uploading current schedule abyss record</value>
<value>Free 3-day license after uploading current schedule Abyss record</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityHeader" xml:space="preserve">
<value>Upload Abyss Records</value>
@@ -1337,6 +1550,12 @@
<data name="ViewPageGachaLogRefreshAction" xml:space="preserve">
<value>Fetch</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInput" xml:space="preserve">
<value>Type in URL manually.</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInputDescription" xml:space="preserve">
<value>We use provided URL to refresh your wish history</value>
</data>
<data name="ViewPageGachaLogRefreshBySToken" xml:space="preserve">
<value>SToken Refresh</value>
</data>
@@ -1350,7 +1569,7 @@
<value>Use embedded browser cache to refresh wish history</value>
</data>
<data name="ViewPageGachaLogRemoveArchiveAction" xml:space="preserve">
<value>Delete current archive</value>
<value>Delete Current Archive</value>
</data>
<data name="ViewPageGahcaLogPivotAvatar" xml:space="preserve">
<value>Character</value>
@@ -1368,19 +1587,19 @@
<value>Weapon</value>
</data>
<data name="ViewPageHomeGreetingTextCommon1" xml:space="preserve">
<value>胡桃已经为你启动了 {0} 次游戏</value>
<value>Snap Hutao has launched the game for you {0} times</value>
</data>
<data name="ViewPageHomeGreetingTextCommon2" xml:space="preserve">
<value>你已经启动了胡桃 {0} 次</value>
<value>You have launched Snap Hutao {0} times</value>
</data>
<data name="ViewPageHomeGreetingTextDefault" xml:space="preserve">
<value>旅行者,欢迎来到提瓦特大陆!</value>
<value>Welcome to Teyvat, Traveler!</value>
</data>
<data name="ViewPageHomeGreetingTextEasterEgg" xml:space="preserve">
<value>你说的对,但是《胡桃》是由 DGP Studio 自主研发的一款...</value>
<value>You're right, but Snap Hutao was developed by DGP Studio...</value>
</data>
<data name="ViewPageHomeGreetingTextEpic1" xml:space="preserve">
<value>呐,旅行者,这是你来到提瓦特大陆的第 {0} 天哦</value>
<value>Well, Traveler, this is your {0}th day in Teyvat.</value>
</data>
<data name="ViewPageHomeLaunchGameSettingAction" xml:space="preserve">
<value>Settings</value>
@@ -1572,7 +1791,7 @@
<value>Rename</value>
</data>
<data name="ViewPageLaunchGameSwitchSchemeDescription" xml:space="preserve">
<value>Switch game server (CN/BiliBili/OS)</value>
<value>Switch game server (CN/BiliBili/Global)</value>
</data>
<data name="ViewPageLaunchGameSwitchSchemeHeader" xml:space="preserve">
<value>Server</value>
@@ -1685,6 +1904,18 @@
<data name="ViewPageSettingGameHeader" xml:space="preserve">
<value>Game</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlAction" xml:space="preserve">
<value>Configuration</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlDescription" xml:space="preserve">
<value>Config verification API endpoint used for anti-bot verification</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlHeader" xml:space="preserve">
<value>Config Geetest Verification Endpoint</value>
</data>
<data name="ViewPageSettingGeetestVerificationHeader" xml:space="preserve">
<value>Geetest Verification</value>
</data>
<data name="ViewPageSettingHutaoPassportHeader" xml:space="preserve">
<value>Snap Hutao Account</value>
</data>
@@ -1884,7 +2115,10 @@
<value>MiYouShe</value>
</data>
<data name="ViewUserCookieOperation2" xml:space="preserve">
<value>HoYoLab</value>
<value>HoYoLAB</value>
</data>
<data name="ViewUserCookieOperation3" xml:space="preserve">
<value>Current user</value>
</data>
<data name="ViewUserCookieOperationLoginMihoyoUserAction" xml:space="preserve">
<value>Web Login</value>
@@ -1895,6 +2129,9 @@
<data name="ViewUserCookieOperationRefreshCookieAction" xml:space="preserve">
<value>Refresh Cookie</value>
</data>
<data name="ViewUserCookieOperationSignInRewardAction" xml:space="preserve">
<value>Claim Check-In Reward</value>
</data>
<data name="ViewUserCopyCookieAction" xml:space="preserve">
<value>Copy Cookie</value>
</data>
@@ -1937,6 +2174,21 @@
<data name="ViewWikiWeaponHeader" xml:space="preserve">
<value>Weapon WIKI</value>
</data>
<data name="WebAnnouncementMatchPermanentActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放</value>
</data>
<data name="WebAnnouncementMatchPersistentActivityTime" xml:space="preserve">
<value>〓活动时间〓.*?\d\.\d版本期间持续开放</value>
</data>
<data name="WebAnnouncementMatchTransientActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?~.*?&amp;lt;t class="t_(?:gl|lc)".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTime" xml:space="preserve">
<value>〓更新时间〓.+?&amp;lt;t class=\"t_(?:gl|lc)\".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTitle" xml:space="preserve">
<value>\d\.\d版本更新说明</value>
</data>
<data name="WebAnnouncementTimeDaysBeginFormat" xml:space="preserve">
<value>Start in {0} days</value>
</data>
@@ -1965,7 +2217,10 @@
<value>Daily Commission Reward claimed</value>
</data>
<data name="WebDailyNoteHomeCoinRecoveryFormat" xml:space="preserve">
<value>Expected to reach the limit in {0} {1:HH:mm}</value>
<value>Will be full in {0} {1:HH:mm}</value>
</data>
<data name="WebDailyNoteHomeLocked" xml:space="preserve">
<value>Serenitea Pot not Unlocked</value>
</data>
<data name="WebDailyNoteRecoveryTimeDay0" xml:space="preserve">
<value>Today</value>
@@ -1983,7 +2238,7 @@
<value>Original Resin is full</value>
</data>
<data name="WebDailyNoteResinRecoveryFormat" xml:space="preserve">
<value>Fully replenished in {0} {1:HH:mm}</value>
<value>Will be replenished in {0} {1:HH:mm}</value>
</data>
<data name="WebDailyNoteTransformerAppend" xml:space="preserve">
<value>Ready for use again after</value>
@@ -1997,6 +2252,12 @@
<data name="WebDailyNoteTransformerMinutesFormat" xml:space="preserve">
<value>{0} mins</value>
</data>
<data name="WebDailyNoteTransformerNotObtained" xml:space="preserve">
<value>Not obtained</value>
</data>
<data name="WebDailyNoteTransformerNotObtainedDetail" xml:space="preserve">
<value>Transformer not obtained</value>
</data>
<data name="WebDailyNoteTransformerNotReached" xml:space="preserve">
<value>Cooling down</value>
</data>
@@ -2025,13 +2286,13 @@
<value>Request too fast, please try again later</value>
</data>
<data name="WebEnkaResponseStatusCode500" xml:space="preserve">
<value>服务器偶发错误</value>
<value>Occasional Server Errors</value>
</data>
<data name="WebEnkaResponseStatusCode503" xml:space="preserve">
<value>服务器严重错误</value>
<value>Critical Server Error</value>
</data>
<data name="WebEnkaResponseStatusCodeUnknown" xml:space="preserve">
<value>未知的服务器错误</value>
<value>Unknown Server Error</value>
</data>
<data name="WebGachaConfigTypeAvatarEventWish" xml:space="preserve">
<value>Character Event Wish</value>
@@ -2051,4 +2312,10 @@
<data name="WebResponseFormat" xml:space="preserve">
<value>Return Code: {0} | Message: {1}</value>
</data>
<data name="WebResponseRefreshCookieHintFormat" xml:space="preserve">
<value>Please refresh cookie, raw message: {0}</value>
</data>
<data name="WebResponseRequestExceptionFormat" xml:space="preserve">
<value>[{1}] network request exception in [{0}] please try again later</value>
</data>
</root>

View File

@@ -60,45 +60,45 @@
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
@@ -153,6 +153,9 @@
<data name="ControlPanelPanelSelectorDropdownListName" xml:space="preserve">
<value>リスト</value>
</data>
<data name="CoreExceptionServiceDatabaseCorruptedMessage" xml:space="preserve">
<value>データベースが破損しています:{0}</value>
</data>
<data name="CoreExceptionServiceUserdataCorruptedMessage" xml:space="preserve">
<value>{0}:ユーザデータが破損しました</value>
</data>
@@ -183,6 +186,9 @@
<data name="FilePickerImportCommit" xml:space="preserve">
<value>インポート</value>
</data>
<data name="GuideWindowTitle" xml:space="preserve">
<value>胡桃へようこそ</value>
</data>
<data name="LaunchGameTitle" xml:space="preserve">
<value>アカウントを選択して開始します</value>
</data>
@@ -220,10 +226,10 @@
<value>上场 {0} 次</value>
</data>
<data name="ModelBindingLaunchGameLaunchSchemeBilibili" xml:space="preserve">
<value>BiliBiliサーバー</value>
<value>世界樹サーバー</value>
</data>
<data name="ModelBindingLaunchGameLaunchSchemeChinese" xml:space="preserve">
<value>天空島・世界樹サーバー</value>
<value>天空島サーバー</value>
</data>
<data name="ModelBindingLaunchGameLaunchSchemeOversea" xml:space="preserve">
<value>グローバルサーバー</value>
@@ -231,9 +237,24 @@
<data name="ModelBindingUserInitializationFailed" xml:space="preserve">
<value>ネットワーク接続エラー</value>
</data>
<data name="ModelEntityDailyNoteNotRefreshed" xml:space="preserve">
<value>尚未刷新</value>
</data>
<data name="ModelEntityDailyNoteRefreshTimeFormat" xml:space="preserve">
<value>刷新于 {0:yyyy/MM/dd HH:mm:ss}</value>
</data>
<data name="ModelEntitySpiralAbyssScheduleFormat" xml:space="preserve">
<value>第 {0} 期</value>
</data>
<data name="ModelInterchangeUIGFItemTypeAvatar" xml:space="preserve">
<value>キャラクター</value>
</data>
<data name="ModelInterchangeUIGFItemTypeUnknown" xml:space="preserve">
<value>未知</value>
</data>
<data name="ModelInterchangeUIGFItemTypeWeapon" xml:space="preserve">
<value>武器</value>
</data>
<data name="ModelIntrinsicAssociationTypeFatui" xml:space="preserve">
<value>ファデュイ</value>
<comment>Need EXACT same string in game</comment>
@@ -280,7 +301,7 @@
<value>女性</value>
</data>
<data name="ModelIntrinsicBodyTypeLoli" xml:space="preserve">
<value>萝莉</value>
<value>ロリ</value>
</data>
<data name="ModelIntrinsicBodyTypeMale" xml:space="preserve">
<value>男性</value>
@@ -351,11 +372,14 @@
<value>片手剣</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataAvatarPlayerName" xml:space="preserve">
<value>旅行者</value>
</data>
<data name="ModelMetadataFetterInfoBirthdayFormat" xml:space="preserve">
<value>{0} 月 {1} 日</value>
</data>
<data name="ModelMetadataMaterialCharacterAndWeaponEnhancementMaterial" xml:space="preserve">
<value>角色与武器培养素材</value>
<value>キャラクターと武器の育成素材</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataMaterialCharacterAscensionMaterial" xml:space="preserve">
@@ -375,7 +399,7 @@
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataMaterialLocalSpecialtyRegex" xml:space="preserve">
<value>^[\u4e00-\u9fa5]{2}域特产$</value>
<value>\u4e00\u9fa5{2}域特産品</value>
<comment>If you don't know what is regex, DO NOT TRANSLATE THIS!</comment>
</data>
<data name="ModelMetadataMaterialWeaponAscensionMaterial" xml:space="preserve">
@@ -506,6 +530,24 @@
<value>風元素耐性</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorNotRefreshed" xml:space="preserve">
<value>养成计算:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorRefreshTimeFormat" xml:space="preserve">
<value>养成计算:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordNotRefreshed" xml:space="preserve">
<value>我的角色:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordRefreshTimeFormat" xml:space="preserve">
<value>我的角色:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseNotRefreshed" xml:space="preserve">
<value>角色橱窗:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseRefreshTimeFormat" xml:space="preserve">
<value>角色橱窗:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceCultivationProjectCurrentUserdataCourrpted" xml:space="preserve">
<value>保存养成计划状态失败</value>
</data>
@@ -584,6 +626,9 @@
<data name="ServiceGachaLogHutaoCloudServiceNotAllowed" xml:space="preserve">
<value>祈愿记录上传服务不可用</value>
</data>
<data name="ServiceGachaLogUIGFImportItemInvalidFormat" xml:space="preserve">
<value>数据包含异常物品, Id{0}</value>
</data>
<data name="ServiceGachaLogUrlProviderAuthkeyRequestFailed" xml:space="preserve">
<value>请求验证密钥失败</value>
</data>
@@ -602,9 +647,15 @@
<data name="ServiceGachaLogUrlProviderStokenUnsupported" xml:space="preserve">
<value>HoYoLabユーザーのSToken 更新はサポートしていません。</value>
</data>
<data name="ServiceGachaLogUrlProviderUrlLanguageNotMatchCurrentLocale" xml:space="preserve">
<value>Url 中的语言:{0} 与胡桃的语言:{1} 不匹配,请切换到对应语言重试</value>
</data>
<data name="ServiceGachaStatisticsFactoryItemIdInvalid" xml:space="preserve">
<value>Item Id{0} はサポートしていません</value>
</data>
<data name="ServiceGachaUIGFImportLanguageNotMatch" xml:space="preserve">
<value>UIGF 文件的语言:{0} 与胡桃的语言:{1} 不匹配,请切换到对应语言重试</value>
</data>
<data name="ServiceGameDetectGameAccountMultiMatched" xml:space="preserve">
<value>存在多个匹配账号,请删除重复的账号</value>
</data>
@@ -614,6 +665,27 @@
<data name="ServiceGameFileOperationExceptionMessage" xml:space="preserve">
<value>游戏文件操作失败:{0}</value>
</data>
<data name="ServiceGameLaunchPhaseProcessExited" xml:space="preserve">
<value>游戏进程已退出</value>
</data>
<data name="ServiceGameLaunchPhaseProcessInitializing" xml:space="preserve">
<value>正在初始化游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseProcessStarted" xml:space="preserve">
<value>游戏进程已启动</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsFailed" xml:space="preserve">
<value>解锁帧率上限失败,正在结束游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsSucceed" xml:space="preserve">
<value>解锁帧率上限成功</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockingFps" xml:space="preserve">
<value>正在尝试解锁帧率上限</value>
</data>
<data name="ServiceGameLaunchPhaseWaitingProcessExit" xml:space="preserve">
<value>等待游戏进程退出</value>
</data>
<data name="ServiceGameLocatorFileOpenPickerCommitText" xml:space="preserve">
<value>ゲーム本体を選択する</value>
</data>
@@ -623,6 +695,15 @@
<data name="ServiceGameLocatorUnityLogGamePathNotFound" xml:space="preserve">
<value>Unity ログファイル内にはゲームパスが見つかりません</value>
</data>
<data name="ServiceGamePackageConvertMoveFileBackupFormat" xml:space="preserve">
<value>备份:{0}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRenameFormat" xml:space="preserve">
<value>重命名:{0} 到:{1}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRestoreFormat" xml:space="preserve">
<value>替换:{0}</value>
</data>
<data name="ServiceGamePackageRenameDataFolderFailed" xml:space="preserve">
<value>データフォルダの名前を変更できませんでした</value>
</data>
@@ -632,6 +713,9 @@
<data name="ServiceGamePackageRequestPackageVerionFailed" xml:space="preserve">
<value>Package Versionを取得できません</value>
</data>
<data name="ServiceGamePackageRequestScatteredFileFailed" xml:space="preserve">
<value>下载客户端文件失败:{0}</value>
</data>
<data name="ServiceGamePathLocateFailed" xml:space="preserve">
<value>无法找到游戏路径,请前往设置修改</value>
</data>
@@ -680,6 +764,15 @@
<data name="ServiceMetadataVersionNotSupported" xml:space="preserve">
<value>胡桃のバージョンが古すぎるため、アップデートを推奨します。</value>
</data>
<data name="ServiceSignInClaimRewardFailedFormat" xml:space="preserve">
<value>签到失败,{0}</value>
</data>
<data name="ServiceSignInRewardListRequestFailed" xml:space="preserve">
<value>获取奖励列表失败</value>
</data>
<data name="ServiceSignInSuccessRewardFormat" xml:space="preserve">
<value>签到成功,{0}×{1}</value>
</data>
<data name="ServiceUserCurrentMultiMatched" xml:space="preserve">
<value>多个用户记录为选中状态</value>
</data>
@@ -746,12 +839,27 @@
<data name="ViewControlStatisticsCardPurpleText" xml:space="preserve">
<value>星4</value>
</data>
<data name="ViewControlStatisticsCardToLastOrangeText" xml:space="preserve">
<value>距上个五星</value>
</data>
<data name="ViewControlStatisticsCardToLastPurpleText" xml:space="preserve">
<value>距上个四星</value>
</data>
<data name="ViewControlStatisticsCardUpAveragePullText" xml:space="preserve">
<value>ピックアップ獲得平均数</value>
</data>
<data name="ViewControlStatisticsCardUpText" xml:space="preserve">
<value>ピックアップ</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentPrediction" xml:space="preserve">
<value>预测</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentProportion" xml:space="preserve">
<value>比例</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentStatistics" xml:space="preserve">
<value>统计</value>
</data>
<data name="ViewCultivationHeader" xml:space="preserve">
<value>育成計画</value>
</data>
@@ -771,13 +879,13 @@
<value>インポートモード</value>
</data>
<data name="ViewDialogAchievementArchiveImportStrategyAggressive" xml:space="preserve">
<value>贪婪(添加新数据,更新已完成项</value>
<value>貪欲(新規項目の追加、達成項目をチェック</value>
</data>
<data name="ViewDialogAchievementArchiveImportStrategyLazy" xml:space="preserve">
<value>惰(添加新数据,跳过已完成项</value>
<value>惰(新規項目の追加、達成項目をスキップ</value>
</data>
<data name="ViewDialogAchievementArchiveImportStrategyOverwrite" xml:space="preserve">
<value>覆盖(删除老数据,添加新的数据</value>
<value>置換(現在項目の削除、全項目をインポート</value>
</data>
<data name="ViewDialogAchievementArchiveImportTitle" xml:space="preserve">
<value>アーカイブにアチーブメントをインポート</value>
@@ -800,6 +908,9 @@
<data name="ViewDialogDailyNoteNotificationExpeditionNotify" xml:space="preserve">
<value>探検派遣完了のお知らせ</value>
</data>
<data name="ViewDialogDailyNoteNotificationHomeCoinNotifyThreshold" xml:space="preserve">
<value>洞天宝钱提醒阈值</value>
</data>
<data name="ViewDialogDailyNoteNotificationResinNotifyThreshold" xml:space="preserve">
<value>洞天宝銭まもなく満タン</value>
</data>
@@ -830,6 +941,33 @@
<data name="ViewDialogGachaLogUrlTitle" xml:space="preserve">
<value>祈願履歴のURLを直接入力</value>
</data>
<data name="ViewDialogGeetestCustomUrlCompositInputHint" xml:space="preserve">
<value>请输入请求接口的 Url 复合模板</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription1" xml:space="preserve">
<value>接口需要返回形如上方所示的 Json 数据,多余的数据会被忽略</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription2" xml:space="preserve">
<value>"code" 为 0 时,指示验证成功,其他的值均视为验证失败</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataHeader" xml:space="preserve">
<value>返回数据</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription1" xml:space="preserve">
<value>{0} 将在实际请求时替换为 gt</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription2" xml:space="preserve">
<value>{1} 将在实际请求时替换为 challenge</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription3" xml:space="preserve">
<value>将会通过 GET 方式对接口发送请求</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleHeader" xml:space="preserve">
<value>示例</value>
</data>
<data name="ViewDialogGeetestCustomUrlTitle" xml:space="preserve">
<value>配置无感验证接口</value>
</data>
<data name="ViewDialogImportExportApp" xml:space="preserve">
<value>导出 App</value>
</data>
@@ -890,6 +1028,48 @@
<data name="ViewGachaLogHeader" xml:space="preserve">
<value>祈願履歴</value>
</data>
<data name="ViewGuideStepAgreementIHaveReadText" xml:space="preserve">
<value>我已阅读并同意</value>
</data>
<data name="ViewGuideStepAgreementIssueReport" xml:space="preserve">
<value>问题报告方式与流程</value>
</data>
<data name="ViewGuideStepAgreementOpenSourceLicense" xml:space="preserve">
<value>Snap Hutao 开源许可</value>
</data>
<data name="ViewGuideStepAgreementPrivacyPolicy" xml:space="preserve">
<value>用户数据与隐私权益</value>
</data>
<data name="ViewGuideStepAgreementTermOfService" xml:space="preserve">
<value>用户使用协议与法律声明</value>
</data>
<data name="ViewGuideStepDocument" xml:space="preserve">
<value>文档</value>
</data>
<data name="ViewGuideStepEnvironment" xml:space="preserve">
<value>环境</value>
</data>
<data name="ViewGuideStepEnvironmentAfterInstallDescription" xml:space="preserve">
<value>安装完成后重启胡桃以查看是否正常生效</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription1" xml:space="preserve">
<value>如果上方的图标中存在乱码,请前往</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription2" xml:space="preserve">
<value>下载并自行安装图标字体</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description1" xml:space="preserve">
<value>若未检测到 WebView2 运行时信息,可以前往</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description2" xml:space="preserve">
<value>下载并自行安装运行时</value>
</data>
<data name="ViewGuideStepLanguage" xml:space="preserve">
<value>言語設定</value>
</data>
<data name="ViewGuideStepStaticResource" xml:space="preserve">
<value>资源</value>
</data>
<data name="ViewHutaoDatabaseHeader" xml:space="preserve">
<value>深境螺旋集計</value>
</data>
@@ -983,6 +1163,9 @@
<data name="ViewModelDailyNoteRegisterTaskFail" xml:space="preserve">
<value>注册计划任务失败,请使用管理员模式重试</value>
</data>
<data name="ViewModelDailyNoteRequestProgressTitle" xml:space="preserve">
<value>正在获取实时便笺信息,请稍候</value>
</data>
<data name="ViewModelExportSuccessMessage" xml:space="preserve">
<value>成功保存到指定位置</value>
</data>
@@ -1014,10 +1197,10 @@
<value>インポート失敗</value>
</data>
<data name="ViewModelGachaLogPredictedPullLeftToOrange" xml:space="preserve">
<value>{1:00.000%} 概率 {0} 抽后获得五星物品</value>
<value>{1:P3} 概率 {0} 抽后获得五星物品</value>
</data>
<data name="ViewModelGachaLogProbabilityOfNextPullIsOrange" xml:space="preserve">
<value>{0:00.000%} 概率下一抽获得五星物品</value>
<value>{0:P3} 概率下一抽获得五星物品</value>
</data>
<data name="ViewModelGachaLogRefreshFail" xml:space="preserve">
<value>祈願履歴を取得できません</value>
@@ -1037,6 +1220,21 @@
<data name="ViewModelGachaLogUploadToHutaoCloudProgress" xml:space="preserve">
<value>胡桃クラウドにアップロード中</value>
</data>
<data name="ViewModelGuideActionAgreement" xml:space="preserve">
<value>我已阅读并同意上方的条款</value>
</data>
<data name="ViewModelGuideActionComplete" xml:space="preserve">
<value>完成</value>
</data>
<data name="ViewModelGuideActionNext" xml:space="preserve">
<value>下一步</value>
</data>
<data name="ViewModelGuideActionStaticResourceBegin" xml:space="preserve">
<value>下载资源文件中,请稍候</value>
</data>
<data name="ViewModelHutaoPassportEmailNotValidHint" xml:space="preserve">
<value>请输入正确的邮箱</value>
</data>
<data name="ViewModelImportFromClipboardErrorTitle" xml:space="preserve">
<value>クリップボードのテキスト形式が正しくありません</value>
</data>
@@ -1187,6 +1385,9 @@
<data name="ViewPageAvatarPropertyRefreshFromHoyolabGameRecordDescription" xml:space="preserve">
<value>同步角色天赋外的大部分信息</value>
</data>
<data name="ViewPageAvatarPropertyRefreshTimeToggle" xml:space="preserve">
<value>刷新时间</value>
</data>
<data name="ViewPageAvatarPropertyScore" xml:space="preserve">
<value>評価する</value>
</data>
@@ -1271,6 +1472,18 @@
<data name="ViewPageDailyNoteResinDiscountUsed" xml:space="preserve">
<value>本周已消耗减半次数</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefresh" xml:space="preserve">
<value>自动刷新</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefreshDescription" xml:space="preserve">
<value>间隔选定的时间后刷新添加的实时便笺</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshElevatedHint" xml:space="preserve">
<value>这些选项仅允许在非管理员模式下更改</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshHeader" xml:space="preserve">
<value>刷新</value>
</data>
<data name="ViewPageDailyNoteSlientModeDescription" xml:space="preserve">
<value>プレイ中に通知をオフ</value>
</data>
@@ -1311,7 +1524,7 @@
<value>下载此 Uid 的云端存档</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription" xml:space="preserve">
<value>每期深渊首次上传可免费获得5天时长</value>
<value>每期深渊首次上传可免费获得 3 天时长</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityHeader" xml:space="preserve">
<value>螺旋の記録をアップロード</value>
@@ -1337,6 +1550,12 @@
<data name="ViewPageGachaLogRefreshAction" xml:space="preserve">
<value>フェッチ</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInput" xml:space="preserve">
<value>手动输入 Url</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInputDescription" xml:space="preserve">
<value>使用由你提供的 Url 刷新祈愿记录</value>
</data>
<data name="ViewPageGachaLogRefreshBySToken" xml:space="preserve">
<value>SToken 更新</value>
</data>
@@ -1685,6 +1904,18 @@
<data name="ViewPageSettingGameHeader" xml:space="preserve">
<value>ゲーム</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlAction" xml:space="preserve">
<value>配置</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlDescription" xml:space="preserve">
<value>配置当请求触发人机验证时使用的验证接口</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlHeader" xml:space="preserve">
<value>配置验证请求接口</value>
</data>
<data name="ViewPageSettingGeetestVerificationHeader" xml:space="preserve">
<value>无感验证</value>
</data>
<data name="ViewPageSettingHutaoPassportHeader" xml:space="preserve">
<value>胡桃アカウント</value>
</data>
@@ -1851,7 +2082,7 @@
<value>深境螺旋</value>
</data>
<data name="ViewSpiralAbyssMaxFloor" xml:space="preserve">
<value>最深抵达</value>
<value>最深到達</value>
</data>
<data name="ViewSpiralAbyssNormalSkill" xml:space="preserve">
<value>元素スキル</value>
@@ -1884,7 +2115,10 @@
<value>MiYouShe</value>
</data>
<data name="ViewUserCookieOperation2" xml:space="preserve">
<value>HoYoLab</value>
<value>HoYoLAB</value>
</data>
<data name="ViewUserCookieOperation3" xml:space="preserve">
<value>当前用户</value>
</data>
<data name="ViewUserCookieOperationLoginMihoyoUserAction" xml:space="preserve">
<value>ウェブ上でログイン</value>
@@ -1895,6 +2129,9 @@
<data name="ViewUserCookieOperationRefreshCookieAction" xml:space="preserve">
<value>Cookie 再取得</value>
</data>
<data name="ViewUserCookieOperationSignInRewardAction" xml:space="preserve">
<value>领取签到奖励</value>
</data>
<data name="ViewUserCopyCookieAction" xml:space="preserve">
<value>复制 Cookie</value>
</data>
@@ -1937,6 +2174,21 @@
<data name="ViewWikiWeaponHeader" xml:space="preserve">
<value>武器一覧</value>
</data>
<data name="WebAnnouncementMatchPermanentActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放</value>
</data>
<data name="WebAnnouncementMatchPersistentActivityTime" xml:space="preserve">
<value>〓活动时间〓.*?\d\.\d版本期间持续开放</value>
</data>
<data name="WebAnnouncementMatchTransientActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?~.*?&amp;lt;t class="t_(?:gl|lc)".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTime" xml:space="preserve">
<value>〓更新时间〓.+?&amp;lt;t class=\"t_(?:gl|lc)\".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTitle" xml:space="preserve">
<value>\d\.\d版本更新说明</value>
</data>
<data name="WebAnnouncementTimeDaysBeginFormat" xml:space="preserve">
<value>{0} 日後に開始</value>
</data>
@@ -1967,6 +2219,9 @@
<data name="WebDailyNoteHomeCoinRecoveryFormat" xml:space="preserve">
<value>あと{0}{1:HH:mm}に上限に達する</value>
</data>
<data name="WebDailyNoteHomeLocked" xml:space="preserve">
<value>尚未解锁洞天</value>
</data>
<data name="WebDailyNoteRecoveryTimeDay0" xml:space="preserve">
<value>今日</value>
</data>
@@ -1980,7 +2235,7 @@
<value>{0} 日</value>
</data>
<data name="WebDailyNoteResinRecoveryCompleted" xml:space="preserve">
<value>原粹树脂已完全恢复</value>
<value>天然樹脂は完全に回復した</value>
</data>
<data name="WebDailyNoteResinRecoveryFormat" xml:space="preserve">
<value>{0} {1:HH:mm} 後ですべて回復</value>
@@ -1997,6 +2252,12 @@
<data name="WebDailyNoteTransformerMinutesFormat" xml:space="preserve">
<value>{0} 分</value>
</data>
<data name="WebDailyNoteTransformerNotObtained" xml:space="preserve">
<value>尚未获得</value>
</data>
<data name="WebDailyNoteTransformerNotObtainedDetail" xml:space="preserve">
<value>尚未获得参量质变仪</value>
</data>
<data name="WebDailyNoteTransformerNotReached" xml:space="preserve">
<value>クールタイム中</value>
</data>
@@ -2051,4 +2312,10 @@
<data name="WebResponseFormat" xml:space="preserve">
<value>状态:{0} | 信息:{1}</value>
</data>
<data name="WebResponseRefreshCookieHintFormat" xml:space="preserve">
<value>请刷新 Cookie原始消息{0}</value>
</data>
<data name="WebResponseRequestExceptionFormat" xml:space="preserve">
<value>[{0}] 中的 [{1}] 网络请求异常,请稍后再试</value>
</data>
</root>

View File

@@ -60,45 +60,45 @@
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
@@ -153,6 +153,9 @@
<data name="ControlPanelPanelSelectorDropdownListName" xml:space="preserve">
<value>목록</value>
</data>
<data name="CoreExceptionServiceDatabaseCorruptedMessage" xml:space="preserve">
<value>数据库已损坏:{0}</value>
</data>
<data name="CoreExceptionServiceUserdataCorruptedMessage" xml:space="preserve">
<value>손상된 사용자 데이터: {0}</value>
</data>
@@ -183,6 +186,9 @@
<data name="FilePickerImportCommit" xml:space="preserve">
<value>가져오기</value>
</data>
<data name="GuideWindowTitle" xml:space="preserve">
<value>欢迎使用胡桃</value>
</data>
<data name="LaunchGameTitle" xml:space="preserve">
<value>계정 선택 및 시작</value>
</data>
@@ -231,9 +237,24 @@
<data name="ModelBindingUserInitializationFailed" xml:space="preserve">
<value>네트워크 오류</value>
</data>
<data name="ModelEntityDailyNoteNotRefreshed" xml:space="preserve">
<value>尚未刷新</value>
</data>
<data name="ModelEntityDailyNoteRefreshTimeFormat" xml:space="preserve">
<value>刷新于 {0:yyyy/MM/dd HH:mm:ss}</value>
</data>
<data name="ModelEntitySpiralAbyssScheduleFormat" xml:space="preserve">
<value>제 {0} 호</value>
</data>
<data name="ModelInterchangeUIGFItemTypeAvatar" xml:space="preserve">
<value>角色</value>
</data>
<data name="ModelInterchangeUIGFItemTypeUnknown" xml:space="preserve">
<value>未知</value>
</data>
<data name="ModelInterchangeUIGFItemTypeWeapon" xml:space="preserve">
<value>武器</value>
</data>
<data name="ModelIntrinsicAssociationTypeFatui" xml:space="preserve">
<value>우인단</value>
<comment>Need EXACT same string in game</comment>
@@ -351,6 +372,9 @@
<value>한손검</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataAvatarPlayerName" xml:space="preserve">
<value>旅行者</value>
</data>
<data name="ModelMetadataFetterInfoBirthdayFormat" xml:space="preserve">
<value>{0}월 {1}일</value>
</data>
@@ -506,6 +530,24 @@
<value>바람 원소 저항</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorNotRefreshed" xml:space="preserve">
<value>养成计算:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorRefreshTimeFormat" xml:space="preserve">
<value>养成计算:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordNotRefreshed" xml:space="preserve">
<value>我的角色:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordRefreshTimeFormat" xml:space="preserve">
<value>我的角色:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseNotRefreshed" xml:space="preserve">
<value>角色橱窗:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseRefreshTimeFormat" xml:space="preserve">
<value>角色橱窗:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceCultivationProjectCurrentUserdataCourrpted" xml:space="preserve">
<value>육성 계획 상태를 저장하지 못했습니다</value>
</data>
@@ -584,6 +626,9 @@
<data name="ServiceGachaLogHutaoCloudServiceNotAllowed" xml:space="preserve">
<value>기원 기록 업로드 불가능</value>
</data>
<data name="ServiceGachaLogUIGFImportItemInvalidFormat" xml:space="preserve">
<value>数据包含异常物品, Id{0}</value>
</data>
<data name="ServiceGachaLogUrlProviderAuthkeyRequestFailed" xml:space="preserve">
<value>인증키 요청 실패</value>
</data>
@@ -602,9 +647,15 @@
<data name="ServiceGachaLogUrlProviderStokenUnsupported" xml:space="preserve">
<value>HoYoLab 계정은 SToken을 이용한 기원 기록 동기화를 지원하지 않습니다.</value>
</data>
<data name="ServiceGachaLogUrlProviderUrlLanguageNotMatchCurrentLocale" xml:space="preserve">
<value>Url 中的语言:{0} 与胡桃的语言:{1} 不匹配,请切换到对应语言重试</value>
</data>
<data name="ServiceGachaStatisticsFactoryItemIdInvalid" xml:space="preserve">
<value>지원되지 않는 Item Id{0}</value>
</data>
<data name="ServiceGachaUIGFImportLanguageNotMatch" xml:space="preserve">
<value>UIGF 文件的语言:{0} 与胡桃的语言:{1} 不匹配,请切换到对应语言重试</value>
</data>
<data name="ServiceGameDetectGameAccountMultiMatched" xml:space="preserve">
<value>동일한 계정이 다수 있습니다. 중복된 계정을 삭제하세요</value>
</data>
@@ -614,6 +665,27 @@
<data name="ServiceGameFileOperationExceptionMessage" xml:space="preserve">
<value>게임 파일 작업 실패:{0}</value>
</data>
<data name="ServiceGameLaunchPhaseProcessExited" xml:space="preserve">
<value>游戏进程已退出</value>
</data>
<data name="ServiceGameLaunchPhaseProcessInitializing" xml:space="preserve">
<value>正在初始化游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseProcessStarted" xml:space="preserve">
<value>游戏进程已启动</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsFailed" xml:space="preserve">
<value>解锁帧率上限失败,正在结束游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsSucceed" xml:space="preserve">
<value>解锁帧率上限成功</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockingFps" xml:space="preserve">
<value>正在尝试解锁帧率上限</value>
</data>
<data name="ServiceGameLaunchPhaseWaitingProcessExit" xml:space="preserve">
<value>等待游戏进程退出</value>
</data>
<data name="ServiceGameLocatorFileOpenPickerCommitText" xml:space="preserve">
<value>게임 파일 선택</value>
</data>
@@ -623,6 +695,15 @@
<data name="ServiceGameLocatorUnityLogGamePathNotFound" xml:space="preserve">
<value>Unity 로그 파일에서 게임 경로를 찾을 수 없습니다</value>
</data>
<data name="ServiceGamePackageConvertMoveFileBackupFormat" xml:space="preserve">
<value>备份:{0}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRenameFormat" xml:space="preserve">
<value>重命名:{0} 到:{1}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRestoreFormat" xml:space="preserve">
<value>替换:{0}</value>
</data>
<data name="ServiceGamePackageRenameDataFolderFailed" xml:space="preserve">
<value>데이터 폴더 이름을 변경하지 못했습니다</value>
</data>
@@ -632,6 +713,9 @@
<data name="ServiceGamePackageRequestPackageVerionFailed" xml:space="preserve">
<value>Package Version을 가져오지 못했습니다</value>
</data>
<data name="ServiceGamePackageRequestScatteredFileFailed" xml:space="preserve">
<value>下载客户端文件失败:{0}</value>
</data>
<data name="ServiceGamePathLocateFailed" xml:space="preserve">
<value>게임 경로를 찾을 수 없습니다. 설정에서 수정하세요</value>
</data>
@@ -680,6 +764,15 @@
<data name="ServiceMetadataVersionNotSupported" xml:space="preserve">
<value>호두 버전이 낮습니다. 업데이트 해주세요</value>
</data>
<data name="ServiceSignInClaimRewardFailedFormat" xml:space="preserve">
<value>签到失败,{0}</value>
</data>
<data name="ServiceSignInRewardListRequestFailed" xml:space="preserve">
<value>获取奖励列表失败</value>
</data>
<data name="ServiceSignInSuccessRewardFormat" xml:space="preserve">
<value>签到成功,{0}×{1}</value>
</data>
<data name="ServiceUserCurrentMultiMatched" xml:space="preserve">
<value>여러 사용자가 선택되었습니다</value>
</data>
@@ -746,12 +839,27 @@
<data name="ViewControlStatisticsCardPurpleText" xml:space="preserve">
<value>4성</value>
</data>
<data name="ViewControlStatisticsCardToLastOrangeText" xml:space="preserve">
<value>距上个五星</value>
</data>
<data name="ViewControlStatisticsCardToLastPurpleText" xml:space="preserve">
<value>距上个四星</value>
</data>
<data name="ViewControlStatisticsCardUpAveragePullText" xml:space="preserve">
<value>UP 평균 획득</value>
</data>
<data name="ViewControlStatisticsCardUpText" xml:space="preserve">
<value>UP</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentPrediction" xml:space="preserve">
<value>预测</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentProportion" xml:space="preserve">
<value>比例</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentStatistics" xml:space="preserve">
<value>统计</value>
</data>
<data name="ViewCultivationHeader" xml:space="preserve">
<value>육성 계획</value>
</data>
@@ -800,6 +908,9 @@
<data name="ViewDialogDailyNoteNotificationExpeditionNotify" xml:space="preserve">
<value>탐색 파견 완료 알림</value>
</data>
<data name="ViewDialogDailyNoteNotificationHomeCoinNotifyThreshold" xml:space="preserve">
<value>洞天宝钱提醒阈值</value>
</data>
<data name="ViewDialogDailyNoteNotificationResinNotifyThreshold" xml:space="preserve">
<value>선계 화폐 한도 알림</value>
</data>
@@ -830,6 +941,33 @@
<data name="ViewDialogGachaLogUrlTitle" xml:space="preserve">
<value>수동 기원 기록 입력 Url</value>
</data>
<data name="ViewDialogGeetestCustomUrlCompositInputHint" xml:space="preserve">
<value>请输入请求接口的 Url 复合模板</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription1" xml:space="preserve">
<value>接口需要返回形如上方所示的 Json 数据,多余的数据会被忽略</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription2" xml:space="preserve">
<value>"code" 为 0 时,指示验证成功,其他的值均视为验证失败</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataHeader" xml:space="preserve">
<value>返回数据</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription1" xml:space="preserve">
<value>{0} 将在实际请求时替换为 gt</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription2" xml:space="preserve">
<value>{1} 将在实际请求时替换为 challenge</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription3" xml:space="preserve">
<value>将会通过 GET 方式对接口发送请求</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleHeader" xml:space="preserve">
<value>示例</value>
</data>
<data name="ViewDialogGeetestCustomUrlTitle" xml:space="preserve">
<value>配置无感验证接口</value>
</data>
<data name="ViewDialogImportExportApp" xml:space="preserve">
<value>앱 내보내기</value>
</data>
@@ -890,6 +1028,48 @@
<data name="ViewGachaLogHeader" xml:space="preserve">
<value>기원 기록</value>
</data>
<data name="ViewGuideStepAgreementIHaveReadText" xml:space="preserve">
<value>我已阅读并同意</value>
</data>
<data name="ViewGuideStepAgreementIssueReport" xml:space="preserve">
<value>问题报告方式与流程</value>
</data>
<data name="ViewGuideStepAgreementOpenSourceLicense" xml:space="preserve">
<value>Snap Hutao 开源许可</value>
</data>
<data name="ViewGuideStepAgreementPrivacyPolicy" xml:space="preserve">
<value>用户数据与隐私权益</value>
</data>
<data name="ViewGuideStepAgreementTermOfService" xml:space="preserve">
<value>用户使用协议与法律声明</value>
</data>
<data name="ViewGuideStepDocument" xml:space="preserve">
<value>文档</value>
</data>
<data name="ViewGuideStepEnvironment" xml:space="preserve">
<value>环境</value>
</data>
<data name="ViewGuideStepEnvironmentAfterInstallDescription" xml:space="preserve">
<value>安装完成后重启胡桃以查看是否正常生效</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription1" xml:space="preserve">
<value>如果上方的图标中存在乱码,请前往</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription2" xml:space="preserve">
<value>下载并自行安装图标字体</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description1" xml:space="preserve">
<value>若未检测到 WebView2 运行时信息,可以前往</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description2" xml:space="preserve">
<value>下载并自行安装运行时</value>
</data>
<data name="ViewGuideStepLanguage" xml:space="preserve">
<value>语言</value>
</data>
<data name="ViewGuideStepStaticResource" xml:space="preserve">
<value>资源</value>
</data>
<data name="ViewHutaoDatabaseHeader" xml:space="preserve">
<value>나선 비경 통계</value>
</data>
@@ -983,6 +1163,9 @@
<data name="ViewModelDailyNoteRegisterTaskFail" xml:space="preserve">
<value>작업 등록에 실패했습니다. 관리자 모드로 실행하세요</value>
</data>
<data name="ViewModelDailyNoteRequestProgressTitle" xml:space="preserve">
<value>正在获取实时便笺信息,请稍候</value>
</data>
<data name="ViewModelExportSuccessMessage" xml:space="preserve">
<value>성공적으로 저장되었습니다</value>
</data>
@@ -1014,10 +1197,10 @@
<value>가져오기 실패</value>
</data>
<data name="ViewModelGachaLogPredictedPullLeftToOrange" xml:space="preserve">
<value>{1:00.000%} 概率 {0} 抽后获得五星物品</value>
<value>{1:P3} 概率 {0} 抽后获得五星物品</value>
</data>
<data name="ViewModelGachaLogProbabilityOfNextPullIsOrange" xml:space="preserve">
<value>{0:00.000%} 概率下一抽获得五星物品</value>
<value>{0:P3} 概率下一抽获得五星物品</value>
</data>
<data name="ViewModelGachaLogRefreshFail" xml:space="preserve">
<value>기원 기록 동기화를 실패했습니다</value>
@@ -1037,6 +1220,21 @@
<data name="ViewModelGachaLogUploadToHutaoCloudProgress" xml:space="preserve">
<value>클라우드에 업로드</value>
</data>
<data name="ViewModelGuideActionAgreement" xml:space="preserve">
<value>我已阅读并同意上方的条款</value>
</data>
<data name="ViewModelGuideActionComplete" xml:space="preserve">
<value>完成</value>
</data>
<data name="ViewModelGuideActionNext" xml:space="preserve">
<value>下一步</value>
</data>
<data name="ViewModelGuideActionStaticResourceBegin" xml:space="preserve">
<value>下载资源文件中,请稍候</value>
</data>
<data name="ViewModelHutaoPassportEmailNotValidHint" xml:space="preserve">
<value>请输入正确的邮箱</value>
</data>
<data name="ViewModelImportFromClipboardErrorTitle" xml:space="preserve">
<value>클립보드의 텍스트 형식이 올바르지 않습니다</value>
</data>
@@ -1187,6 +1385,9 @@
<data name="ViewPageAvatarPropertyRefreshFromHoyolabGameRecordDescription" xml:space="preserve">
<value>캐릭터 특성을 제외한 대부분의 정보 동기화</value>
</data>
<data name="ViewPageAvatarPropertyRefreshTimeToggle" xml:space="preserve">
<value>刷新时间</value>
</data>
<data name="ViewPageAvatarPropertyScore" xml:space="preserve">
<value>점수</value>
</data>
@@ -1271,6 +1472,18 @@
<data name="ViewPageDailyNoteResinDiscountUsed" xml:space="preserve">
<value>이번 주는 이미 50% 차감 횟수를 소모했습니다</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefresh" xml:space="preserve">
<value>自动刷新</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefreshDescription" xml:space="preserve">
<value>间隔选定的时间后刷新添加的实时便笺</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshElevatedHint" xml:space="preserve">
<value>这些选项仅允许在非管理员模式下更改</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshHeader" xml:space="preserve">
<value>刷新</value>
</data>
<data name="ViewPageDailyNoteSlientModeDescription" xml:space="preserve">
<value>원신을 플레이 할 때 알리지 않음</value>
</data>
@@ -1311,7 +1524,7 @@
<value>이 UID 클라우드 아카이브 다운로드</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription" xml:space="preserve">
<value>每期深渊首次上传可免费获得5天时长</value>
<value>每期深渊首次上传可免费获得 3 天时长</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityHeader" xml:space="preserve">
<value>上传深渊记录</value>
@@ -1337,6 +1550,12 @@
<data name="ViewPageGachaLogRefreshAction" xml:space="preserve">
<value>가져오기</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInput" xml:space="preserve">
<value>手动输入 Url</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInputDescription" xml:space="preserve">
<value>使用由你提供的 Url 刷新祈愿记录</value>
</data>
<data name="ViewPageGachaLogRefreshBySToken" xml:space="preserve">
<value>SToken 동기화</value>
</data>
@@ -1685,6 +1904,18 @@
<data name="ViewPageSettingGameHeader" xml:space="preserve">
<value>게임</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlAction" xml:space="preserve">
<value>配置</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlDescription" xml:space="preserve">
<value>配置当请求触发人机验证时使用的验证接口</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlHeader" xml:space="preserve">
<value>配置验证请求接口</value>
</data>
<data name="ViewPageSettingGeetestVerificationHeader" xml:space="preserve">
<value>无感验证</value>
</data>
<data name="ViewPageSettingHutaoPassportHeader" xml:space="preserve">
<value>호두 계정</value>
</data>
@@ -1884,7 +2115,10 @@
<value>호요버스</value>
</data>
<data name="ViewUserCookieOperation2" xml:space="preserve">
<value>HoYoLab</value>
<value>HoYoLAB</value>
</data>
<data name="ViewUserCookieOperation3" xml:space="preserve">
<value>当前用户</value>
</data>
<data name="ViewUserCookieOperationLoginMihoyoUserAction" xml:space="preserve">
<value>웹 로그인</value>
@@ -1895,6 +2129,9 @@
<data name="ViewUserCookieOperationRefreshCookieAction" xml:space="preserve">
<value>Cookie 동기화</value>
</data>
<data name="ViewUserCookieOperationSignInRewardAction" xml:space="preserve">
<value>领取签到奖励</value>
</data>
<data name="ViewUserCopyCookieAction" xml:space="preserve">
<value>Cookie 복사</value>
</data>
@@ -1937,6 +2174,21 @@
<data name="ViewWikiWeaponHeader" xml:space="preserve">
<value>무기 자료</value>
</data>
<data name="WebAnnouncementMatchPermanentActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放</value>
</data>
<data name="WebAnnouncementMatchPersistentActivityTime" xml:space="preserve">
<value>〓活动时间〓.*?\d\.\d版本期间持续开放</value>
</data>
<data name="WebAnnouncementMatchTransientActivityTime" xml:space="preserve">
<value>(?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?~.*?&amp;lt;t class="t_(?:gl|lc)".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTime" xml:space="preserve">
<value>〓更新时间〓.+?&amp;lt;t class=\"t_(?:gl|lc)\".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTitle" xml:space="preserve">
<value>\d\.\d版本更新说明</value>
</data>
<data name="WebAnnouncementTimeDaysBeginFormat" xml:space="preserve">
<value>{0}일 후 시작</value>
</data>
@@ -1967,6 +2219,9 @@
<data name="WebDailyNoteHomeCoinRecoveryFormat" xml:space="preserve">
<value>预计 {0} {1:HH:mm} 达到存储上限</value>
</data>
<data name="WebDailyNoteHomeLocked" xml:space="preserve">
<value>尚未解锁洞天</value>
</data>
<data name="WebDailyNoteRecoveryTimeDay0" xml:space="preserve">
<value>오늘</value>
</data>
@@ -1997,6 +2252,12 @@
<data name="WebDailyNoteTransformerMinutesFormat" xml:space="preserve">
<value>{0}분</value>
</data>
<data name="WebDailyNoteTransformerNotObtained" xml:space="preserve">
<value>尚未获得</value>
</data>
<data name="WebDailyNoteTransformerNotObtainedDetail" xml:space="preserve">
<value>尚未获得参量质变仪</value>
</data>
<data name="WebDailyNoteTransformerNotReached" xml:space="preserve">
<value>쿨타임</value>
</data>
@@ -2051,4 +2312,10 @@
<data name="WebResponseFormat" xml:space="preserve">
<value>상태:{0} | 정보:{1}</value>
</data>
<data name="WebResponseRefreshCookieHintFormat" xml:space="preserve">
<value>请刷新 Cookie原始消息{0}</value>
</data>
<data name="WebResponseRequestExceptionFormat" xml:space="preserve">
<value>[{0}] 中的 [{1}] 网络请求异常,请稍后再试</value>
</data>
</root>

View File

@@ -665,6 +665,27 @@
<data name="ServiceGameFileOperationExceptionMessage" xml:space="preserve">
<value>游戏文件操作失败:{0}</value>
</data>
<data name="ServiceGameLaunchPhaseProcessExited" xml:space="preserve">
<value>游戏进程已退出</value>
</data>
<data name="ServiceGameLaunchPhaseProcessInitializing" xml:space="preserve">
<value>正在初始化游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseProcessStarted" xml:space="preserve">
<value>游戏进程已启动</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsFailed" xml:space="preserve">
<value>解锁帧率上限失败,正在结束游戏进程</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsSucceed" xml:space="preserve">
<value>解锁帧率上限成功</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockingFps" xml:space="preserve">
<value>正在尝试解锁帧率上限</value>
</data>
<data name="ServiceGameLaunchPhaseWaitingProcessExit" xml:space="preserve">
<value>等待游戏进程退出</value>
</data>
<data name="ServiceGameLocatorFileOpenPickerCommitText" xml:space="preserve">
<value>选择游戏本体</value>
</data>
@@ -830,6 +851,15 @@
<data name="ViewControlStatisticsCardUpText" xml:space="preserve">
<value>UP</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentPrediction" xml:space="preserve">
<value>预测</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentProportion" xml:space="preserve">
<value>比例</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentStatistics" xml:space="preserve">
<value>统计</value>
</data>
<data name="ViewCultivationHeader" xml:space="preserve">
<value>养成计划</value>
</data>
@@ -911,6 +941,33 @@
<data name="ViewDialogGachaLogUrlTitle" xml:space="preserve">
<value>手动输入祈愿记录 Url</value>
</data>
<data name="ViewDialogGeetestCustomUrlCompositInputHint" xml:space="preserve">
<value>请输入请求接口的 Url 复合模板</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription1" xml:space="preserve">
<value>接口需要返回形如上方所示的 Json 数据,多余的数据会被忽略</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription2" xml:space="preserve">
<value>"code" 为 0 时,指示验证成功,其他的值均视为验证失败</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataHeader" xml:space="preserve">
<value>返回数据</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription1" xml:space="preserve">
<value>{0} 将在实际请求时替换为 gt</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription2" xml:space="preserve">
<value>{1} 将在实际请求时替换为 challenge</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription3" xml:space="preserve">
<value>将会通过 GET 方式对接口发送请求</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleHeader" xml:space="preserve">
<value>示例</value>
</data>
<data name="ViewDialogGeetestCustomUrlTitle" xml:space="preserve">
<value>配置无感验证接口</value>
</data>
<data name="ViewDialogImportExportApp" xml:space="preserve">
<value>导出 App</value>
</data>
@@ -971,6 +1028,48 @@
<data name="ViewGachaLogHeader" xml:space="preserve">
<value>祈愿记录</value>
</data>
<data name="ViewGuideStepAgreementIHaveReadText" xml:space="preserve">
<value>我已阅读并同意</value>
</data>
<data name="ViewGuideStepAgreementIssueReport" xml:space="preserve">
<value>问题报告方式与流程</value>
</data>
<data name="ViewGuideStepAgreementOpenSourceLicense" xml:space="preserve">
<value>Snap Hutao 开源许可</value>
</data>
<data name="ViewGuideStepAgreementPrivacyPolicy" xml:space="preserve">
<value>用户数据与隐私权益</value>
</data>
<data name="ViewGuideStepAgreementTermOfService" xml:space="preserve">
<value>用户使用协议与法律声明</value>
</data>
<data name="ViewGuideStepDocument" xml:space="preserve">
<value>文档</value>
</data>
<data name="ViewGuideStepEnvironment" xml:space="preserve">
<value>环境</value>
</data>
<data name="ViewGuideStepEnvironmentAfterInstallDescription" xml:space="preserve">
<value>安装完成后重启胡桃以查看是否正常生效</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription1" xml:space="preserve">
<value>如果上方的图标中存在乱码,请前往</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription2" xml:space="preserve">
<value>下载并自行安装图标字体</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description1" xml:space="preserve">
<value>若未检测到 WebView2 运行时信息,可以前往</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description2" xml:space="preserve">
<value>下载并自行安装运行时</value>
</data>
<data name="ViewGuideStepLanguage" xml:space="preserve">
<value>语言</value>
</data>
<data name="ViewGuideStepStaticResource" xml:space="preserve">
<value>资源</value>
</data>
<data name="ViewHutaoDatabaseHeader" xml:space="preserve">
<value>深渊统计</value>
</data>
@@ -1098,10 +1197,10 @@
<value>导入失败</value>
</data>
<data name="ViewModelGachaLogPredictedPullLeftToOrange" xml:space="preserve">
<value>{1:00.000%} 概率 {0} 抽后获得五星物品</value>
<value>{1:P3} 概率 {0} 抽后获得五星物品</value>
</data>
<data name="ViewModelGachaLogProbabilityOfNextPullIsOrange" xml:space="preserve">
<value>{0:00.000%} 概率下一抽获得五星物品</value>
<value>{0:P3} 概率下一抽获得五星物品</value>
</data>
<data name="ViewModelGachaLogRefreshFail" xml:space="preserve">
<value>获取祈愿记录失败</value>
@@ -1121,6 +1220,18 @@
<data name="ViewModelGachaLogUploadToHutaoCloudProgress" xml:space="preserve">
<value>正在上传到胡桃云服务</value>
</data>
<data name="ViewModelGuideActionAgreement" xml:space="preserve">
<value>我已阅读并同意上方的条款</value>
</data>
<data name="ViewModelGuideActionComplete" xml:space="preserve">
<value>完成</value>
</data>
<data name="ViewModelGuideActionNext" xml:space="preserve">
<value>下一步</value>
</data>
<data name="ViewModelGuideActionStaticResourceBegin" xml:space="preserve">
<value>下载资源文件中,请稍候</value>
</data>
<data name="ViewModelHutaoPassportEmailNotValidHint" xml:space="preserve">
<value>请输入正确的邮箱</value>
</data>
@@ -1274,6 +1385,9 @@
<data name="ViewPageAvatarPropertyRefreshFromHoyolabGameRecordDescription" xml:space="preserve">
<value>同步角色天赋外的大部分信息</value>
</data>
<data name="ViewPageAvatarPropertyRefreshTimeToggle" xml:space="preserve">
<value>刷新时间</value>
</data>
<data name="ViewPageAvatarPropertyScore" xml:space="preserve">
<value>评分</value>
</data>
@@ -1410,7 +1524,7 @@
<value>下载此 Uid 的云端存档</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription" xml:space="preserve">
<value>每期深渊首次上传可免费获得5天时长</value>
<value>每期深渊首次上传可免费获得 3 天时长</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityHeader" xml:space="preserve">
<value>上传深渊记录</value>
@@ -1790,6 +1904,18 @@
<data name="ViewPageSettingGameHeader" xml:space="preserve">
<value>游戏</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlAction" xml:space="preserve">
<value>配置</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlDescription" xml:space="preserve">
<value>配置当请求触发人机验证时使用的验证接口</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlHeader" xml:space="preserve">
<value>配置验证请求接口</value>
</data>
<data name="ViewPageSettingGeetestVerificationHeader" xml:space="preserve">
<value>无感验证</value>
</data>
<data name="ViewPageSettingHutaoPassportHeader" xml:space="preserve">
<value>胡桃账号</value>
</data>

View File

@@ -60,45 +60,45 @@
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
@@ -153,6 +153,9 @@
<data name="ControlPanelPanelSelectorDropdownListName" xml:space="preserve">
<value>列表</value>
</data>
<data name="CoreExceptionServiceDatabaseCorruptedMessage" xml:space="preserve">
<value>資料庫已損壞:{0}</value>
</data>
<data name="CoreExceptionServiceUserdataCorruptedMessage" xml:space="preserve">
<value>用户數據已損壞:{0}</value>
</data>
@@ -183,6 +186,9 @@
<data name="FilePickerImportCommit" xml:space="preserve">
<value>匯入</value>
</data>
<data name="GuideWindowTitle" xml:space="preserve">
<value>歡迎使用胡桃</value>
</data>
<data name="LaunchGameTitle" xml:space="preserve">
<value>選擇賬號並啓動</value>
</data>
@@ -231,9 +237,24 @@
<data name="ModelBindingUserInitializationFailed" xml:space="preserve">
<value>網路連線錯誤</value>
</data>
<data name="ModelEntityDailyNoteNotRefreshed" xml:space="preserve">
<value>尚未刷新</value>
</data>
<data name="ModelEntityDailyNoteRefreshTimeFormat" xml:space="preserve">
<value>刷新於 {0:yyyy/MM/dd HH:mm:ss}</value>
</data>
<data name="ModelEntitySpiralAbyssScheduleFormat" xml:space="preserve">
<value>第 {0} 期</value>
</data>
<data name="ModelInterchangeUIGFItemTypeAvatar" xml:space="preserve">
<value>角色</value>
</data>
<data name="ModelInterchangeUIGFItemTypeUnknown" xml:space="preserve">
<value>未知</value>
</data>
<data name="ModelInterchangeUIGFItemTypeWeapon" xml:space="preserve">
<value>武器</value>
</data>
<data name="ModelIntrinsicAssociationTypeFatui" xml:space="preserve">
<value>愚人眾</value>
<comment>Need EXACT same string in game</comment>
@@ -351,6 +372,9 @@
<value>單手劍</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataAvatarPlayerName" xml:space="preserve">
<value>旅行者</value>
</data>
<data name="ModelMetadataFetterInfoBirthdayFormat" xml:space="preserve">
<value>{0} 月 {1} 日</value>
</data>
@@ -375,7 +399,7 @@
<comment>Need EXACT same string in game</comment>
</data>
<data name="ModelMetadataMaterialLocalSpecialtyRegex" xml:space="preserve">
<value>^[\u4e00-\u9fa5]{2}域特$</value>
<value>^[\u4e00-\u9fa5]{2}域特$</value>
<comment>If you don't know what is regex, DO NOT TRANSLATE THIS!</comment>
</data>
<data name="ModelMetadataMaterialWeaponAscensionMaterial" xml:space="preserve">
@@ -506,6 +530,24 @@
<value>風元素抗性</value>
<comment>Need EXACT same string in game</comment>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorNotRefreshed" xml:space="preserve">
<value>養成計算:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryCalculatorRefreshTimeFormat" xml:space="preserve">
<value>養成計算:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordNotRefreshed" xml:space="preserve">
<value>我的角色:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryGameRecordRefreshTimeFormat" xml:space="preserve">
<value>我的角色:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseNotRefreshed" xml:space="preserve">
<value>角色櫥窗:尚未刷新</value>
</data>
<data name="ServiceAvatarInfoSummaryShowcaseRefreshTimeFormat" xml:space="preserve">
<value>角色櫥窗:{0:MM-dd HH:mm}</value>
</data>
<data name="ServiceCultivationProjectCurrentUserdataCourrpted" xml:space="preserve">
<value>保存養成計劃狀態失敗</value>
</data>
@@ -584,6 +626,9 @@
<data name="ServiceGachaLogHutaoCloudServiceNotAllowed" xml:space="preserve">
<value>祈願記錄上傳服務不可用</value>
</data>
<data name="ServiceGachaLogUIGFImportItemInvalidFormat" xml:space="preserve">
<value>數據包含異常物品, Id{0}</value>
</data>
<data name="ServiceGachaLogUrlProviderAuthkeyRequestFailed" xml:space="preserve">
<value>請求驗證密鑰失敗</value>
</data>
@@ -602,9 +647,15 @@
<data name="ServiceGachaLogUrlProviderStokenUnsupported" xml:space="preserve">
<value>HoYoLAB 賬號不支持使用 SToken 刷新祈願記錄</value>
</data>
<data name="ServiceGachaLogUrlProviderUrlLanguageNotMatchCurrentLocale" xml:space="preserve">
<value>Url 中的語言:{0} 與胡桃的語言:{1} 不對應,請切換到對應語言重試</value>
</data>
<data name="ServiceGachaStatisticsFactoryItemIdInvalid" xml:space="preserve">
<value>不支持的 Item Id: {0}</value>
</data>
<data name="ServiceGachaUIGFImportLanguageNotMatch" xml:space="preserve">
<value>UIGF 文件的語言:{0} 與胡桃的語言:{1} 不對應,請切換到對應語言重試</value>
</data>
<data name="ServiceGameDetectGameAccountMultiMatched" xml:space="preserve">
<value>存在多個匹配賬號,請刪除重複的賬號</value>
</data>
@@ -614,15 +665,45 @@
<data name="ServiceGameFileOperationExceptionMessage" xml:space="preserve">
<value>遊戲檔案操作失敗:{0}</value>
</data>
<data name="ServiceGameLaunchPhaseProcessExited" xml:space="preserve">
<value>遊戲進程已退出</value>
</data>
<data name="ServiceGameLaunchPhaseProcessInitializing" xml:space="preserve">
<value>正在初始化遊戲進程</value>
</data>
<data name="ServiceGameLaunchPhaseProcessStarted" xml:space="preserve">
<value>遊戲進程已啟動</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsFailed" xml:space="preserve">
<value>解鎖幀率上限失敗,正在結束遊戲進程</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockFpsSucceed" xml:space="preserve">
<value>解鎖幀率上限成功</value>
</data>
<data name="ServiceGameLaunchPhaseUnlockingFps" xml:space="preserve">
<value>正在嘗試解鎖幀率上限</value>
</data>
<data name="ServiceGameLaunchPhaseWaitingProcessExit" xml:space="preserve">
<value>等待遊戲進程退出</value>
</data>
<data name="ServiceGameLocatorFileOpenPickerCommitText" xml:space="preserve">
<value>請選擇遊戲本體</value>
</data>
<data name="ServiceGameLocatorUnityLogFileNotFound" xml:space="preserve">
<value>找不到 Unity 日文件</value>
<value>找不到 Unity 日文件</value>
</data>
<data name="ServiceGameLocatorUnityLogGamePathNotFound" xml:space="preserve">
<value>在 Unity 日誌文件中無法找到遊戲路徑</value>
</data>
<data name="ServiceGamePackageConvertMoveFileBackupFormat" xml:space="preserve">
<value>備份:{0}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRenameFormat" xml:space="preserve">
<value>重命名:{0} 到:{1}</value>
</data>
<data name="ServiceGamePackageConvertMoveFileRestoreFormat" xml:space="preserve">
<value>替換:{0}</value>
</data>
<data name="ServiceGamePackageRenameDataFolderFailed" xml:space="preserve">
<value>重新命名資料文件夾名稱失敗</value>
</data>
@@ -632,6 +713,9 @@
<data name="ServiceGamePackageRequestPackageVerionFailed" xml:space="preserve">
<value>獲取 Package Version 失敗</value>
</data>
<data name="ServiceGamePackageRequestScatteredFileFailed" xml:space="preserve">
<value>下載客戶端文件失敗:{0}</value>
</data>
<data name="ServiceGamePathLocateFailed" xml:space="preserve">
<value>無法找到遊戲本體路徑,請前往設定修改</value>
</data>
@@ -680,6 +764,15 @@
<data name="ServiceMetadataVersionNotSupported" xml:space="preserve">
<value>你的胡桃版本過低,請盡快升級</value>
</data>
<data name="ServiceSignInClaimRewardFailedFormat" xml:space="preserve">
<value>簽到失敗,{0}</value>
</data>
<data name="ServiceSignInRewardListRequestFailed" xml:space="preserve">
<value>獲取獎勵列表失敗</value>
</data>
<data name="ServiceSignInSuccessRewardFormat" xml:space="preserve">
<value>遷到成功,{0}×{1}</value>
</data>
<data name="ServiceUserCurrentMultiMatched" xml:space="preserve">
<value>已选中多条用户记录</value>
</data>
@@ -746,12 +839,27 @@
<data name="ViewControlStatisticsCardPurpleText" xml:space="preserve">
<value>四星</value>
</data>
<data name="ViewControlStatisticsCardToLastOrangeText" xml:space="preserve">
<value>距上個五星</value>
</data>
<data name="ViewControlStatisticsCardToLastPurpleText" xml:space="preserve">
<value>距上個四星</value>
</data>
<data name="ViewControlStatisticsCardUpAveragePullText" xml:space="preserve">
<value>UP 平均抽數</value>
</data>
<data name="ViewControlStatisticsCardUpText" xml:space="preserve">
<value>UP</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentPrediction" xml:space="preserve">
<value>預測</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentProportion" xml:space="preserve">
<value>比例</value>
</data>
<data name="ViewControlStatisticsSegmentedItemContentStatistics" xml:space="preserve">
<value>統計</value>
</data>
<data name="ViewCultivationHeader" xml:space="preserve">
<value>養成計劃</value>
</data>
@@ -800,6 +908,9 @@
<data name="ViewDialogDailyNoteNotificationExpeditionNotify" xml:space="preserve">
<value>探索派遣完成提醒</value>
</data>
<data name="ViewDialogDailyNoteNotificationHomeCoinNotifyThreshold" xml:space="preserve">
<value>洞天寶錢提醒閥值</value>
</data>
<data name="ViewDialogDailyNoteNotificationResinNotifyThreshold" xml:space="preserve">
<value>洞天寶錢提醒閾值</value>
</data>
@@ -830,6 +941,33 @@
<data name="ViewDialogGachaLogUrlTitle" xml:space="preserve">
<value>手動輸入祈願記錄 Url</value>
</data>
<data name="ViewDialogGeetestCustomUrlCompositInputHint" xml:space="preserve">
<value>請輸入請求接口的 Url 複合模板</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription1" xml:space="preserve">
<value>接口需要返回形如上方所示的 Json 數據,多餘的數據會被忽略</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataDescription2" xml:space="preserve">
<value>"code" 為 0 時,指示驗證成功,其他的值均視為驗證失敗</value>
</data>
<data name="ViewDialogGeetestCustomUrlReturnDataHeader" xml:space="preserve">
<value>返回數據</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription1" xml:space="preserve">
<value>{0} 將在實際請求時替換為 gt</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription2" xml:space="preserve">
<value>{1} 將在實際請求時替換為 challenge</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleDescription3" xml:space="preserve">
<value>將會通過 GET 方式對接口發送請求</value>
</data>
<data name="ViewDialogGeetestCustomUrlSampleHeader" xml:space="preserve">
<value>示例</value>
</data>
<data name="ViewDialogGeetestCustomUrlTitle" xml:space="preserve">
<value>配置無感驗證接口</value>
</data>
<data name="ViewDialogImportExportApp" xml:space="preserve">
<value>匯出 App</value>
</data>
@@ -890,6 +1028,48 @@
<data name="ViewGachaLogHeader" xml:space="preserve">
<value>祈願記錄</value>
</data>
<data name="ViewGuideStepAgreementIHaveReadText" xml:space="preserve">
<value>我已閱讀並同意</value>
</data>
<data name="ViewGuideStepAgreementIssueReport" xml:space="preserve">
<value>問題報告方式與流程</value>
</data>
<data name="ViewGuideStepAgreementOpenSourceLicense" xml:space="preserve">
<value>Snap Hutao 開源許可</value>
</data>
<data name="ViewGuideStepAgreementPrivacyPolicy" xml:space="preserve">
<value>用戶數據與隱私權益</value>
</data>
<data name="ViewGuideStepAgreementTermOfService" xml:space="preserve">
<value>用戶使用協議與法律聲明</value>
</data>
<data name="ViewGuideStepDocument" xml:space="preserve">
<value>文檔</value>
</data>
<data name="ViewGuideStepEnvironment" xml:space="preserve">
<value>環境</value>
</data>
<data name="ViewGuideStepEnvironmentAfterInstallDescription" xml:space="preserve">
<value>安裝完成後重啟胡桃以查看是否正常生效</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription1" xml:space="preserve">
<value>如果上方的圖標中存在亂碼,請前往</value>
</data>
<data name="ViewGuideStepEnvironmentFontDescription2" xml:space="preserve">
<value>下載並自行安裝圖標字體</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description1" xml:space="preserve">
<value>若未檢測到 WebView2 Runtime信息可以前往</value>
</data>
<data name="ViewGuideStepEnvironmentWebView2Description2" xml:space="preserve">
<value>下載並自行安裝Runtime</value>
</data>
<data name="ViewGuideStepLanguage" xml:space="preserve">
<value>語言</value>
</data>
<data name="ViewGuideStepStaticResource" xml:space="preserve">
<value>資源</value>
</data>
<data name="ViewHutaoDatabaseHeader" xml:space="preserve">
<value>深淵統計</value>
</data>
@@ -983,6 +1163,9 @@
<data name="ViewModelDailyNoteRegisterTaskFail" xml:space="preserve">
<value>注冊計劃任務失敗,請以管理員模式重試</value>
</data>
<data name="ViewModelDailyNoteRequestProgressTitle" xml:space="preserve">
<value>正在獲取實時便箋信息,請稍候</value>
</data>
<data name="ViewModelExportSuccessMessage" xml:space="preserve">
<value>成功保存到指定位置</value>
</data>
@@ -1014,10 +1197,10 @@
<value>匯入失敗</value>
</data>
<data name="ViewModelGachaLogPredictedPullLeftToOrange" xml:space="preserve">
<value>{1:00.000%} 概率 {0} 抽后获得五星物品</value>
<value>{1:P3} 概率 {0} 抽後獲得五星物品</value>
</data>
<data name="ViewModelGachaLogProbabilityOfNextPullIsOrange" xml:space="preserve">
<value>{0:00.000%} 概率下一抽得五星物品</value>
<value>{0:P3} 概率下一抽得五星物品</value>
</data>
<data name="ViewModelGachaLogRefreshFail" xml:space="preserve">
<value>獲取祈願紀錄失敗</value>
@@ -1037,6 +1220,21 @@
<data name="ViewModelGachaLogUploadToHutaoCloudProgress" xml:space="preserve">
<value>正在上傳到胡桃雲服務</value>
</data>
<data name="ViewModelGuideActionAgreement" xml:space="preserve">
<value>我已閱讀並同意上方的條款</value>
</data>
<data name="ViewModelGuideActionComplete" xml:space="preserve">
<value>完成</value>
</data>
<data name="ViewModelGuideActionNext" xml:space="preserve">
<value>下一步</value>
</data>
<data name="ViewModelGuideActionStaticResourceBegin" xml:space="preserve">
<value>下載資源文件中,請稍候</value>
</data>
<data name="ViewModelHutaoPassportEmailNotValidHint" xml:space="preserve">
<value>請輸入正確的郵箱</value>
</data>
<data name="ViewModelImportFromClipboardErrorTitle" xml:space="preserve">
<value>剪貼板中的文本格式不正塙</value>
</data>
@@ -1187,6 +1385,9 @@
<data name="ViewPageAvatarPropertyRefreshFromHoyolabGameRecordDescription" xml:space="preserve">
<value>同步角色天賦外的大部分信息</value>
</data>
<data name="ViewPageAvatarPropertyRefreshTimeToggle" xml:space="preserve">
<value>刷新時間</value>
</data>
<data name="ViewPageAvatarPropertyScore" xml:space="preserve">
<value>評分</value>
</data>
@@ -1271,6 +1472,18 @@
<data name="ViewPageDailyNoteResinDiscountUsed" xml:space="preserve">
<value>本周已消耗減半次數</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefresh" xml:space="preserve">
<value>自動刷新</value>
</data>
<data name="ViewPageDailyNoteSettingAutoRefreshDescription" xml:space="preserve">
<value>間隔選定的時間後刷新添加的實時便箋</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshElevatedHint" xml:space="preserve">
<value>這些選項僅允許在非管理員模式下更改</value>
</data>
<data name="ViewPageDailyNoteSettingRefreshHeader" xml:space="preserve">
<value>刷新</value>
</data>
<data name="ViewPageDailyNoteSlientModeDescription" xml:space="preserve">
<value>在我游玩原神時不通知我</value>
</data>
@@ -1311,7 +1524,7 @@
<value>下載此UID的雲端存檔</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityDescription" xml:space="preserve">
<value>每期深淵首次上傳可免費獲得天時長</value>
<value>每期深淵首次上傳可免費獲得 3 天時長</value>
</data>
<data name="ViewPageGachaLogHutaoCloudSpiralAbyssActivityHeader" xml:space="preserve">
<value>上傳深淵紀錄</value>
@@ -1337,6 +1550,12 @@
<data name="ViewPageGachaLogRefreshAction" xml:space="preserve">
<value>獲取</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInput" xml:space="preserve">
<value>手動輸入 Url</value>
</data>
<data name="ViewPageGachaLogRefreshByManualInputDescription" xml:space="preserve">
<value>使用由你提供的 Url 刷新祈願記錄</value>
</data>
<data name="ViewPageGachaLogRefreshBySToken" xml:space="preserve">
<value>SToken 刷新</value>
</data>
@@ -1356,7 +1575,7 @@
<value>角色</value>
</data>
<data name="ViewPageGahcaLogPivotHistory" xml:space="preserve">
<value>史</value>
<value>史</value>
</data>
<data name="ViewPageGahcaLogPivotOverview" xml:space="preserve">
<value>總覽</value>
@@ -1656,7 +1875,7 @@
<value>直接刪除用戶表的所有記錄,用於修復特定的賬號衝突問題</value>
</data>
<data name="ViewPageSettingDeleteUserHeader" xml:space="preserve">
<value>除所有用</value>
<value>除所有用</value>
</data>
<data name="ViewPageSettingDeviceIdHeader" xml:space="preserve">
<value>裝置 ID</value>
@@ -1685,6 +1904,18 @@
<data name="ViewPageSettingGameHeader" xml:space="preserve">
<value>游戲</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlAction" xml:space="preserve">
<value>配置</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlDescription" xml:space="preserve">
<value>配置當請求觸發人機驗證時使用的驗證接口</value>
</data>
<data name="ViewPageSettingGeetestCustomUrlHeader" xml:space="preserve">
<value>配置驗證請求接口</value>
</data>
<data name="ViewPageSettingGeetestVerificationHeader" xml:space="preserve">
<value>無感驗證</value>
</data>
<data name="ViewPageSettingHutaoPassportHeader" xml:space="preserve">
<value>Snap Hutao 賬號</value>
</data>
@@ -1776,7 +2007,7 @@
<value>韓語 CV</value>
</data>
<data name="ViewPageWiKiAvatarMiscHeader" xml:space="preserve">
<value>其</value>
<value>其</value>
</data>
<data name="ViewPageWiKiAvatarOccupationNameTitle" xml:space="preserve">
<value>所屬</value>
@@ -1886,6 +2117,9 @@
<data name="ViewUserCookieOperation2" xml:space="preserve">
<value>HoYoLAB</value>
</data>
<data name="ViewUserCookieOperation3" xml:space="preserve">
<value>當前用戶</value>
</data>
<data name="ViewUserCookieOperationLoginMihoyoUserAction" xml:space="preserve">
<value>網頁登陸</value>
</data>
@@ -1895,6 +2129,9 @@
<data name="ViewUserCookieOperationRefreshCookieAction" xml:space="preserve">
<value>刷新 Cookie</value>
</data>
<data name="ViewUserCookieOperationSignInRewardAction" xml:space="preserve">
<value>領取簽到獎勵</value>
</data>
<data name="ViewUserCopyCookieAction" xml:space="preserve">
<value>拷貝 Cookie</value>
</data>
@@ -1937,6 +2174,21 @@
<data name="ViewWikiWeaponHeader" xml:space="preserve">
<value>武器資料</value>
</data>
<data name="WebAnnouncementMatchPermanentActivityTime" xml:space="preserve">
<value>(?:〓活動時間〓|〓任務開放時間〓).*?\d\.\d版本更新(?:完成|)後永久開放</value>
</data>
<data name="WebAnnouncementMatchPersistentActivityTime" xml:space="preserve">
<value>〓活動時間〓.*?\d\.\d版本期間持續開放</value>
</data>
<data name="WebAnnouncementMatchTransientActivityTime" xml:space="preserve">
<value>(?:〓活動時間〓|祈願時間|【上架時間】).*?(\d\.\d版本更新後|\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?~.*?&amp;lt;t class="t_(?:gl|lc)".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTime" xml:space="preserve">
<value>〓更新時間〓.+?&amp;lt;t class=\"t_(?:gl|lc)\".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;</value>
</data>
<data name="WebAnnouncementMatchVersionUpdateTitle" xml:space="preserve">
<value>\d\.\d版本更新說明</value>
</data>
<data name="WebAnnouncementTimeDaysBeginFormat" xml:space="preserve">
<value>{0} 天後開始</value>
</data>
@@ -1967,6 +2219,9 @@
<data name="WebDailyNoteHomeCoinRecoveryFormat" xml:space="preserve">
<value>預計 {0} {1:HH:mm} 達到存儲上限</value>
</data>
<data name="WebDailyNoteHomeLocked" xml:space="preserve">
<value>尚未解鎖洞天</value>
</data>
<data name="WebDailyNoteRecoveryTimeDay0" xml:space="preserve">
<value>今天</value>
</data>
@@ -1997,6 +2252,12 @@
<data name="WebDailyNoteTransformerMinutesFormat" xml:space="preserve">
<value>{0} 分</value>
</data>
<data name="WebDailyNoteTransformerNotObtained" xml:space="preserve">
<value>尚未獲得</value>
</data>
<data name="WebDailyNoteTransformerNotObtainedDetail" xml:space="preserve">
<value>尚未獲得參量質變儀</value>
</data>
<data name="WebDailyNoteTransformerNotReached" xml:space="preserve">
<value>冷卻中</value>
</data>
@@ -2051,4 +2312,10 @@
<data name="WebResponseFormat" xml:space="preserve">
<value>狀態:{0} | 信息:{1}</value>
</data>
<data name="WebResponseRefreshCookieHintFormat" xml:space="preserve">
<value>請刷新 Cookie原始消息{0}</value>
</data>
<data name="WebResponseRequestExceptionFormat" xml:space="preserve">
<value>[{0}] 中的 [{1}] 網路請求異常,請稍後再試</value>
</data>
</root>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 196 KiB

View File

@@ -16,5 +16,5 @@ internal interface IAnnouncementService
/// </summary>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>公告包装器</returns>
ValueTask<AnnouncementWrapper> GetAnnouncementsAsync(CancellationToken cancellationToken = default);
ValueTask<AnnouncementWrapper> GetAnnouncementWrapperAsync(CancellationToken cancellationToken = default);
}

View File

@@ -24,7 +24,7 @@ internal sealed partial class AnnouncementService : IAnnouncementService
private readonly IMemoryCache memoryCache;
/// <inheritdoc/>
public async ValueTask<AnnouncementWrapper> GetAnnouncementsAsync(CancellationToken cancellationToken = default)
public async ValueTask<AnnouncementWrapper> GetAnnouncementWrapperAsync(CancellationToken cancellationToken = default)
{
// 缓存中存在记录,直接返回
if (memoryCache.TryGetValue(CacheKey, out object? cache))

View File

@@ -38,6 +38,7 @@ internal sealed partial class AppOptions : DbStoreOptions
private BackdropType? backdropType;
private CultureInfo? currentCulture;
private bool? isAdvancedLaunchOptionsEnabled;
private string? geetestCustomCompositeUrl;
/// <summary>
/// 游戏路径
@@ -100,6 +101,12 @@ internal sealed partial class AppOptions : DbStoreOptions
set => SetOption(ref isAdvancedLaunchOptionsEnabled, SettingEntry.IsAdvancedLaunchOptionsEnabled, value);
}
public string GeetestCustomCompositeUrl
{
get => GetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl);
set => SetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl, value);
}
private static NameValue<string> ToNameValue(CultureInfo info)
{
return new(info.NativeName, info.Name);

View File

@@ -22,8 +22,6 @@ namespace Snap.Hutao.Service.AvatarInfo.Factory;
[HighQuality]
internal sealed class SummaryAvatarFactory
{
private static readonly DateTimeOffset DefaultRefreshTime = new(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0));
private readonly ModelAvatarInfo avatarInfo;
private readonly DateTimeOffset showcaseRefreshTime;
private readonly DateTimeOffset gameRecordRefreshTime;

View File

@@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore;
using Snap.Hutao.Core.Database;
using Snap.Hutao.Model.Entity;
using Snap.Hutao.Model.Entity.Database;
using System.Collections.ObjectModel;
namespace Snap.Hutao.Service.Cultivation;
@@ -153,4 +154,13 @@ internal sealed partial class CultivationDbService : ICultivationDbService
.ConfigureAwait(false);
}
}
public ObservableCollection<CultivateProject> GetCultivateProjectCollection()
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
return appDbContext.CultivateProjects.AsNoTracking().ToObservableCollection();
}
}
}

View File

@@ -29,12 +29,7 @@ internal sealed partial class CultivationService
{
if (projects is null)
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
projects = appDbContext.CultivateProjects.ToObservableCollection();
}
projects = cultivationDbService.GetCultivateProjectCollection();
Current ??= projects.SelectedOrDefault();
}

View File

@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using Snap.Hutao.Model.Entity;
using System.Collections.ObjectModel;
namespace Snap.Hutao.Service.Cultivation;
@@ -21,6 +22,8 @@ internal interface ICultivationDbService
ValueTask<List<CultivateItem>> GetCultivateItemListByEntryIdAsync(Guid entryId);
ObservableCollection<CultivateProject> GetCultivateProjectCollection();
List<InventoryItem> GetInventoryItemListByProjectId(Guid projectId);
ValueTask<List<InventoryItem>> GetInventoryItemListByProjectIdAsync(Guid projectId);

View File

@@ -1,23 +1,27 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Snap.Hutao.Core;
using Snap.Hutao.Core.Shell;
using Snap.Hutao.Model;
using Snap.Hutao.Model.Entity;
using Snap.Hutao.Service.Abstraction;
using Snap.Hutao.Service.Notification;
using System.Globalization;
using System.Runtime.CompilerServices;
namespace Snap.Hutao.Service.DailyNote;
/// <summary>
/// 实时便笺选项
/// </summary>
[ConstructorGenerated(CallBaseConstructor = true)]
[Injection(InjectAs.Singleton)]
internal sealed class DailyNoteOptions : DbStoreOptions
internal sealed partial class DailyNoteOptions : DbStoreOptions
{
private const int OneMinute = 60;
private readonly RuntimeOptions runtimeOptions;
private readonly IServiceProvider serviceProvider;
private readonly IScheduleTaskInterop scheduleTaskInterop;
@@ -25,17 +29,6 @@ internal sealed class DailyNoteOptions : DbStoreOptions
private bool? isReminderNotification;
private bool? isSilentWhenPlayingGame;
/// <summary>
/// 构造一个新的实时便笺选项
/// </summary>
/// <param name="serviceProvider">服务提供器</param>
public DailyNoteOptions(IServiceProvider serviceProvider)
: base(serviceProvider)
{
scheduleTaskInterop = serviceProvider.GetRequiredService<IScheduleTaskInterop>();
this.serviceProvider = serviceProvider;
}
/// <summary>
/// 刷新时间
/// </summary>
@@ -53,6 +46,12 @@ internal sealed class DailyNoteOptions : DbStoreOptions
get => scheduleTaskInterop.IsDailyNoteRefreshEnabled();
set
{
if (runtimeOptions.IsElevated)
{
// leave below untouched if we are running in elevated privilege
return;
}
if (value)
{
if (SelectedRefreshTime is not null)
@@ -74,9 +73,25 @@ internal sealed class DailyNoteOptions : DbStoreOptions
/// </summary>
public NameValue<int>? SelectedRefreshTime
{
get => GetOption(ref selectedRefreshTime, SettingEntry.DailyNoteRefreshSeconds, time => RefreshTimes.Single(t => t.Value == int.Parse(time, CultureInfo.InvariantCulture)), RefreshTimes[1]);
get
{
if (runtimeOptions.IsElevated)
{
// leave below untouched if we are running in elevated privilege
return null;
}
return GetOption(ref selectedRefreshTime, SettingEntry.DailyNoteRefreshSeconds, time => RefreshTimes.Single(t => t.Value == int.Parse(time, CultureInfo.InvariantCulture)), RefreshTimes[1]);
}
set
{
if (runtimeOptions.IsElevated)
{
// leave below untouched if we are running in elevated privilege
return;
}
if (value is not null)
{
if (scheduleTaskInterop.RegisterForDailyNoteRefresh(value.Value))

View File

@@ -125,13 +125,21 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient<U
{
WebDailyNote dailyNote = dailyNoteResponse.Data;
// 发送通知
await dailyNoteNotificationOperation.SendAsync(entry).ConfigureAwait(false);
// 集合内的实时便笺与数据库取出的非同一个对象,需要分别更新
// cache
await taskContext.SwitchToMainThreadAsync();
entries?.SingleOrDefault(e => e.UserId == entry.UserId && e.Uid == entry.Uid)?.UpdateDailyNote(dailyNote);
// 发送通知
await dailyNoteNotificationOperation.SendAsync(entry).ConfigureAwait(false);
if (entries?.SingleOrDefault(e => e.UserId == entry.UserId && e.Uid == entry.Uid) is { } cachedEntry)
{
cachedEntry.UpdateDailyNote(dailyNote);
cachedEntry.ResinNotifySuppressed = entry.ResinNotifySuppressed;
cachedEntry.HomeCoinNotifySuppressed = entry.HomeCoinNotifySuppressed;
cachedEntry.TransformerNotifySuppressed = entry.TransformerNotifySuppressed;
cachedEntry.DailyTaskNotifySuppressed = entry.DailyTaskNotifySuppressed;
cachedEntry.ExpeditionNotifySuppressed = entry.ExpeditionNotifySuppressed;
}
// database
entry.UpdateDailyNote(dailyNote);

View File

@@ -230,7 +230,7 @@ internal sealed partial class GameService : IGameService
}
/// <inheritdoc/>
public async ValueTask LaunchAsync()
public async ValueTask LaunchAsync(IProgress<LaunchStatus> progress)
{
if (IsGameRunning())
{
@@ -240,21 +240,37 @@ internal sealed partial class GameService : IGameService
string gamePath = appOptions.GamePath;
ArgumentException.ThrowIfNullOrEmpty(gamePath);
progress.Report(new(LaunchPhase.ProcessInitializing, SH.ServiceGameLaunchPhaseProcessInitializing));
using (Process game = ProcessInterop.InitializeGameProcess(launchOptions, gamePath))
{
try
{
bool isFirstInstance = Interlocked.Increment(ref runningGamesCounter) == 1;
game.Start();
progress.Report(new(LaunchPhase.ProcessStarted, SH.ServiceGameLaunchPhaseProcessStarted));
if (runtimeOptions.IsElevated && appOptions.IsAdvancedLaunchOptionsEnabled && launchOptions.UnlockFps)
{
await ProcessInterop.UnlockFpsAsync(serviceProvider, game, default).ConfigureAwait(false);
progress.Report(new(LaunchPhase.UnlockingFps, SH.ServiceGameLaunchPhaseUnlockingFps));
try
{
await ProcessInterop.UnlockFpsAsync(serviceProvider, game, progress).ConfigureAwait(false);
}
catch (InvalidOperationException)
{
// The Unlocker can't unlock the process
game.Kill();
throw;
}
finally
{
progress.Report(new(LaunchPhase.ProcessExited, SH.ServiceGameLaunchPhaseProcessExited));
}
}
else
{
progress.Report(new(LaunchPhase.WaitingForExit, SH.ServiceGameLaunchPhaseWaitingProcessExit));
await game.WaitForExitAsync().ConfigureAwait(false);
progress.Report(new(LaunchPhase.ProcessExited, SH.ServiceGameLaunchPhaseProcessExited));
}
}
finally

View File

@@ -50,11 +50,7 @@ internal interface IGameService
/// <returns>是否正在运行</returns>
bool IsGameRunning();
/// <summary>
/// 异步启动
/// </summary>
/// <returns>任务</returns>
ValueTask LaunchAsync();
ValueTask LaunchAsync(IProgress<LaunchStatus> progress);
/// <summary>
/// 异步修改游戏账号名称

View File

@@ -0,0 +1,15 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Service.Game;
internal enum LaunchPhase
{
ProcessInitializing,
ProcessStarted,
UnlockingFps,
UnlockFpsSucceed,
UnlockFpsFailed,
WaitingForExit,
ProcessExited,
}

View File

@@ -0,0 +1,31 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Snap.Hutao.Core;
using Snap.Hutao.Core.ExceptionService;
using Snap.Hutao.Core.IO.Ini;
using Snap.Hutao.Model.Entity;
using Snap.Hutao.Service.Game.Locator;
using Snap.Hutao.Service.Game.Package;
using Snap.Hutao.View.Dialog;
using Snap.Hutao.Web.Hoyolab.SdkStatic.Hk4e.Launcher;
using Snap.Hutao.Web.Response;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using static Snap.Hutao.Service.Game.GameConstants;
namespace Snap.Hutao.Service.Game;
internal sealed class LaunchStatus
{
public LaunchStatus(LaunchPhase phase, string description)
{
Phase = phase;
Description = description;
}
public LaunchPhase Phase { get; set; }
public string Description { get; set; }
}

View File

@@ -0,0 +1,14 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using CommunityToolkit.Mvvm.ComponentModel;
namespace Snap.Hutao.Service.Game;
[Injection(InjectAs.Singleton)]
internal sealed class LaunchStatusOptions : ObservableObject
{
private LaunchStatus? launchStatus;
public LaunchStatus? LaunchStatus { get => launchStatus; set => SetProperty(ref launchStatus, value); }
}

View File

@@ -49,19 +49,12 @@ internal static class ProcessInterop
};
}
/// <summary>
/// 解锁帧率
/// </summary>
/// <param name="serviceProvider">服务提供器</param>
/// <param name="game">游戏进程</param>
/// <param name="token">取消令牌</param>
/// <returns>任务</returns>
public static ValueTask UnlockFpsAsync(IServiceProvider serviceProvider, Process game, CancellationToken token)
public static ValueTask UnlockFpsAsync(IServiceProvider serviceProvider, Process game, IProgress<LaunchStatus> progress, CancellationToken token = default)
{
IGameFpsUnlocker unlocker = serviceProvider.CreateInstance<GameFpsUnlocker>(game);
UnlockTimingOptions options = new(100, 20000, 3000);
Progress<UnlockerStatus> progress = new(); // TODO: do something.
return unlocker.UnlockAsync(options, progress, token);
Progress<UnlockerStatus> lockerProgress = new(unlockStatus => progress.Report(FromUnlockStatus(unlockStatus)));
return unlocker.UnlockAsync(options, lockerProgress, token);
}
/// <summary>
@@ -92,8 +85,7 @@ internal static class ProcessInterop
/// </summary>
/// <param name="hProcess">进程句柄</param>
/// <param name="libraryPathu8">库的路径,不包含'\0'</param>
[SuppressMessage("", "SH002")]
public static unsafe void LoadLibraryAndInject(HANDLE hProcess, ReadOnlySpan<byte> libraryPathu8)
public static unsafe void LoadLibraryAndInject(in HANDLE hProcess, in ReadOnlySpan<byte> libraryPathu8)
{
HINSTANCE hKernelDll = GetModuleHandle("kernel32.dll");
Marshal.ThrowExceptionForHR(Marshal.GetLastPInvokeError());
@@ -132,8 +124,7 @@ internal static class ProcessInterop
}
}
[SuppressMessage("", "SH002")]
private static unsafe FARPROC GetProcAddress(HINSTANCE hModule, ReadOnlySpan<byte> lpProcName)
private static unsafe FARPROC GetProcAddress(in HINSTANCE hModule, in ReadOnlySpan<byte> lpProcName)
{
fixed (byte* lpProcNameLocal = lpProcName)
{
@@ -141,12 +132,23 @@ internal static class ProcessInterop
}
}
[SuppressMessage("", "SH002")]
private static unsafe BOOL WriteProcessMemory(HANDLE hProcess, void* lpBaseAddress, ReadOnlySpan<byte> buffer)
private static unsafe BOOL WriteProcessMemory(in HANDLE hProcess, void* lpBaseAddress, in ReadOnlySpan<byte> buffer)
{
fixed (void* lpBuffer = buffer)
{
return Windows.Win32.PInvoke.WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, unchecked((uint)buffer.Length));
}
}
private static LaunchStatus FromUnlockStatus(UnlockerStatus unlockerStatus)
{
if (unlockerStatus.FindModuleState == FindModuleResult.Ok)
{
return new(LaunchPhase.UnlockFpsSucceed, SH.ServiceGameLaunchPhaseUnlockFpsSucceed);
}
else
{
return new(LaunchPhase.UnlockFpsFailed, SH.ServiceGameLaunchPhaseUnlockFpsFailed);
}
}
}

View File

@@ -50,6 +50,7 @@ internal sealed class GameFpsUnlocker : IGameFpsUnlocker
// Read UnityPlayer.dll
UnsafeFindFpsAddress(moduleEntryInfo);
progress.Report(status);
// When player switch between scenes, we have to re adjust the fps
// So we keep a loop here

View File

@@ -8,7 +8,7 @@ namespace Snap.Hutao.Service.Game.Unlocker;
/// <summary>
/// 解锁状态
/// </summary>
internal sealed class UnlockerStatus : ICloneable<UnlockerStatus>
internal sealed class UnlockerStatus
{
/// <summary>
/// 状态描述
@@ -29,9 +29,4 @@ internal sealed class UnlockerStatus : ICloneable<UnlockerStatus>
/// FPS 字节地址
/// </summary>
public nuint FpsAddress { get; set; }
public UnlockerStatus Clone()
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,69 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using CommunityToolkit.Mvvm.Input;
using Snap.Hutao.Core.Setting;
using Snap.Hutao.Web.Hutao.HutaoAsAService;
using Snap.Hutao.Web.Response;
using System.Collections.ObjectModel;
using System.Globalization;
using Windows.Storage;
using HutaoAnnouncement = Snap.Hutao.Web.Hutao.HutaoAsAService.Announcement;
namespace Snap.Hutao.Service.Hutao;
[ConstructorGenerated]
[Injection(InjectAs.Scoped, typeof(IHutaoAsAService))]
internal sealed partial class HutaoAsAService : IHutaoAsAService
{
private const int AnnouncementDuration = 30;
private readonly HutaoAsAServiceClient hutaoAsServiceClient;
private ObservableCollection<HutaoAnnouncement>? announcements;
public async ValueTask<ObservableCollection<HutaoAnnouncement>> GetHutaoAnnouncementCollectionAsync(CancellationToken token = default)
{
if (announcements is null)
{
RelayCommand<HutaoAnnouncement> dismissCommand = new(DismissAnnouncement);
ApplicationDataCompositeValue excludedIds = LocalSetting.Get(SettingKeys.ExcludedAnnouncementIds, new ApplicationDataCompositeValue());
List<long> data = excludedIds.Select(kvp => long.Parse(kvp.Key, CultureInfo.InvariantCulture)).ToList();
Response<List<HutaoAnnouncement>> respose = await hutaoAsServiceClient.GetAnnouncementListAsync(data, token).ConfigureAwait(false);
if (respose.IsOk())
{
List<HutaoAnnouncement> list = respose.Data;
list.ForEach(item => item.DismissCommand = dismissCommand);
announcements = list.ToObservableCollection();
}
else
{
return new();
}
}
return announcements;
}
private void DismissAnnouncement(HutaoAnnouncement? announcement)
{
if (announcement is not null && announcements is not null)
{
ApplicationDataCompositeValue excludedIds = LocalSetting.Get(SettingKeys.ExcludedAnnouncementIds, new ApplicationDataCompositeValue());
foreach ((string key, object value) in excludedIds)
{
if (value is DateTimeOffset time && time < DateTimeOffset.Now - TimeSpan.FromDays(AnnouncementDuration))
{
excludedIds.Remove(key);
}
}
excludedIds.TryAdd($"{announcement.Id}", DateTimeOffset.Now + TimeSpan.FromDays(AnnouncementDuration));
LocalSetting.Set(SettingKeys.ExcludedAnnouncementIds, excludedIds);
announcements.Remove(announcement);
}
}
}

View File

@@ -143,7 +143,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<AvatarCollocation> avatarCollocationsRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
avatarCollocationsRaw = await hutaoService.GetAvatarCollocationsAsync().ConfigureAwait(false);
}
@@ -161,7 +161,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<WeaponCollocation> weaponCollocationsRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
weaponCollocationsRaw = await hutaoService.GetWeaponCollocationsAsync().ConfigureAwait(false);
}
@@ -178,7 +178,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<AvatarAppearanceRank> avatarAppearanceRanksRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
avatarAppearanceRanksRaw = await hutaoService.GetAvatarAppearanceRanksAsync().ConfigureAwait(false);
}
@@ -195,7 +195,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<AvatarUsageRank> avatarUsageRanksRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
avatarUsageRanksRaw = await hutaoService.GetAvatarUsageRanksAsync().ConfigureAwait(false);
}
@@ -212,7 +212,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<AvatarConstellationInfo> avatarConstellationInfosRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
avatarConstellationInfosRaw = await hutaoService.GetAvatarConstellationInfosAsync().ConfigureAwait(false);
}
@@ -228,7 +228,7 @@ internal sealed partial class HutaoCache : IHutaoCache
List<TeamAppearance> teamAppearancesRaw;
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
teamAppearancesRaw = await hutaoService.GetTeamAppearancesAsync().ConfigureAwait(false);
}
@@ -240,7 +240,7 @@ internal sealed partial class HutaoCache : IHutaoCache
{
using (IServiceScope scope = serviceProvider.CreateScope())
{
IHutaoService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoService>();
IHutaoSpiralAbyssService hutaoService = scope.ServiceProvider.GetRequiredService<IHutaoSpiralAbyssService>();
Overview = await hutaoService.GetOverviewAsync().ConfigureAwait(false);
}
}

View File

@@ -12,8 +12,8 @@ namespace Snap.Hutao.Service.Hutao;
/// </summary>
[HighQuality]
[ConstructorGenerated]
[Injection(InjectAs.Scoped, typeof(IHutaoService))]
internal sealed partial class HutaoService : IHutaoService
[Injection(InjectAs.Scoped, typeof(IHutaoSpiralAbyssService))]
internal sealed partial class HutaoSpiralAbyssService : IHutaoSpiralAbyssService
{
private readonly TimeSpan cacheExpireTime = TimeSpan.FromHours(4);
@@ -67,7 +67,7 @@ internal sealed partial class HutaoService : IHutaoService
private async ValueTask<T> FromCacheOrWebAsync<T>(string typeName, Func<CancellationToken, ValueTask<Response<T>>> taskFunc)
where T : class, new()
{
string key = $"{nameof(HutaoService)}.Cache.{typeName}";
string key = $"{nameof(HutaoSpiralAbyssService)}.Cache.{typeName}";
if (memoryCache.TryGetValue(key, out object? cache))
{
T? t = cache as T;

View File

@@ -3,7 +3,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.Options;
using Snap.Hutao.Web.Hutao.SpiralAbyss;
using Snap.Hutao.Web.Hutao;
using System.Text.RegularExpressions;
namespace Snap.Hutao.Service.Hutao;
@@ -21,6 +21,7 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions<HutaoUserOpt
private bool isHutaoCloudServiceAllowed;
private bool isLicensedDeveloper;
private string? gachaLogExpireAt;
private bool isMaintainer;
/// <summary>
/// 用户名
@@ -47,6 +48,8 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions<HutaoUserOpt
/// </summary>
public bool IsLicensedDeveloper { get => isLicensedDeveloper; set => SetProperty(ref isLicensedDeveloper, value); }
public bool IsMaintainer { get => isMaintainer; set => SetProperty(ref isMaintainer, value); }
/// <summary>
/// 祈愿记录服务到期时间
/// </summary>
@@ -89,6 +92,7 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions<HutaoUserOpt
public void UpdateUserInfo(UserInfo userInfo)
{
IsLicensedDeveloper = userInfo.IsLicensedDeveloper;
IsMaintainer = userInfo.IsMaintainer;
GachaLogExpireAt = Regex.Unescape(SH.ServiceHutaoUserGachaLogExpiredAt).Format(userInfo.GachaLogExpireAt);
IsCloudServiceAllowed = IsLicensedDeveloper || userInfo.GachaLogExpireAt > DateTimeOffset.Now;
}

View File

@@ -0,0 +1,12 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Snap.Hutao.Web.Hutao.HutaoAsAService;
using System.Collections.ObjectModel;
namespace Snap.Hutao.Service.Hutao;
internal interface IHutaoAsAService
{
ValueTask<ObservableCollection<Announcement>> GetHutaoAnnouncementCollectionAsync(CancellationToken token = default);
}

View File

@@ -9,7 +9,7 @@ namespace Snap.Hutao.Service.Hutao;
/// 胡桃 API 服务
/// </summary>
[HighQuality]
internal interface IHutaoService
internal interface IHutaoSpiralAbyssService
{
/// <summary>
/// 异步获取角色上场率

View File

@@ -83,25 +83,11 @@
<None Remove="Resource\Font\MiSans-Regular.ttf" />
<None Remove="Resource\HutaoIconSourceTransparentBackgroundGradient1.png" />
<None Remove="Resource\Icon\UI_AchievementIcon_3_3.png" />
<None Remove="Resource\Icon\UI_BagTabIcon_Avatar.png" />
<None Remove="Resource\Icon\UI_BagTabIcon_Weapon.png" />
<None Remove="Resource\Icon\UI_BtnIcon_ActivityEntry.png" />
<None Remove="Resource\Icon\UI_BtnIcon_Gacha.png" />
<None Remove="Resource\Icon\UI_ChapterIcon_Hutao.png" />
<None Remove="Resource\Icon\UI_GachaShowPanel_Bg_Weapon.png" />
<None Remove="Resource\Icon\UI_GuideIcon_PlayMethod.png" />
<None Remove="Resource\Icon\UI_HomeWorldTabIcon_2_Team.png" />
<None Remove="Resource\Icon\UI_Icon_Achievement.png" />
<None Remove="Resource\Icon\UI_Icon_BoostUp.png" />
<None Remove="Resource\Icon\UI_Icon_Fetter.png" />
<None Remove="Resource\Icon\UI_Icon_Locked.png" />
<None Remove="Resource\Icon\UI_Icon_None.png" />
<None Remove="Resource\Icon\UI_Icon_Tower_Star.png" />
<None Remove="Resource\Icon\UI_ItemIcon_201.png" />
<None Remove="Resource\Icon\UI_ItemIcon_210.png" />
<None Remove="Resource\Icon\UI_MarkCustom_TagMonster.png" />
<None Remove="Resource\Icon\UI_MarkTower.png" />
<None Remove="Resource\Icon\UI_MarkTower_Tower.png" />
<None Remove="Resource\Navigation\Achievement.png" />
<None Remove="Resource\Navigation\Announcement.png" />
<None Remove="Resource\Navigation\AvatarProperty.png" />
@@ -133,6 +119,7 @@
<None Remove="View\Control\LoadingViewSlim.xaml" />
<None Remove="View\Control\SkillPivot.xaml" />
<None Remove="View\Control\StatisticsCard.xaml" />
<None Remove="View\Control\StatisticsSegmented.xaml" />
<None Remove="View\Control\Webview2Viewer.xaml" />
<None Remove="View\Dialog\AchievementArchiveCreateDialog.xaml" />
<None Remove="View\Dialog\AchievementImportDialog.xaml" />
@@ -142,6 +129,7 @@
<None Remove="View\Dialog\GachaLogImportDialog.xaml" />
<None Remove="View\Dialog\GachaLogRefreshProgressDialog.xaml" />
<None Remove="View\Dialog\GachaLogUrlDialog.xaml" />
<None Remove="View\Dialog\GeetestCustomUrlDialog.xaml" />
<None Remove="View\Dialog\LaunchGameAccountNameDialog.xaml" />
<None Remove="View\Dialog\LaunchGamePackageConvertDialog.xaml" />
<None Remove="View\Dialog\SignInWebViewDialog.xaml" />
@@ -168,7 +156,6 @@
<None Remove="View\Page\WikiWeaponPage.xaml" />
<None Remove="View\TitleView.xaml" />
<None Remove="View\UserView.xaml" />
<None Remove="View\WelcomeView.xaml" />
</ItemGroup>
<!-- Analyzer Files -->
@@ -222,25 +209,11 @@
<Content Include="Resource\Font\MiSans-Regular.ttf" />
<Content Include="Resource\HutaoIconSourceTransparentBackgroundGradient1.png" />
<Content Include="Resource\Icon\UI_AchievementIcon_3_3.png" />
<Content Include="Resource\Icon\UI_BagTabIcon_Avatar.png" />
<Content Include="Resource\Icon\UI_BagTabIcon_Weapon.png" />
<Content Include="Resource\Icon\UI_BtnIcon_ActivityEntry.png" />
<Content Include="Resource\Icon\UI_BtnIcon_Gacha.png" />
<Content Include="Resource\Icon\UI_ChapterIcon_Hutao.png" />
<Content Include="Resource\Icon\UI_GachaShowPanel_Bg_Weapon.png" />
<Content Include="Resource\Icon\UI_GuideIcon_PlayMethod.png" />
<Content Include="Resource\Icon\UI_HomeWorldTabIcon_2_Team.png" />
<Content Include="Resource\Icon\UI_Icon_Achievement.png" />
<Content Include="Resource\Icon\UI_Icon_BoostUp.png" />
<Content Include="Resource\Icon\UI_Icon_Fetter.png" />
<Content Include="Resource\Icon\UI_Icon_Locked.png" />
<Content Include="Resource\Icon\UI_Icon_None.png" />
<Content Include="Resource\Icon\UI_Icon_Tower_Star.png" />
<Content Include="Resource\Icon\UI_ItemIcon_201.png" />
<Content Include="Resource\Icon\UI_ItemIcon_210.png" />
<Content Include="Resource\Icon\UI_MarkCustom_TagMonster.png" />
<Content Include="Resource\Icon\UI_MarkTower.png" />
<Content Include="Resource\Icon\UI_MarkTower_Tower.png" />
<Content Include="Resource\Navigation\Achievement.png" />
<Content Include="Resource\Navigation\Announcement.png" />
<Content Include="Resource\Navigation\AvatarProperty.png" />
@@ -259,17 +232,18 @@
<!-- Packages -->
<ItemGroup>
<!-- https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-Labs/nuget/v3/index.json -->
<PackageReference Include="CommunityToolkit.Labs.WinUI.Controls.DataTable" Version="0.1.230802" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.Shimmer" Version="0.1.230802" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.TokenView" Version="0.1.230802" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.TransitionHelper" Version="0.1.230802" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.Controls.DataTable" Version="0.1.230809" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.MarqueeText" Version="0.1.230809" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.Shimmer" Version="0.1.230809" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.TokenView" Version="0.1.230809" />
<PackageReference Include="CommunityToolkit.Labs.WinUI.TransitionHelper" Version="0.1.230809" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2-build.1" />
<PackageReference Include="CommunityToolkit.WinUI.Behaviors" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.HeaderedControls" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Segmented" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.SettingsControls" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Media" Version="8.0.230809-preview" />
<PackageReference Include="CommunityToolkit.WinUI.Behaviors" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.HeaderedControls" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Segmented" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.SettingsControls" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Media" Version="8.0.230828-rc" />
<PackageReference Include="CommunityToolkit.WinUI.Notifications" Version="7.1.2" />
<PackageReference Include="CommunityToolkit.WinUI.UI.Controls.Core" Version="7.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.10" />
@@ -325,6 +299,18 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Page Update="View\Control\StatisticsSegmented.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\Dialog\GeetestCustomUrlDialog.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\Control\Webview2Viewer.xaml">
<Generator>MSBuild:Compile</Generator>
@@ -397,11 +383,6 @@
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\WelcomeView.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="View\Page\TestPage.xaml">
<Generator>MSBuild:Compile</Generator>

View File

@@ -21,60 +21,74 @@
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid>
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding StatisticsList}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{shcm:ResourceString Name=ViewCardAchievementStatisticsTitle}"/>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Right"
Text="{Binding DisplayName}"/>
<TextBlock
Grid.Row="1"
Margin="0,4,0,0"
Style="{StaticResource TitleTextBlockStyle}"
Text="{Binding FinishDescription}"/>
<ItemsControl Grid.Row="2" ItemsSource="{Binding Achievements}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,4,0,0">
<TextBlock
Opacity="0.8"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding Inner.Title}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Time}"
TextWrapping="NoWrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<Grid Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid Visibility="{Binding StatisticsList.Count, Converter={StaticResource Int32ToVisibilityConverter}}">
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding StatisticsList}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{shcm:ResourceString Name=ViewCardAchievementStatisticsTitle}"/>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Right"
Text="{Binding DisplayName}"/>
<TextBlock
Grid.Row="1"
Margin="0,4,0,0"
Style="{StaticResource TitleTextBlockStyle}"
Text="{Binding FinishDescription}"/>
<ItemsControl Grid.Row="2" ItemsSource="{Binding Achievements}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,4,0,0">
<TextBlock
Opacity="0.8"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding Inner.Title}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Time}"
TextWrapping="NoWrap"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<PipsPager
Height="16"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding StatisticsList.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"/>
</Grid>
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Visibility="{Binding StatisticsList.Count, Converter={StaticResource Int32ToVisibilityRevertConverter}}">
<Image
Width="80"
Height="80"
Source="ms-appx:///Resource/Navigation/Achievement.png"/>
<TextBlock HorizontalAlignment="Center" Text="{shcm:ResourceString Name=ViewAchievementHeader}"/>
</StackPanel>
</Grid>
<PipsPager
Height="16"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding StatisticsList.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}"/>
<shvc:LoadingViewSlim IsLoading="{Binding IsInitialized, Converter={StaticResource BoolNegationConverter}}"/>
</Grid>
</Button>

View File

@@ -6,10 +6,11 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvc="using:Snap.Hutao.View.Control"
xmlns:shvd="using:Snap.Hutao.ViewModel.DailyNote"
xmlns:shvh="using:Snap.Hutao.View.Helper"
Padding="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
@@ -23,161 +24,175 @@
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid>
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding DailyNoteEntries}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid
Margin="12"
ColumnSpacing="6"
RowSpacing="6">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid Visibility="{Binding DailyNoteEntries.Count, Converter={StaticResource Int32ToVisibilityConverter}}">
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding DailyNoteEntries}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid
Margin="12"
ColumnSpacing="6"
RowSpacing="6">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Uid}"/>
<TextBlock
Grid.Row="0"
Grid.Column="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding RefreshTimeFormatted}"/>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Uid}"/>
<TextBlock
Grid.Row="0"
Grid.Column="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding RefreshTimeFormatted}"/>
<Grid
Grid.Row="1"
Grid.Column="0"
RowSpacing="6">
<Grid
Grid.Row="1"
Grid.Column="0"
RowSpacing="6">
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shvh:FrameworkElementHelper.SquareLength="64" Source="{StaticResource UI_ItemIcon_210}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ResinFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shvh:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding ResinNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shch:FrameworkElementHelper.SquareLength="64" Source="{StaticResource UI_ItemIcon_210}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ResinFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shch:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding ResinNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
</Grid>
<Grid
Grid.Row="1"
Grid.Column="1"
RowSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shch:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_ItemIcon_204}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.HomeCoinFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shch:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding HomeCoinNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shch:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_MarkQuest_Events_Proce}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.TaskFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shch:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding DailyTaskNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
</Grid>
<Grid
Grid.Row="1"
Grid.Column="2"
RowSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shch:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_MarkTower}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ResinDiscountFormatted}"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shch:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_ItemIcon_220021}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.Transformer.RecoveryTime.TimeLeftFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shch:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding TransformerNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
</Grid>
</Grid>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<Grid
Grid.Row="1"
Grid.Column="1"
RowSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<PipsPager
Height="16"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding DailyNoteEntries.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"/>
</Grid>
<Grid Grid.Row="0" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shvh:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_ItemIcon_204}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.HomeCoinFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shvh:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding HomeCoinNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Visibility="{Binding DailyNoteEntries.Count, Converter={StaticResource Int32ToVisibilityRevertConverter}}">
<Image
Width="80"
Height="80"
Source="ms-appx:///Resource/Navigation/DailyNote.png"/>
<TextBlock HorizontalAlignment="Center" Text="{shcm:ResourceString Name=ViewDailyNoteHeader}"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shvh:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_MarkQuest_Events_Proce}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.TaskFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shvh:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding DailyTaskNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
</Grid>
<Grid
Grid.Row="1"
Grid.Column="2"
RowSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shvh:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_MarkTower}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ResinDiscountFormatted}"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1" Style="{StaticResource BorderGridStyle}">
<StackPanel VerticalAlignment="Center">
<shci:CachedImage shvh:FrameworkElementHelper.SquareLength="32" Source="{StaticResource UI_ItemIcon_220021}"/>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.Transformer.RecoveryTime.TimeLeftFormatted}"/>
</StackPanel>
<InfoBadge
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
shvh:FrameworkElementHelper.SquareLength="8"
Style="{ThemeResource AttentionDotInfoBadgeStyle}"
Visibility="{Binding TransformerNotifySuppressed, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>
</Grid>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<PipsPager
Height="16"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding DailyNoteEntries.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}"/>
<shvc:LoadingViewSlim IsLoading="{Binding IsInitialized, Converter={StaticResource BoolNegationConverter}}"/>
</Grid>
</Button>

View File

@@ -26,283 +26,298 @@
<x:Double x:Key="GachaStatisticsCardPullProgressBarMinHeight">40</x:Double>
<Thickness x:Key="GachaStatisticsCardPullProgressHeaderTextMargin">6,0</Thickness>
</Grid.Resources>
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding StatisticsList}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid Margin="12" ColumnSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock
Grid.Row="0"
Grid.ColumnSpan="3"
Text="{shcm:ResourceString Name=ViewCardGachaStatisticsTitle}"/>
<TextBlock
Grid.Row="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Right"
Text="{Binding Uid}"/>
<StackPanel
Grid.Row="1"
Grid.Column="0"
DataContext="{Binding AvatarWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid Visibility="{Binding StatisticsList.Count, Converter={StaticResource Int32ToVisibilityConverter}}">
<FlipView
x:Name="RootFlipView"
Background="{x:Null}"
ItemsSource="{Binding StatisticsList}">
<FlipView.ItemTemplate>
<DataTemplate>
<Grid Margin="12" ColumnSpacing="6">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Row="0"
Grid.ColumnSpan="3"
Text="{shcm:ResourceString Name=ViewCardGachaStatisticsTitle}"/>
<TextBlock
Grid.Row="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Right"
Text="{Binding Uid}"/>
<StackPanel
Grid.Row="1"
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
DataContext="{Binding AvatarWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
</Grid>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
DataContext="{Binding WeaponWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
</Grid>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="2"
DataContext="{Binding StandardWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
</Grid>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
</StackPanel>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
<PipsPager
Height="16"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding StatisticsList.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"/>
</Grid>
</Grid>
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="1"
DataContext="{Binding WeaponWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
</Grid>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="2"
DataContext="{Binding StandardWish}"
Spacing="6">
<TextBlock
Margin="0,0,0,6"
HorizontalAlignment="Center"
Style="{StaticResource BaseTextBlockStyle}"
Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<Grid Grid.Column="0" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource OrangeBrush}"
Maximum="{Binding GuaranteeOrangeThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastOrangePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource OrangeBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastOrangePull}"/>
</Grid>
<Grid Grid.Column="1" Style="{StaticResource BorderGridStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ProgressBar
Grid.ColumnSpan="2"
MinHeight="{StaticResource GachaStatisticsCardPullProgressBarMinHeight}"
Background="Transparent"
CornerRadius="{StaticResource CompatCornerRadius}"
Foreground="{StaticResource PurpleBrush}"
Maximum="{Binding GuaranteePurpleThreshold}"
Opacity="{StaticResource LargeBackgroundProgressBarOpacity}"
Style="{StaticResource DefaultProgressBarStyle}"
Value="{Binding LastPurplePull}"/>
<TextBlock
Grid.Column="0"
Margin="{StaticResource GachaStatisticsCardPullProgressHeaderTextMargin}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewControlStatisticsCardPurpleText}"/>
<TextBlock
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{StaticResource PurpleBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding LastPurplePull}"/>
</Grid>
</StackPanel>
</Grid>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
<PipsPager
Height="16"
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
NumberOfPages="{Binding StatisticsList.Count}"
SelectedPageIndex="{x:Bind Path=RootFlipView.SelectedIndex, Mode=TwoWay}"
Visibility="{Binding IsInitialized, Converter={StaticResource BoolToVisibilityConverter}}"/>
VerticalAlignment="Center"
Visibility="{Binding StatisticsList.Count, Converter={StaticResource Int32ToVisibilityRevertConverter}}">
<Image
Width="80"
Height="80"
Source="ms-appx:///Resource/Navigation/GachaLog.png"/>
<TextBlock HorizontalAlignment="Center" Text="{shcm:ResourceString Name=ViewGachaLogHeader}"/>
</StackPanel>
<shvc:LoadingViewSlim IsLoading="{Binding IsInitialized, Converter={StaticResource BoolNegationConverter}}"/>
</Grid>
</Button>
</Button>

View File

@@ -116,7 +116,7 @@ internal sealed partial class AnnouncementContentViewer : UserControl
<body style="{{(isDarkMode ? LightColor1 : DarkColor1)}}; background-color: transparent;">
<h3>{{announcement.Title}}</h3>
<img src="{{announcement.Banner}}" />
<img src="{{announcement.Banner}}"/>
<br>
{{content}}
</body>

View File

@@ -2,15 +2,14 @@
x:Class="Snap.Hutao.View.Control.HutaoStatisticsCard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cwucont="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shcp="using:Snap.Hutao.Control.Panel"
xmlns:shvcont="using:Snap.Hutao.View.Control"
xmlns:shvg="using:Snap.Hutao.ViewModel.GachaLog"
xmlns:shvh="using:Snap.Hutao.View.Helper"
d:DataContext="{d:DesignInstance shvg:HutaoWishSummary}"
mc:Ignorable="d">
@@ -22,7 +21,7 @@
Style="{StaticResource BorderCardStyle}">
<StackPanel>
<shvcont:ItemIcon
shvh:FrameworkElementHelper.SquareLength="40"
shch:FrameworkElementHelper.SquareLength="40"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<TextBlock

View File

@@ -4,10 +4,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter"
xmlns:shvh="using:Snap.Hutao.View.Helper"
shvh:FrameworkElementHelper.SquareLength="80"
shch:FrameworkElementHelper.SquareLength="80"
mc:Ignorable="d">
<UserControl.Resources>
<shmmc:QualityConverter x:Key="QualityConverter"/>

View File

@@ -4,9 +4,9 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter"
xmlns:shvh="using:Snap.Hutao.View.Helper"
mc:Ignorable="d">
<UserControl.Resources>
@@ -26,7 +26,7 @@
<Pivot.HeaderTemplate>
<DataTemplate>
<StackPanel>
<shci:MonoChrome shvh:FrameworkElementHelper.SquareLength="36" Source="{Binding Icon, Converter={StaticResource SkillIconConverter}}"/>
<shci:MonoChrome shch:FrameworkElementHelper.SquareLength="36" Source="{Binding Icon, Converter={StaticResource SkillIconConverter}}"/>
<TextBlock
Margin="0,8,0,0"
HorizontalAlignment="Center"

View File

@@ -2,19 +2,17 @@
x:Class="Snap.Hutao.View.Control.StatisticsCard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:clws="using:CommunityToolkit.Labs.WinUI"
xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
xmlns:cwuc="using:CommunityToolkit.WinUI.UI.Converters"
xmlns:cwucont="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shc="using:Snap.Hutao.Control"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shcp="using:Snap.Hutao.Control.Panel"
xmlns:shvcont="using:Snap.Hutao.View.Control"
xmlns:shvconv="using:Snap.Hutao.View.Converter"
xmlns:shvg="using:Snap.Hutao.ViewModel.GachaLog"
xmlns:shvh="using:Snap.Hutao.View.Helper"
d:DataContext="{d:DesignInstance shvg:TypedWishSummary}"
mc:Ignorable="d">
@@ -22,7 +20,7 @@
<shvconv:Int32ToGradientColorConverter x:Key="Int32ToGradientColorConverter" MaximumValue="{Binding GuaranteeOrangeThreshold}"/>
<DataTemplate x:Key="OrangeListTemplate" d:DataType="shvg:SummaryItem">
<Grid Margin="0,4,0,0" Style="{StaticResource BorderGridStyle}">
<Grid Margin="0" Style="{StaticResource BorderGridStyle}">
<ToolTipService.ToolTip>
<TextBlock Text="{Binding TimeFormatted}"/>
</ToolTipService.ToolTip>
@@ -41,7 +39,7 @@
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<shci:CachedImage
shvh:FrameworkElementHelper.SquareLength="40"
shch:FrameworkElementHelper.SquareLength="40"
CornerRadius="{ThemeResource ControlCornerRadius}"
Source="{Binding Icon}"/>
<TextBlock
@@ -86,21 +84,18 @@
TrueValue="{ThemeResource CardBackgroundFillColorDefaultBrush}"/>
<DataTemplate x:Key="OrangeGridTemplate" d:DataType="shvg:SummaryItem">
<Border
Margin="0,4,4,0"
<shvcont:BottomTextSmallControl
Background="{Binding IsUp, Converter={StaticResource BoolToBrushConverter}}"
Style="{StaticResource BorderCardStyle}"
Text="{Binding LastPull}"
ToolTipService.ToolTip="{Binding TimeFormatted}">
<shvcont:BottomTextSmallControl Text="{Binding LastPull}">
<shvcont:BottomTextSmallControl.Foreground>
<SolidColorBrush Color="{Binding Color}"/>
</shvcont:BottomTextSmallControl.Foreground>
<shvcont:ItemIcon
shvh:FrameworkElementHelper.SquareLength="40"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvcont:BottomTextSmallControl>
</Border>
<shvcont:BottomTextSmallControl.Foreground>
<SolidColorBrush Color="{Binding Color}"/>
</shvcont:BottomTextSmallControl.Foreground>
<shvcont:ItemIcon
shch:FrameworkElementHelper.SquareLength="40"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
</shvcont:BottomTextSmallControl>
</DataTemplate>
</UserControl.Resources>
@@ -237,15 +232,18 @@
</Grid>
</StackPanel>
<MenuFlyoutSeparator Margin="-12,0"/>
<FlipView
Name="StatisticsFilpView"
Height="74"
Margin="-16,0"
VerticalAlignment="Top"
Background="Transparent">
<FlipViewItem>
<StackPanel Padding="16,12" Spacing="2">
<shvcont:StatisticsSegmented
x:Name="StatisticsSegmented"
Margin="0,12,0,0"
HorizontalAlignment="Stretch"
IsPredictPullAvailable="{Binding IsPredictPullAvailable}"
SelectedIndex="0"/>
<cwc:SwitchPresenter
Height="85"
Padding="0,12"
Value="{x:Bind StatisticsSegmented.SelectedIndex, Mode=OneWay}">
<cwc:Case Value="{shcm:Int32 Value=0}">
<StackPanel Spacing="2">
<Grid>
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{shcm:ResourceString Name=ViewControlStatisticsCardOrangeAveragePullText}"/>
<TextBlock
@@ -276,18 +274,9 @@
Text="{Binding MinOrangePullFormatted}"/>
</Grid>
</StackPanel>
</FlipViewItem>
<FlipViewItem>
<StackPanel
Margin="16,12"
Spacing="2"
Visibility="{Binding IsPredictPullAvailable, Converter={StaticResource BoolToVisibilityConverter}}">
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{Binding PredictedPullLeftToOrangeFormatted}"/>
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{Binding ProbabilityOfNextPullIsOrangeFormatted}"/>
</StackPanel>
</FlipViewItem>
<FlipViewItem>
<StackPanel Padding="16,12" Spacing="2">
</cwc:Case>
<cwc:Case Value="{shcm:Int32 Value=1}">
<StackPanel Spacing="2">
<Grid>
<TextBlock
Foreground="{StaticResource OrangeBrush}"
@@ -325,40 +314,57 @@
Text="{Binding TotalBlueFormatted}"/>
</Grid>
</StackPanel>
</FlipViewItem>
</FlipView>
<PipsPager
Height="16"
Margin="0,-4,0,0"
HorizontalAlignment="Center"
NumberOfPages="{x:Bind StatisticsFilpView.Items.Count}"
SelectedPageIndex="{x:Bind StatisticsFilpView.SelectedIndex, Mode=TwoWay}"/>
</cwc:Case>
<cwc:Case Value="{shcm:Int32 Value=2}">
<StackPanel Spacing="2">
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{Binding PredictedPullLeftToOrangeFormatted}"/>
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{Binding ProbabilityOfNextPullIsOrangeFormatted}"/>
</StackPanel>
</cwc:Case>
</cwc:SwitchPresenter>
<MenuFlyoutSeparator Margin="-12,0,-12,0"/>
</StackPanel>
</Expander>
<ScrollViewer
<cwc:SwitchPresenter
Grid.Row="2"
Margin="12,6,12,12"
VerticalScrollBarVisibility="Hidden">
<cwucont:SwitchPresenter Value="{Binding ElementName=ItemsPanelSelector, Path=Current}">
<cwucont:SwitchPresenter.ContentTransitions>
<TransitionCollection>
<ContentThemeTransition/>
</TransitionCollection>
</cwucont:SwitchPresenter.ContentTransitions>
<cwucont:Case Value="List">
<ItemsControl ItemTemplate="{StaticResource OrangeListTemplate}" ItemsSource="{Binding OrangeList}"/>
</cwucont:Case>
<cwucont:Case Value="Grid">
<ItemsControl
Margin="0,0,-4,0"
ItemTemplate="{StaticResource OrangeGridTemplate}"
ItemsPanel="{StaticResource WrapPanelTemplate}"
ItemsSource="{Binding OrangeList}"/>
</cwucont:Case>
</cwucont:SwitchPresenter>
</ScrollViewer>
Value="{Binding ElementName=ItemsPanelSelector, Path=Current}">
<cwc:SwitchPresenter.ContentTransitions>
<TransitionCollection>
<ContentThemeTransition/>
</TransitionCollection>
</cwc:SwitchPresenter.ContentTransitions>
<cwc:Case Value="List">
<ListView
ItemTemplate="{StaticResource OrangeListTemplate}"
ItemsSource="{Binding OrangeList}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectionMode="None">
<ListView.ItemContainerStyle>
<Style BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0,4,0,0"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</cwc:Case>
<cwc:Case Value="Grid">
<GridView
Margin="0,0,-4,0"
ItemTemplate="{StaticResource OrangeGridTemplate}"
ItemsSource="{Binding OrangeList}"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectionMode="None">
<GridView.ItemContainerStyle>
<Style BasedOn="{StaticResource DefaultGridViewItemStyle}" TargetType="GridViewItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0,0,2,4"/>
</Style>
</GridView.ItemContainerStyle>
</GridView>
</cwc:Case>
</cwc:SwitchPresenter>
</Grid>
</Border>
</UserControl>

View File

@@ -0,0 +1,13 @@
<cwc:Segmented
x:Class="Snap.Hutao.View.Control.StatisticsSegmented"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
mc:Ignorable="d">
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewControlStatisticsSegmentedItemContentStatistics}" Icon="{shcm:FontIcon Glyph=&#xE9D2;}"/>
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewControlStatisticsSegmentedItemContentProportion}" Icon="{shcm:FontIcon Glyph=&#xEB05;}"/>
</cwc:Segmented>

View File

@@ -0,0 +1,36 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using CommunityToolkit.WinUI.Controls;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Snap.Hutao.View.Control;
[DependencyProperty("IsPredictPullAvailable", typeof(bool), false, nameof(OnIsPredictPullAvailableChanged))]
internal sealed partial class StatisticsSegmented : Segmented
{
private readonly SegmentedItem predictPullItem = new()
{
Content = SH.ViewControlStatisticsSegmentedItemContentPrediction,
Icon = new FontIcon() { Glyph = "\uEA80" },
};
public StatisticsSegmented()
{
InitializeComponent();
}
private static void OnIsPredictPullAvailableChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
StatisticsSegmented segmented = (StatisticsSegmented)obj;
if (args.NewValue is true)
{
segmented.Items.Add(segmented.predictPullItem);
}
else
{
segmented.Items.RemoveLast();
}
}
}

View File

@@ -14,9 +14,9 @@
<Grid>
<TextBox
x:Name="InputText"
Margin="0,0,0,8"
VerticalAlignment="Top"
PlaceholderText="{shcm:ResourceString Name=ViewDialogAchievementArchiveCreateInputPlaceholder}"/>
PlaceholderText="{shcm:ResourceString Name=ViewDialogAchievementArchiveCreateInputPlaceholder}"
Text="{x:Bind Text, Mode=TwoWay}"/>
</Grid>
</ContentDialog>

View File

@@ -9,6 +9,7 @@ namespace Snap.Hutao.View.Dialog;
/// 成就存档创建对话框
/// </summary>
[HighQuality]
[DependencyProperty("Text", typeof(string))]
internal sealed partial class AchievementArchiveCreateDialog : ContentDialog
{
private readonly ITaskContext taskContext;
@@ -33,8 +34,6 @@ internal sealed partial class AchievementArchiveCreateDialog : ContentDialog
{
await taskContext.SwitchToMainThreadAsync();
ContentDialogResult result = await ShowAsync();
string text = InputText.Text ?? string.Empty;
return new(result == ContentDialogResult.Primary, text);
return new(result == ContentDialogResult.Primary, Text ?? string.Empty);
}
}

View File

@@ -16,7 +16,7 @@
<TextBox
VerticalAlignment="Top"
PlaceholderText="{shcm:ResourceString Name=ViewDialogCultivateProjectInputPlaceholder}"
Text="{x:Bind Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Text="{x:Bind Text, Mode=TwoWay}"/>
<CheckBox
Margin="0,8,0,0"
Content="{shcm:ResourceString Name=ViewDialogCultivateProjectAttachUid}"

View File

@@ -5,9 +5,9 @@
xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvc="using:Snap.Hutao.View.Control"
xmlns:shvh="using:Snap.Hutao.View.Helper"
Title="{shcm:ResourceString Name=ViewDialogGachaLogRefreshProgressTitle}"
Style="{StaticResource DefaultContentDialogStyle}"
mc:Ignorable="d">
@@ -15,7 +15,7 @@
<ContentDialog.Resources>
<DataTemplate x:Key="GachaItemDataTemplate">
<shvc:ItemIcon
shvh:FrameworkElementHelper.SquareLength="60"
shch:FrameworkElementHelper.SquareLength="60"
Badge="{Binding Badge}"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>

View File

@@ -0,0 +1,89 @@
<ContentDialog
x:Class="Snap.Hutao.View.Dialog.GeetestCustomUrlDialog"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
Title="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlTitle}"
CloseButtonText="{shcm:ResourceString Name=ContentDialogCancelCloseButtonText}"
DefaultButton="Primary"
PrimaryButtonText="{shcm:ResourceString Name=ContentDialogConfirmPrimaryButtonText}"
Style="{StaticResource DefaultContentDialogStyle}"
mc:Ignorable="d">
<StackPanel>
<TextBlock
Margin="1,0,0,5"
Style="{StaticResource BaseTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlReturnDataHeader}"/>
<Border
Margin="0,4,0,0"
Padding="0,8,8,8"
Style="{ThemeResource BorderCardStyle}">
<TextBlock FontFamily="{StaticResource CascadiaMonoAndMiSans}" Style="{StaticResource CaptionTextBlockStyle}">
<TextBlock.Inlines>
<Run Text="{} {"/>
<LineBreak/>
<Run Text=" &quot;code&quot;: 0,"/>
<LineBreak/>
<Run Text=" &quot;data&quot;: {"/>
<LineBreak/>
<Run Text=" &quot;gt&quot;: &quot;same gt below&quot;,"/>
<LineBreak/>
<Run Text=" &quot;challenge&quot;: &quot;same challenge below&quot;,"/>
<LineBreak/>
<Run Text=" &quot;validate&quot;: &quot;validation result&quot;"/>
<LineBreak/>
<Run Text=" }"/>
<LineBreak/>
<Run Text="{}}"/>
</TextBlock.Inlines>
</TextBlock>
</Border>
<TextBlock
Margin="0,4,0,0"
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlReturnDataDescription1}"/>
<TextBlock
Margin="0,4,0,0"
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlReturnDataDescription2}"/>
<TextBlock
Margin="1,15,0,5"
Style="{StaticResource BaseTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlSampleHeader}"/>
<Border
Margin="0,4,0,0"
Padding="8"
Style="{ThemeResource BorderCardStyle}">
<TextBlock
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="https://my.api.com/geetest?gt={0}&amp;challenge={1}"/>
</Border>
<TextBlock
Margin="0,4,0,0"
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlSampleDescription1}"/>
<TextBlock
Margin="0,2,0,0"
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlSampleDescription2}"/>
<TextBlock
Margin="0,2,0,0"
FontFamily="{StaticResource CascadiaMonoAndMiSans}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlSampleDescription3}"/>
<TextBox
Margin="0,16,0,0"
PlaceholderText="{shcm:ResourceString Name=ViewDialogGeetestCustomUrlCompositInputHint}"
Text="{x:Bind Text, Mode=TwoWay}"/>
</StackPanel>
</ContentDialog>

View File

@@ -0,0 +1,28 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml.Controls;
using Snap.Hutao.Service;
namespace Snap.Hutao.View.Dialog;
[DependencyProperty("Text", typeof(string))]
internal sealed partial class GeetestCustomUrlDialog : ContentDialog
{
private readonly ITaskContext taskContext;
public GeetestCustomUrlDialog(IServiceProvider serviceProvider)
{
InitializeComponent();
XamlRoot = serviceProvider.GetRequiredService<MainWindow>().Content.XamlRoot;
Text = serviceProvider.GetRequiredService<AppOptions>().GeetestCustomCompositeUrl;
taskContext = serviceProvider.GetRequiredService<ITaskContext>();
}
public async ValueTask<ValueResult<bool, string>> GetUrlAsync()
{
await taskContext.SwitchToMainThreadAsync();
ContentDialogResult result = await ShowAsync();
return new(result == ContentDialogResult.Primary, Text ?? string.Empty);
}
}

View File

@@ -2,27 +2,212 @@
x:Class="Snap.Hutao.View.Guide.GuideView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cwuc="using:CommunityToolkit.WinUI.UI.Controls"
xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvg="using:Snap.Hutao.ViewModel.Guide"
d:DataContext="{d:DesignInstance shvg:GuideViewModel}"
mc:Ignorable="d">
<mxi:Interaction.Behaviors>
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid Background="{ThemeResource CardBackgroundFillColorSecondaryBrush}">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<cwuc:SwitchPresenter/>
<cwc:SwitchPresenter Value="{Binding State, Mode=OneWay}">
<cwc:Case Value="{shcm:UInt32 Value=0}">
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<GridView
Grid.Row="0"
ItemsSource="{Binding AppOptions.Cultures}"
SelectedItem="{Binding SelectedCulture, Mode=TwoWay}"
SelectionMode="Single">
<GridView.ItemTemplate>
<DataTemplate>
<Border MinWidth="240" Margin="16">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding Name}"/>
</Border>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
</cwc:Case>
<cwc:Case Value="{shcm:UInt32 Value=1}">
<Grid
HorizontalAlignment="Center"
VerticalAlignment="Center"
ColumnSpacing="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Image
Grid.Column="0"
Height="152"
Source="ms-appx:///Assets/Square44x44Logo.targetsize-256.png"/>
<StackPanel
Grid.Column="2"
VerticalAlignment="Center"
Spacing="8">
<CheckBox IsChecked="{Binding IsTermOfServiceAgreed, Mode=TwoWay}">
<TextBlock>
<TextBlock.Inlines>
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementIHaveReadText}"/>
<Hyperlink NavigateUri="https://hut.ao/statements/tos.html">
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementTermOfService}"/>
</Hyperlink>
</TextBlock.Inlines>
</TextBlock>
</CheckBox>
<CheckBox IsChecked="{Binding IsPrivacyPolicyAgreed, Mode=TwoWay}">
<TextBlock>
<TextBlock.Inlines>
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementIHaveReadText}"/>
<Hyperlink NavigateUri="https://hut.ao/statements/privacy-notice.html">
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementPrivacyPolicy}"/>
</Hyperlink>
</TextBlock.Inlines>
</TextBlock>
</CheckBox>
<CheckBox IsChecked="{Binding IsIssueReportAgreed, Mode=TwoWay}">
<TextBlock>
<TextBlock.Inlines>
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementIHaveReadText}"/>
<Hyperlink NavigateUri="https://hut.ao/statements/bug-report.html">
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementIssueReport}"/>
</Hyperlink>
</TextBlock.Inlines>
</TextBlock>
</CheckBox>
<CheckBox IsChecked="{Binding IsOpenSourceLicenseAgreed, Mode=TwoWay}">
<TextBlock>
<TextBlock.Inlines>
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementIHaveReadText}"/>
<Hyperlink NavigateUri="https://github.com/DGP-Studio/Snap.Hutao/blob/main/LICENSE">
<Run Text="{shcm:ResourceString Name=ViewGuideStepAgreementOpenSourceLicense}"/>
</Hyperlink>
</TextBlock.Inlines>
</TextBlock>
</CheckBox>
</StackPanel>
</Grid>
</cwc:Case>
<cwc:Case Value="{shcm:UInt32 Value=2}">
<Grid>
<StackPanel
Margin="16"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<TextBlock
Margin="1,0,0,5"
Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
Text="Segoe Fluent Icons"/>
<StackPanel
Margin="0,8"
Orientation="Horizontal"
Spacing="8">
<!-- PUA E700-E900 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xE8DF;"/>
<!-- PUA EA00-EC00 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xEF58;"/>
<!-- PUA ED00-EF00 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xED56;"/>
<!-- PUA F000-F200 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xF012;"/>
<!-- PUA F300-F500 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xF439;"/>
<!-- PUA F600-F800 -->
<FontIcon FontSize="{StaticResource SubtitleTextBlockFontSize}" Glyph="&#xF6A9;"/>
</StackPanel>
<TextBlock>
<Run Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentFontDescription1}"/>
<Hyperlink NavigateUri="https://aka.ms/SegoeFluentIcons">
<Run Text="Microsoft"/>
</Hyperlink>
<Run Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentFontDescription2}"/>
</TextBlock>
<TextBlock Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentAfterInstallDescription}"/>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingWebview2Header}"/>
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding RuntimeOptions.WebView2Version}"/>
<TextBlock>
<Run Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentWebView2Description1}"/>
<Hyperlink NavigateUri="https://go.microsoft.com/fwlink/p/?LinkId=2124703">
<Run Text="Microsoft"/>
</Hyperlink>
<Run Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentWebView2Description2}"/>
</TextBlock>
<TextBlock Text="{shcm:ResourceString Name=ViewGuideStepEnvironmentAfterInstallDescription}"/>
</StackPanel>
</Grid>
</cwc:Case>
<cwc:Case Value="{shcm:UInt32 Value=3}">
<StackPanel Margin="32,0" HorizontalAlignment="Left">
<TextBlock
Margin="1,16,0,5"
Style="{StaticResource BaseTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewWelcomeBase}"/>
<ScrollViewer>
<ItemsControl
Margin="0,0,-4,0"
HorizontalAlignment="Center"
ItemsPanel="{StaticResource WrapPanelTemplate}"
ItemsSource="{Binding DownloadSummaries}">
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<AddDeleteThemeTransition/>
<ContentThemeTransition/>
<ReorderThemeTransition/>
<EntranceThemeTransition IsStaggeringEnabled="False"/>
</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
Width="180"
Margin="0,0,4,4"
Style="{StaticResource BorderCardStyle}">
<StackPanel Margin="8">
<TextBlock Text="{Binding DisplayName}"/>
<ProgressBar
Margin="0,4,0,0"
Maximum="1"
Value="{Binding ProgressValue}"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Description}"/>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</StackPanel>
</cwc:Case>
</cwc:SwitchPresenter>
<Grid Grid.Row="1">
<PipsPager
HorizontalAlignment="Center"
CanBeScrollAnchor="False"
IsEnabled="False"
NumberOfPages="5"
SelectedPageIndex="0"/>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<cwc:Segmented
Margin="16"
IsHitTestVisible="False"
SelectedIndex="{Binding State, Mode=TwoWay}">
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewGuideStepLanguage}" Icon="{shcm:FontIcon Glyph=&#xF2B7;}"/>
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewGuideStepDocument}" Icon="{shcm:FontIcon Glyph=&#xF28B;}"/>
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewGuideStepEnvironment}" Icon="{shcm:FontIcon Glyph=&#xE81E;}"/>
<cwc:SegmentedItem Content="{shcm:ResourceString Name=ViewGuideStepStaticResource}" Icon="{shcm:FontIcon Glyph=&#xE8B9;}"/>
</cwc:Segmented>
<Button
Command="{Binding NextOrCompleteCommand}"
Content="{Binding NextOrCompleteButtonText}"
IsEnabled="{Binding IsNextOrCompleteButtonEnabled}"/>
</StackPanel>
</Grid>
</Grid>
</UserControl>

View File

@@ -9,6 +9,7 @@
xmlns:mxic="using:Microsoft.Xaml.Interactions.Core"
xmlns:shc="using:Snap.Hutao.Control"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shcp="using:Snap.Hutao.Control.Panel"
@@ -130,12 +131,15 @@
DisplayMode="Inline"
IsPaneOpen="True"
OpenPaneLength="{StaticResource CompatSplitViewOpenPaneLength2}"
PaneBackground="Transparent">
PaneBackground="{x:Null}">
<SplitView.Pane>
<ListView
ItemsSource="{Binding AchievementGoals}"
SelectedItem="{Binding SelectedAchievementGoal, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<ListView.ItemContainerStyle>
<Style BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem">
<Setter Property="Margin" Value="0,0,6,0"/>
@@ -173,79 +177,79 @@
</SplitView.Pane>
<SplitView.Content>
<ScrollViewer Padding="0,0,8,0">
<ItemsControl
Margin="8,0,0,16"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}"
ItemsSource="{Binding Achievements}">
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<ContentThemeTransition/>
</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
Margin="0,8,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Style="{StaticResource BorderCardStyle}">
<Grid MinHeight="48" Padding="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView
Margin="8,0,0,0"
Padding="0,0,0,8"
ItemsSource="{Binding Achievements}"
SelectionMode="None">
<ListView.ItemContainerStyle>
<Style BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0,4,8,0"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Border
Margin="0,4,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Style="{StaticResource BorderCardStyle}">
<Grid MinHeight="48" Padding="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
MinWidth="0"
MinHeight="0"
Margin="8,0"
Padding="0,0,0,0"
Command="{Binding Path=DataContext.SaveAchievementCommand, Source={StaticResource BindingProxy}}"
CommandParameter="{Binding}"
IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
<Grid Grid.Column="1" Margin="8,0,0,0">
<Grid.ColumnDefinitions>
<!-- text -->
<ColumnDefinition/>
<!-- time -->
<ColumnDefinition Width="auto"/>
<!-- pic -->
<ColumnDefinition Width="auto"/>
<!-- count -->
<ColumnDefinition Width="32"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding Inner.Title}"/>
<TextBlock
Margin="0,2,0,0"
Style="{StaticResource SecondaryTextStyle}"
Text="{Binding Inner.Description}"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
<CheckBox
Grid.Column="0"
MinWidth="0"
MinHeight="0"
Margin="8,0"
Padding="0,0,0,0"
Command="{Binding Path=DataContext.SaveAchievementCommand, Source={StaticResource BindingProxy}}"
CommandParameter="{Binding}"
IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
<Grid Grid.Column="1" Margin="8,0,0,0">
<Grid.ColumnDefinitions>
<!-- text -->
<ColumnDefinition/>
<!-- time -->
<ColumnDefinition Width="auto"/>
<!-- pic -->
<ColumnDefinition Width="auto"/>
<!-- count -->
<ColumnDefinition Width="32"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding Inner.Title}"/>
<TextBlock
Grid.Column="1"
Margin="12,0,12,0"
VerticalAlignment="Center"
Text="{Binding Time}"
Visibility="{Binding IsChecked, Converter={StaticResource BoolToVisibilityConverter}}"/>
<Image
Grid.Column="2"
Height="32"
Source="ms-appx:///Resource/Icon/UI_ItemIcon_201.png"/>
<TextBlock
Grid.Column="3"
Margin="12,0,0,0"
VerticalAlignment="Center"
Text="{Binding Inner.FinishReward.Count}"/>
</Grid>
Margin="0,2,0,0"
Style="{StaticResource SecondaryTextStyle}"
Text="{Binding Inner.Description}"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
<TextBlock
Grid.Column="1"
Margin="12,0,12,0"
VerticalAlignment="Center"
Text="{Binding Time}"
Visibility="{Binding IsChecked, Converter={StaticResource BoolToVisibilityConverter}}"/>
<shci:CachedImage
Grid.Column="2"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_ItemIcon_201}"/>
<TextBlock
Grid.Column="3"
Margin="12,0,0,0"
VerticalAlignment="Center"
Text="{Binding Inner.FinishReward.Count}"/>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</SplitView.Content>
</SplitView>
</cwuc:Case>
@@ -258,6 +262,9 @@
ItemsSource="{Binding AchievementGoals}"
SelectedItem="{Binding SelectedAchievementGoal, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<GridView.ItemTemplate>
<DataTemplate>
<Border MinWidth="180" Style="{StaticResource BorderCardStyle}">
@@ -303,7 +310,7 @@
<Image
Width="120"
Height="120"
Source="ms-appx:///Resource/Icon/UI_AchievementIcon_3_3.png"/>
Source="ms-appx:///Resource/Navigation/Achievement.png"/>
<TextBlock
Margin="0,16,0,0"
HorizontalAlignment="Center"

View File

@@ -156,12 +156,40 @@
<Grid>
<ScrollViewer Padding="0,0,4,0">
<StackPanel>
<StackPanel>
<TextBlock
Margin="16,16,16,0"
Style="{StaticResource TitleTextBlockStyle}"
Text="{Binding GreetingText}"/>
<TextBlock Margin="16,0,16,0" Text="{Binding UserOptions.UserName}"/>
<ItemsControl
Margin="16,16,16,0"
ItemsSource="{Binding HutaoAnnouncements}"
Visibility="{Binding HutaoAnnouncements.Count, Converter={StaticResource Int32ToVisibilityConverter}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<InfoBar
Title="{Binding Title}"
CloseButtonCommand="{Binding DismissCommand}"
CloseButtonCommandParameter="{Binding}"
IsOpen="True"
Message="{Binding Content}"
Severity="{Binding Severity}">
<StackPanel Margin="0,0,0,8" Orientation="Horizontal">
<HyperlinkButton Content="查看详情" NavigateUri="{Binding Link}"/>
<TextBlock
Margin="8,0,0,2"
VerticalAlignment="Center"
Opacity="0.7"
Text="{Binding UpdateTimeFormatted}"/>
</StackPanel>
</InfoBar>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<cwucont:AdaptiveGridView
Margin="16,16,0,0"
HorizontalAlignment="Stretch"

View File

@@ -75,7 +75,13 @@
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
DefaultLabelPosition="Right">
<CommandBar.Content>
<shcp:PanelSelector x:Name="ItemsPanelSelector" Margin="6,8,0,0"/>
<StackPanel Orientation="Horizontal">
<shcp:PanelSelector x:Name="ItemsPanelSelector" Margin="6,8,0,0"/>
<ToggleButton
x:Name="RefreshTimeToggle"
Margin="8,8,0,0"
Content="{shcm:ResourceString Name=ViewPageAvatarPropertyRefreshTimeToggle}"/>
</StackPanel>
</CommandBar.Content>
<AppBarButton
Command="{Binding ExportAsImageCommand}"
@@ -99,7 +105,7 @@
</AppBarButton>
</CommandBar>
<cwucont:SwitchPresenter Grid.Row="1" Value="{Binding ElementName=ItemsPanelSelector, Path=Current}">
<cwucont:SwitchPresenter Grid.Row="1" Value="{Binding ElementName=ItemsPanelSelector, Path=Current, Mode=OneWay}">
<cwucont:SwitchPresenter.ContentTransitions>
<TransitionCollection>
<ContentThemeTransition/>
@@ -227,7 +233,7 @@
Grid.Row="1"
DisplayMode="Inline"
IsPaneOpen="True"
OpenPaneLength="{StaticResource CompatSplitViewOpenPaneLength3}"
OpenPaneLength="{StaticResource CompatSplitViewOpenPaneLength2}"
PaneBackground="Transparent">
<SplitView.Pane>
<ListView ItemsSource="{Binding Summary.Avatars}" SelectedItem="{Binding SelectedAvatar, Mode=TwoWay}">
@@ -255,24 +261,36 @@
Margin="12,0,0,0"
Opacity="0.7"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Level}"/>
Text="{Binding Level}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
<StackPanel
Grid.Column="2"
VerticalAlignment="Center"
Opacity="0.7">
Opacity="0.7"
Visibility="{Binding ElementName=RefreshTimeToggle, Path=IsChecked, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
<TextBlock
HorizontalAlignment="Right"
FontSize="11"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding ShowcaseRefreshTimeFormat}"/>
Text="{Binding ShowcaseRefreshTimeFormat}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
HorizontalAlignment="Right"
FontSize="11"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding GameRecordRefreshTimeFormat}"/>
Text="{Binding GameRecordRefreshTimeFormat}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
HorizontalAlignment="Right"
FontSize="11"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding CalculatorRefreshTimeFormat}"/>
Text="{Binding CalculatorRefreshTimeFormat}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
</DataTemplate>

View File

@@ -299,7 +299,7 @@
CommandParameter="Snap.Hutao.View.Page.WikiAvatarPage"
Description="{shcm:ResourceString Name=ViewPageCultivationWikiAvatarDescription}"
Header="{shcm:ResourceString Name=ViewWikiAvatarHeader}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_BagTabIcon_Avatar.png}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Navigation/WikiAvatar.png}"
IsClickEnabled="True"/>
<cwc:SettingsCard
ActionIconToolTip="{shcm:ResourceString Name=ViewPageCultivationNavigateAction}"
@@ -307,7 +307,7 @@
CommandParameter="Snap.Hutao.View.Page.WikiWeaponPage"
Description="{shcm:ResourceString Name=ViewPageCultivationWikiWeaponDescription}"
Header="{shcm:ResourceString Name=ViewWikiWeaponHeader}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_BagTabIcon_Weapon.png}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Navigation/WikiWeapon.png}"
IsClickEnabled="True"/>
<cwc:SettingsCard
ActionIconToolTip="{shcm:ResourceString Name=ViewPageCultivationNavigateAction}"
@@ -315,7 +315,7 @@
CommandParameter="Snap.Hutao.View.Page.AvatarPropertyPage"
Description="{shcm:ResourceString Name=ViewPageCultivationAvatarPropertyDescription}"
Header="{shcm:ResourceString Name=ViewAvatarPropertyHeader}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Icon/UI_Icon_BoostUp.png}"
HeaderIcon="{shcm:BitmapIcon Source=ms-appx:///Resource/Navigation/Cultivation.png}"
IsClickEnabled="True"/>
</StackPanel>
</Grid>

View File

@@ -12,11 +12,11 @@
xmlns:mxim="using:Microsoft.Xaml.Interactions.Media"
xmlns:shc="using:Snap.Hutao.Control"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shch="using:Snap.Hutao.Control.Helper"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvc="using:Snap.Hutao.View.Control"
xmlns:shvd="using:Snap.Hutao.ViewModel.DailyNote"
xmlns:shvh="using:Snap.Hutao.View.Helper"
d:DataContext="{d:DesignInstance shvd:DailyNoteViewModel}"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">
@@ -190,7 +190,7 @@
ItemsSource="{Binding DailyNoteEntries}"
SelectionMode="None"
StretchContentForSingleRow="False">
<ItemsControl.ItemTemplate>
<cwuc:AdaptiveGridView.ItemTemplate>
<DataTemplate>
<Grid Padding="8" Style="{StaticResource BorderGridStyle}">
<Grid.RowDefinitions>
@@ -255,7 +255,7 @@
Margin="8,0,0,0"
HorizontalAlignment="Right"
VerticalAlignment="Stretch"
shvh:FrameworkElementHelper.SquareLength="40"
shch:FrameworkElementHelper.SquareLength="40"
Background="Transparent"
BorderBrush="{x:Null}"
BorderThickness="0"
@@ -267,7 +267,7 @@
<Button
Margin="8,0,0,0"
VerticalAlignment="Stretch"
shvh:FrameworkElementHelper.SquareLength="40"
shch:FrameworkElementHelper.SquareLength="40"
Background="Transparent"
BorderBrush="{x:Null}"
BorderThickness="0"
@@ -301,17 +301,23 @@
Grid.Column="0"
Margin="4"
VerticalAlignment="Center"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_ItemIcon_210}"/>
<StackPanel
Grid.Column="1"
Margin="8,0,0,0"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding DailyNote.ResinFormatted, Mode=OneWay}"/>
<TextBlock
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding DailyNote.ResinFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ResinRecoveryTargetTime, Mode=OneWay}"/>
Text="{Binding DailyNote.ResinRecoveryTargetTime, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
<Grid Style="{ThemeResource BorderGridStyle}">
@@ -332,17 +338,23 @@
Grid.Column="0"
Margin="4"
VerticalAlignment="Center"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_ItemIcon_204}"/>
<StackPanel
Grid.Column="1"
Margin="8,0,0,0"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding DailyNote.HomeCoinFormatted, Mode=OneWay}"/>
<TextBlock
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding DailyNote.HomeCoinFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.HomeCoinRecoveryTargetTimeFormatted, Mode=OneWay}"/>
Text="{Binding DailyNote.HomeCoinRecoveryTargetTimeFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
<Grid Style="{ThemeResource BorderGridStyle}">
@@ -363,17 +375,23 @@
Grid.Column="0"
Margin="4"
VerticalAlignment="Center"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_MarkQuest_Events_Proce}"/>
<StackPanel
Grid.Column="1"
Margin="8,0,0,0"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding DailyNote.TaskFormatted, Mode=OneWay}"/>
<TextBlock
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding DailyNote.TaskFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.ExtraTaskRewardDescription, Mode=OneWay}"/>
Text="{Binding DailyNote.ExtraTaskRewardDescription, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
<Grid Style="{ThemeResource BorderGridStyle}">
@@ -394,17 +412,23 @@
Grid.Column="0"
Margin="4"
VerticalAlignment="Center"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_MarkTower}"/>
<StackPanel
Grid.Column="1"
Margin="8,0,0,0"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding DailyNote.ResinDiscountFormatted, Mode=OneWay}"/>
<TextBlock
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding DailyNote.ResinDiscountFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewPageDailyNoteResinDiscountUsed}"/>
Text="{shcm:ResourceString Name=ViewPageDailyNoteResinDiscountUsed}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
<Grid Style="{ThemeResource BorderGridStyle}">
@@ -425,17 +449,23 @@
Grid.Column="0"
Margin="4"
VerticalAlignment="Center"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{StaticResource UI_ItemIcon_220021}"/>
<StackPanel
Grid.Column="1"
Margin="8,0,0,0"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding DailyNote.Transformer.ObtainedAndReachedFormatted, Mode=OneWay}"/>
<TextBlock
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{Binding DailyNote.Transformer.ObtainedAndReachedFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding DailyNote.Transformer.ObtainedAndTimeFormatted, Mode=OneWay}"/>
Text="{Binding DailyNote.Transformer.ObtainedAndTimeFormatted, Mode=OneWay}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</StackPanel>
</Grid>
</StackPanel>
@@ -472,7 +502,7 @@
Value="{Binding PassedTime, Mode=OneWay}"/>
<shci:CachedImage
Margin="0,0,0,8"
shvh:FrameworkElementHelper.SquareLength="32"
shch:FrameworkElementHelper.SquareLength="32"
Source="{Binding AvatarSideIcon, Mode=OneWay}"/>
<TextBlock
Grid.Column="1"
@@ -489,10 +519,12 @@
Margin="0,6,0,0"
Opacity="0.7"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding RefreshTimeFormatted}"/>
Text="{Binding RefreshTimeFormatted}"
TextTrimming="CharacterEllipsis"
TextWrapping="NoWrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</cwuc:AdaptiveGridView.ItemTemplate>
</cwuc:AdaptiveGridView>
</ScrollViewer>
</SplitView>

View File

@@ -22,7 +22,7 @@
<Page.Resources>
<DataTemplate x:Key="TeamItemTemplate" d:DataType="shvcom:Team">
<Border Margin="12,0,12,12" Style="{StaticResource BorderCardStyle}">
<Border Margin="0,0,0,8" Style="{StaticResource BorderCardStyle}">
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
@@ -31,7 +31,7 @@
<ItemsControl HorizontalAlignment="Left" ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwuc:UniformGrid ColumnSpacing="6" Columns="4"/>
<StackPanel Orientation="Horizontal" Spacing="6"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
@@ -113,21 +113,19 @@
</Pivot.HeaderTemplate>
<Pivot.ItemTemplate>
<DataTemplate>
<ScrollViewer>
<GridView
Margin="16,16,6,-6"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}"
ItemsSource="{Binding Avatars}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<DataTemplate>
<shvcon:BottomTextControl Text="{Binding Rate}">
<shvcon:ItemIcon Icon="{Binding Icon}" Quality="{Binding Quality}"/>
</shvcon:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
</ScrollViewer>
<GridView
Padding="16,16,4,0"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}"
ItemsSource="{Binding Avatars}"
SelectionMode="None">
<GridView.ItemTemplate>
<DataTemplate>
<shvcon:BottomTextControl Text="{Binding Rate}">
<shvcon:ItemIcon Icon="{Binding Icon}" Quality="{Binding Quality}"/>
</shvcon:BottomTextControl>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>
@@ -141,21 +139,19 @@
</Pivot.HeaderTemplate>
<Pivot.ItemTemplate>
<DataTemplate>
<ScrollViewer>
<GridView
Margin="16,16,6,-6"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}"
ItemsSource="{Binding Avatars}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<DataTemplate>
<shvcon:BottomTextControl Text="{Binding Rate}">
<shvcon:ItemIcon Icon="{Binding Icon}" Quality="{Binding Quality}"/>
</shvcon:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
</ScrollViewer>
<GridView
Padding="16,16,4,0"
ItemContainerStyle="{StaticResource LargeGridViewItemStyle}"
ItemsSource="{Binding Avatars}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<DataTemplate>
<shvcon:BottomTextControl Text="{Binding Rate}">
<shvcon:ItemIcon Icon="{Binding Icon}" Quality="{Binding Quality}"/>
</shvcon:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>
@@ -175,19 +171,20 @@
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" Margin="0,12,0,0">
<ItemsControl
ItemTemplate="{StaticResource TeamItemTemplate}"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}"
ItemsSource="{Binding Up}"/>
</ScrollViewer>
<ScrollViewer Grid.Column="1" Margin="0,12,0,0">
<ItemsControl
ItemTemplate="{StaticResource TeamItemTemplate}"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}"
ItemsSource="{Binding Down}"/>
</ScrollViewer>
<ListView
Grid.Column="0"
Margin="0,0,0,0"
Padding="0,8,0,0"
ItemTemplate="{StaticResource TeamItemTemplate}"
ItemsSource="{Binding Up}"
SelectionMode="None"/>
<ListView
Grid.Column="1"
Margin="0,0,0,0"
Padding="0,8,0,0"
ItemTemplate="{StaticResource TeamItemTemplate}"
ItemsSource="{Binding Down}"
SelectionMode="None"/>
</Grid>
</DataTemplate>
</Pivot.ItemTemplate>
@@ -266,58 +263,58 @@
Style="{StaticResource CaptionTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewPageHutaoDatabaseOverviewConstellation6}"/>
</Grid>
<ScrollViewer Grid.Row="1">
<ItemsControl
Margin="0,0,0,8"
HorizontalContentAlignment="Stretch"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}"
ItemsSource="{Binding AvatarConstellationInfos}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Margin="16,0,16,8" Style="{StaticResource BorderCardStyle}">
<Grid>
<ListView
Grid.Row="1"
Margin="0,0,4,0"
HorizontalContentAlignment="Stretch"
ItemsPanel="{StaticResource ItemsStackPanelTemplate}"
ItemsSource="{Binding AvatarConstellationInfos}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Margin="0,0,0,8" Style="{StaticResource BorderCardStyle}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<shvcon:ItemIcon
Width="48"
Height="48"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<Grid Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="7*"/>
</Grid.ColumnDefinitions>
<shvcon:ItemIcon
Width="48"
Height="48"
Icon="{Binding Icon}"
Quality="{Binding Quality}"/>
<Grid Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="7*"/>
</Grid.ColumnDefinitions>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Rate}"/>
<ItemsControl Grid.Column="1" ItemsSource="{Binding Rates}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwuc:UniformGrid Columns="7"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Rate}"/>
<ItemsControl Grid.Column="1" ItemsSource="{Binding Rates}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwuc:UniformGrid Columns="7"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListView>
</Grid>
</PivotItem>
</Pivot>

View File

@@ -34,6 +34,12 @@
<Pivot>
<Pivot.RightHeader>
<CommandBar DefaultLabelPosition="Right">
<CommandBar.Content>
<TextBlock
Margin="12,14,12,0"
VerticalAlignment="Center"
Text="{Binding LaunchStatusOptions.LaunchStatus.Description}"/>
</CommandBar.Content>
<AppBarButton
Command="{Binding OpenScreenshotFolderCommand}"
Icon="{shcm:FontIcon Glyph=&#xED25;}"

View File

@@ -112,17 +112,6 @@
SelectedItem="{Binding SelectedBackdropType, Mode=TwoWay}"/>
</cwc:SettingsCard>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingGachaLogHeader}"/>
<cwc:SettingsCard
Description="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleDescription}"
Header="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleHeader}"
HeaderIcon="{shcm:FontIcon Glyph=&#xE81C;}">
<ToggleSwitch
IsOn="{Binding Options.IsEmptyHistoryWishVisible, Mode=TwoWay}"
OffContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOff}"
OnContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOn}"/>
</cwc:SettingsCard>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingGameHeader}"/>
<InfoBar
IsClosable="False"
@@ -146,6 +135,27 @@
HeaderIcon="{shcm:FontIcon Glyph=&#xE74D;}"
IsClickEnabled="True"/>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingGachaLogHeader}"/>
<cwc:SettingsCard
Description="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleDescription}"
Header="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleHeader}"
HeaderIcon="{shcm:FontIcon Glyph=&#xE81C;}">
<ToggleSwitch
IsOn="{Binding Options.IsEmptyHistoryWishVisible, Mode=TwoWay}"
OffContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOff}"
OnContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOn}"/>
</cwc:SettingsCard>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingGeetestVerificationHeader}"/>
<cwc:SettingsCard
ActionIcon="{shcm:FontIcon Glyph=&#xF32A;}"
ActionIconToolTip="{shcm:ResourceString Name=ViewPageSettingGeetestCustomUrlAction}"
Command="{Binding ConfigureGeetestUrlCommand}"
Description="{shcm:ResourceString Name=ViewPageSettingGeetestCustomUrlDescription}"
Header="{shcm:ResourceString Name=ViewPageSettingGeetestCustomUrlHeader}"
HeaderIcon="{shcm:FontIcon Glyph=&#xE776;}"
IsClickEnabled="True"/>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" Text="{shcm:ResourceString Name=ViewPageSettingStorageHeader}"/>
<cwc:SettingsCard
ActionIcon="{shcm:FontIcon Glyph=&#xE76C;}"

View File

@@ -3,6 +3,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
xmlns:cwh="using:CommunityToolkit.WinUI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
@@ -16,7 +17,7 @@
mc:Ignorable="d">
<ScrollViewer>
<StackPanel Margin="16" Spacing="{StaticResource SettingsCardSpacing}">
<cwc:SettingsCard Header="AdoptCalculatorDialogTest" IsClickEnabled="True">
<cwc:SettingsCard Header="Adopt Calculator" IsClickEnabled="True">
<mxi:Interaction.Behaviors>
<mxic:EventTriggerBehavior EventName="Click">
<shcb:OpenAttachedFlyoutAction/>
@@ -37,7 +38,7 @@
</FlyoutBase.AttachedFlyout>
</cwc:SettingsCard>
<cwc:SettingsCard Header="CommunityGameRecordDialogTest" IsClickEnabled="True">
<cwc:SettingsCard Header="Community Game Record" IsClickEnabled="True">
<mxi:Interaction.Behaviors>
<mxic:EventTriggerBehavior EventName="Click">
<shcb:OpenAttachedFlyoutAction/>
@@ -58,15 +59,37 @@
</FlyoutBase.AttachedFlyout>
</cwc:SettingsCard>
<cwc:SettingsCard Header="RestartTest">
<cwc:SettingsCard Header="Reset Guide State">
<StackPanel Orientation="Horizontal">
<ToggleSwitch Name="ElevatedSwitch" Style="{StaticResource DefaultToggleSwitchStyle}"/>
<Button
Command="{Binding RestartAppCommand}"
CommandParameter="{Binding ElementName=ElevatedSwitch, Path=IsOn}"
Content="Restart"/>
<Button Command="{Binding ResetGuideStateCommand}" Content="Reset (No restart)"/>
</StackPanel>
</cwc:SettingsCard>
<Expander
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Header="Upload Announcement">
<StackPanel Spacing="8">
<TextBox
Header="Title"
PlaceholderText="Please input title"
Text="{Binding Announcement.Title, Mode=TwoWay}"/>
<TextBox
Header="Link"
PlaceholderText="Please input link"
Text="{Binding Announcement.Link, Mode=TwoWay}"/>
<TextBox
AcceptsReturn="True"
Header="Content"
PlaceholderText="Please input content"
Text="{Binding Announcement.Content, Mode=TwoWay}"/>
<ComboBox
Header="Severity"
ItemsSource="{cwh:EnumValues Type=InfoBarSeverity}"
SelectedItem="{Binding Announcement.Severity, Mode=TwoWay}"/>
<Button Command="{Binding UploadAnnouncementCommand}" Content="Upload"/>
</StackPanel>
</Expander>
</StackPanel>
</ScrollViewer>
</shc:ScopedPage>

View File

@@ -118,6 +118,9 @@
ItemsSource="{Binding Avatars}"
SelectedItem="{Binding Selected, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
@@ -288,13 +291,13 @@
Margin="16,16,0,0"
ItemsSource="{Binding Selected.CultivationItemsView}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<GridView.ItemTemplate>
<DataTemplate>
<shvc:BottomTextControl Text="{Binding Name}">
<shvc:ItemIcon Icon="{Binding Icon, Converter={StaticResource ItemIconConverter}}" Quality="{Binding RankLevel}"/>
</shvc:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView.ItemTemplate>
</GridView>
<TextBlock
@@ -592,6 +595,9 @@
ItemsSource="{Binding Avatars}"
SelectedItem="{Binding Selected, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<GridView.ItemTemplate>
<DataTemplate>
<shvc:BottomTextControl Text="{Binding Name}">

View File

@@ -87,6 +87,9 @@
ItemsSource="{Binding Weapons}"
SelectedItem="{Binding Selected, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
@@ -113,7 +116,6 @@
</SplitView.Pane>
<SplitView.Content>
<ScrollViewer>
<StackPanel
MaxWidth="800"
Margin="0,0,16,0"
@@ -134,7 +136,10 @@
<mxi:Interaction.Behaviors>
<shcb:AutoHeightBehavior TargetHeight="1024" TargetWidth="2048"/>
</mxi:Interaction.Behaviors>
<ScrollViewer Grid.Column="0" Margin="16">
<ScrollViewer
Grid.Column="0"
Margin="16"
VerticalScrollBarVisibility="Hidden">
<StackPanel>
<shvc:BottomTextControl
MaxWidth="80"
@@ -189,13 +194,13 @@
Margin="16,16,0,0"
ItemsSource="{Binding Selected.CultivationItemsView}"
SelectionMode="None">
<ItemsControl.ItemTemplate>
<GridView.ItemTemplate>
<DataTemplate>
<shvc:BottomTextControl Text="{Binding Name}">
<shvc:ItemIcon Icon="{Binding Icon, Converter={StaticResource ItemIconConverter}}" Quality="{Binding RankLevel}"/>
</shvc:BottomTextControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</GridView.ItemTemplate>
</GridView>
<StackPanel Visibility="{Binding Selected.Affix, Converter={StaticResource EmptyObjectToVisibilityConverter}}">
<TextBlock
@@ -255,6 +260,9 @@
ItemsSource="{Binding Weapons}"
SelectedItem="{Binding Selected, Mode=TwoWay}"
SelectionMode="Single">
<mxi:Interaction.Behaviors>
<shcb:SelectedItemInViewBehavior/>
</mxi:Interaction.Behaviors>
<GridView.ItemTemplate>
<DataTemplate>
<shvc:BottomTextControl Text="{Binding Name}">

View File

@@ -8,14 +8,13 @@
xmlns:mxic="using:Microsoft.Xaml.Interactions.Core"
xmlns:mxim="using:Microsoft.Xaml.Interactions.Media"
xmlns:shc="using:Snap.Hutao.Control"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shvu="using:Snap.Hutao.ViewModel.User"
d:DataContext="{d:DesignInstance shvu:UserViewModel}"
mc:Ignorable="d">
<mxi:Interaction.Behaviors>
<mxic:EventTriggerBehavior EventName="Loaded">
<mxic:InvokeCommandAction Command="{Binding OpenUICommand}"/>
</mxic:EventTriggerBehavior>
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<StackPanel>
<Button

View File

@@ -1,74 +0,0 @@
<UserControl
x:Class="Snap.Hutao.View.WelcomeView"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shv="using:Snap.Hutao.ViewModel"
d:DataContext="{d:DesignInstance shv:WelcomeViewModel}"
Unloaded="OnUnloaded"
mc:Ignorable="d">
<mxi:Interaction.Behaviors>
<shcb:InvokeCommandOnLoadedBehavior Command="{Binding OpenUICommand}"/>
</mxi:Interaction.Behaviors>
<Grid Margin="0,44,0,0">
<ScrollViewer>
<StackPanel Margin="32,0" HorizontalAlignment="Left">
<TextBlock Style="{StaticResource TitleTextBlockStyle}" Text="{shcm:ResourceString Name=ViewWelcomeTitle}"/>
<TextBlock
Margin="0,8,0,0"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewWelcomeSubtitle}"/>
<TextBlock
Margin="0,8,0,0"
Style="{StaticResource BaseTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewWelcomeBase}"/>
<TextBlock
Margin="0,0,0,8"
Style="{StaticResource BodyTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewWelcomeBody}"/>
<ItemsControl
Width="256"
Margin="0,0,0,32"
HorizontalAlignment="Left"
ItemsSource="{Binding DownloadSummaries}">
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<AddDeleteThemeTransition/>
<ContentThemeTransition/>
<ReorderThemeTransition/>
<EntranceThemeTransition IsStaggeringEnabled="False"/>
</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Margin="0,4,0,0" Style="{StaticResource BorderCardStyle}">
<StackPanel Margin="8">
<TextBlock Text="{Binding DisplayName}"/>
<ProgressBar
Margin="0,4,0,0"
Maximum="1"
Value="{Binding ProgressValue}"/>
<TextBlock
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding Description}"/>
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
<Image
MaxWidth="640"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Source="ms-appx:///Resource/WelcomeView_Background.png"/>
</Grid>
</UserControl>

View File

@@ -1,32 +0,0 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Microsoft.UI.Xaml.Controls;
using Snap.Hutao.ViewModel.Guide;
namespace Snap.Hutao.View;
/// <summary>
/// 欢迎视图
/// </summary>
[HighQuality]
internal sealed partial class WelcomeView : UserControl
{
private readonly IServiceScope serviceScope;
/// <summary>
/// 构造一个新的欢迎视图
/// </summary>
public WelcomeView()
{
InitializeComponent();
serviceScope = Ioc.Default.CreateScope();
DataContext = serviceScope.ServiceProvider.GetRequiredService<WelcomeViewModel>();
}
private void OnUnloaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
DataContext = null;
serviceScope.Dispose();
}
}

Some files were not shown because too many files have changed in this diff Show More