mirror of
https://github.com/HolographicHat/Yae.git
synced 2025-12-12 17:38:13 +08:00
Add en lang
This commit is contained in:
@@ -18,4 +18,19 @@
|
|||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2-beta1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2-beta1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Update="res\App.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>App.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="res\App.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>App.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
386
res/App.Designer.cs
generated
Normal file
386
res/App.Designer.cs
generated
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace YaeAchievement.res {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class App {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal App() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("YaeAchievement.res.App", typeof(App).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 全部成就.
|
||||||
|
/// </summary>
|
||||||
|
internal static string AllAchievement {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AllAchievement", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 另一个实例正在运行,请关闭后重试.
|
||||||
|
/// </summary>
|
||||||
|
internal static string AnotherInstance {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AnotherInstance", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to YaeAchievement - 原神成就导出工具 ({0}).
|
||||||
|
/// </summary>
|
||||||
|
internal static string AppBanner {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AppBanner", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 自动读取到游戏路径: {0}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ConfigInitGotPath {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ConfigInitGotPath", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 如果确认路径无误,请按 Y ;若有误或需要自行选择,请按 N .
|
||||||
|
/// </summary>
|
||||||
|
internal static string ConfigInitPathConfirm {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ConfigInitPathConfirm", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 下载地址: {0}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string DownloadLink {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("DownloadLink", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 导出至:
|
||||||
|
///[0] 椰羊 (https://cocogoat.work/achievement, 默认)
|
||||||
|
///[1] SnapGenshin
|
||||||
|
///[2] Paimon.moe
|
||||||
|
///[3] Seelie.me
|
||||||
|
///[4] 表格文件
|
||||||
|
///[5] 寻空
|
||||||
|
///[6] 原魔工具箱
|
||||||
|
///输入一个数字 (0-6): .
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportChoose {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportChoose", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 导出失败, 请联系开发者以获取帮助.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToCocogoatFail {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToCocogoatFail", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 在浏览器内进行下一步操作.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToCocogoatSuccess {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToCocogoatSuccess", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 成就数据已导出至 {0}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToFileSuccess {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToFileSuccess", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 更新 SnapGenshin 至最新版本后重试.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToSnapGenshinNeedUpdate {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToSnapGenshinNeedUpdate", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 在 SnapGenshin 进行下一步操作.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToSnapGenshinSuccess {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToSnapGenshinSuccess", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 在小程序导入页面输入以下代码: {0}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToWxApp1Success {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToWxApp1Success", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 更新寻空至最新版本后重试.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToXunkongNeedUpdate {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToXunkongNeedUpdate", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 在寻空中进行下一步操作.
|
||||||
|
/// </summary>
|
||||||
|
internal static string ExportToXunkongSuccess {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ExportToXunkongSuccess", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 原神正在启动 ({0}).
|
||||||
|
/// </summary>
|
||||||
|
internal static string GameLoading {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("GameLoading", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 游戏进程异常退出.
|
||||||
|
/// </summary>
|
||||||
|
internal static string GameProcessExit {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("GameProcessExit", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 原神正在运行,请关闭后重试 ({0}).
|
||||||
|
/// </summary>
|
||||||
|
internal static string GenshinIsRunning {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("GenshinIsRunning", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 按任意键退出.
|
||||||
|
/// </summary>
|
||||||
|
internal static string PressKeyToExit {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PressKeyToExit", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 要重新获取数据,手动删除 cache\d1a8ef40a67a5929.miko 后重新启动 YaeAchievement.
|
||||||
|
/// </summary>
|
||||||
|
internal static string RefreshData {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("RefreshData", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 操作被取消.
|
||||||
|
/// </summary>
|
||||||
|
internal static string SelectCanceled {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SelectCanceled", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 国服/国际服主程序.
|
||||||
|
/// </summary>
|
||||||
|
internal static string SelectFilterName {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SelectFilterName", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 选择主程序.
|
||||||
|
/// </summary>
|
||||||
|
internal static string SelectTitle {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SelectTitle", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 已完成但未领取奖励.
|
||||||
|
/// </summary>
|
||||||
|
internal static string StatusFinished {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("StatusFinished", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 未知.
|
||||||
|
/// </summary>
|
||||||
|
internal static string StatusInvalid {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("StatusInvalid", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 已完成.
|
||||||
|
/// </summary>
|
||||||
|
internal static string StatusRewardTaken {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("StatusRewardTaken", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 未完成.
|
||||||
|
/// </summary>
|
||||||
|
internal static string StatusUnfinished {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("StatusUnfinished", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 更新内容:
|
||||||
|
///{0}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string UpdateDescription {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UpdateDescription", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 关闭程序后, 将压缩包解压至当前目录即可完成更新..
|
||||||
|
/// </summary>
|
||||||
|
internal static string UpdateDownloadFinish {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UpdateDownloadFinish", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 正在下载更新包....
|
||||||
|
/// </summary>
|
||||||
|
internal static string UpdateDownloading {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UpdateDownloading", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 有可用更新: {0} => {1}.
|
||||||
|
/// </summary>
|
||||||
|
internal static string UpdateNewVersion {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UpdateNewVersion", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 正在上报错误信息....
|
||||||
|
/// </summary>
|
||||||
|
internal static string UploadError {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UploadError", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 使用上一次获取到的成就数据.
|
||||||
|
/// </summary>
|
||||||
|
internal static string UsePreviousData {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UsePreviousData", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 安装完成后,重新打开 YaeAchievement.
|
||||||
|
/// </summary>
|
||||||
|
internal static string VcRuntimeAfterInstall {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("VcRuntimeAfterInstall", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 未安装 VcRuntime.
|
||||||
|
/// </summary>
|
||||||
|
internal static string VcRuntimeNotInstalled {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("VcRuntimeNotInstalled", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
127
res/App.en.resx
Normal file
127
res/App.en.resx
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
<root>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>1.3</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="ExportToCocogoatFail" xml:space="preserve">
|
||||||
|
<value>Fail, please contact developer to get help information</value>
|
||||||
|
</data>
|
||||||
|
<data name="AllAchievement" xml:space="preserve">
|
||||||
|
<value>all achievement</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportChoose" xml:space="preserve">
|
||||||
|
<value>Export to:
|
||||||
|
[0] Cocogoat (https://cocogoat.work/achievement, Default)
|
||||||
|
[1] SnapGenshin
|
||||||
|
[2] Paimon.moe
|
||||||
|
[3] Seelie.me
|
||||||
|
[4] Csv file
|
||||||
|
[5] Xunkong
|
||||||
|
Input a number (0-5): </value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToCocogoatSuccess" xml:space="preserve">
|
||||||
|
<value>Successfully exported to cocogoat.</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToWxApp1Success" xml:space="preserve">
|
||||||
|
<value>{0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToSnapGenshinSuccess" xml:space="preserve">
|
||||||
|
<value>Successfully exported to snap genshin.</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve">
|
||||||
|
<value>Please update SnapGenshin and retry.</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToFileSuccess" xml:space="preserve">
|
||||||
|
<value>Successfully exported to {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToXunkongSuccess" xml:space="preserve">
|
||||||
|
<value>Successfully exported to xunkong.</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToXunkongNeedUpdate" xml:space="preserve">
|
||||||
|
<value>Please update xunkong and retry.</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusInvalid" xml:space="preserve">
|
||||||
|
<value>Invalid</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusRewardTaken" xml:space="preserve">
|
||||||
|
<value>Finished</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusUnfinished" xml:space="preserve">
|
||||||
|
<value>Unfinished</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusFinished" xml:space="preserve">
|
||||||
|
<value>Reward not taken</value>
|
||||||
|
</data>
|
||||||
|
<data name="ConfigInitGotPath" xml:space="preserve">
|
||||||
|
<value>Detected game location: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ConfigInitPathConfirm" xml:space="preserve">
|
||||||
|
<value>If correct, input Y; otherwise input N</value>
|
||||||
|
</data>
|
||||||
|
<data name="VcRuntimeNotInstalled" xml:space="preserve">
|
||||||
|
<value>You need install Visual C++ Redistributable 2015-2022(latest) before run this application.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DownloadLink" xml:space="preserve">
|
||||||
|
<value>Download: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="VcRuntimeAfterInstall" xml:space="preserve">
|
||||||
|
<value>-</value>
|
||||||
|
</data>
|
||||||
|
<data name="GameProcessExit" xml:space="preserve">
|
||||||
|
<value>Game exited.</value>
|
||||||
|
</data>
|
||||||
|
<data name="GameLoading" xml:space="preserve">
|
||||||
|
<value>Game process start ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="UploadError" xml:space="preserve">
|
||||||
|
<value>Upload error to appcenter...</value>
|
||||||
|
</data>
|
||||||
|
<data name="PressKeyToExit" xml:space="preserve">
|
||||||
|
<value>Press any key to exit.</value>
|
||||||
|
</data>
|
||||||
|
<data name="GenshinIsRunning" xml:space="preserve">
|
||||||
|
<value>Please close game before run this application. ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectCanceled" xml:space="preserve">
|
||||||
|
<value>Operation canceled by user.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectTitle" xml:space="preserve">
|
||||||
|
<value>GenshinPath</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectFilterName" xml:space="preserve">
|
||||||
|
<value>Executable</value>
|
||||||
|
</data>
|
||||||
|
<data name="AnotherInstance" xml:space="preserve">
|
||||||
|
<value>Please close another instance.</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateNewVersion" xml:space="preserve">
|
||||||
|
<value>Has update: {0} => {1}</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDescription" xml:space="preserve">
|
||||||
|
<value>Description:
|
||||||
|
{0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDownloading" xml:space="preserve">
|
||||||
|
<value>Downloading update package...</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDownloadFinish" xml:space="preserve">
|
||||||
|
<value>Unzip the package to update application.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBanner" xml:space="preserve">
|
||||||
|
<value>YaeAchievement ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="UsePreviousData" xml:space="preserve">
|
||||||
|
<value>Use previous fetched data.</value>
|
||||||
|
</data>
|
||||||
|
<data name="RefreshData" xml:space="preserve">
|
||||||
|
<value>To fetch new data, Restart the application after delete cache\d1a8ef40a67a5929.miko.</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
135
res/App.resx
Normal file
135
res/App.resx
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>1.3</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="ExportToCocogoatFail" xml:space="preserve">
|
||||||
|
<value>导出失败, 请联系开发者以获取帮助</value>
|
||||||
|
</data>
|
||||||
|
<data name="AllAchievement" xml:space="preserve">
|
||||||
|
<value>全部成就</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportChoose" xml:space="preserve">
|
||||||
|
<value>导出至:
|
||||||
|
[0] 椰羊 (https://cocogoat.work/achievement, 默认)
|
||||||
|
[1] SnapGenshin
|
||||||
|
[2] Paimon.moe
|
||||||
|
[3] Seelie.me
|
||||||
|
[4] 表格文件
|
||||||
|
[5] 寻空
|
||||||
|
[6] 原魔工具箱
|
||||||
|
输入一个数字 (0-6): </value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToCocogoatSuccess" xml:space="preserve">
|
||||||
|
<value>在浏览器内进行下一步操作</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToWxApp1Success" xml:space="preserve">
|
||||||
|
<value>在小程序导入页面输入以下代码: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToSnapGenshinSuccess" xml:space="preserve">
|
||||||
|
<value>在 SnapGenshin 进行下一步操作</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve">
|
||||||
|
<value>更新 SnapGenshin 至最新版本后重试</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToFileSuccess" xml:space="preserve">
|
||||||
|
<value>成就数据已导出至 {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToXunkongSuccess" xml:space="preserve">
|
||||||
|
<value>在寻空中进行下一步操作</value>
|
||||||
|
</data>
|
||||||
|
<data name="ExportToXunkongNeedUpdate" xml:space="preserve">
|
||||||
|
<value>更新寻空至最新版本后重试</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusInvalid" xml:space="preserve">
|
||||||
|
<value>未知</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusFinished" xml:space="preserve">
|
||||||
|
<value>已完成但未领取奖励</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusUnfinished" xml:space="preserve">
|
||||||
|
<value>未完成</value>
|
||||||
|
</data>
|
||||||
|
<data name="StatusRewardTaken" xml:space="preserve">
|
||||||
|
<value>已完成</value>
|
||||||
|
</data>
|
||||||
|
<data name="ConfigInitGotPath" xml:space="preserve">
|
||||||
|
<value>自动读取到游戏路径: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="ConfigInitPathConfirm" xml:space="preserve">
|
||||||
|
<value>如果确认路径无误,请按 Y ;若有误或需要自行选择,请按 N </value>
|
||||||
|
</data>
|
||||||
|
<data name="VcRuntimeNotInstalled" xml:space="preserve">
|
||||||
|
<value>未安装 VcRuntime</value>
|
||||||
|
</data>
|
||||||
|
<data name="DownloadLink" xml:space="preserve">
|
||||||
|
<value>下载地址: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="VcRuntimeAfterInstall" xml:space="preserve">
|
||||||
|
<value>安装完成后,重新打开 YaeAchievement</value>
|
||||||
|
</data>
|
||||||
|
<data name="GameProcessExit" xml:space="preserve">
|
||||||
|
<value>游戏进程异常退出</value>
|
||||||
|
</data>
|
||||||
|
<data name="GameLoading" xml:space="preserve">
|
||||||
|
<value>原神正在启动 ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="UploadError" xml:space="preserve">
|
||||||
|
<value>正在上报错误信息...</value>
|
||||||
|
</data>
|
||||||
|
<data name="PressKeyToExit" xml:space="preserve">
|
||||||
|
<value>按任意键退出</value>
|
||||||
|
</data>
|
||||||
|
<data name="GenshinIsRunning" xml:space="preserve">
|
||||||
|
<value>原神正在运行,请关闭后重试 ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectCanceled" xml:space="preserve">
|
||||||
|
<value>操作被取消</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectTitle" xml:space="preserve">
|
||||||
|
<value>选择主程序</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelectFilterName" xml:space="preserve">
|
||||||
|
<value>国服/国际服主程序</value>
|
||||||
|
</data>
|
||||||
|
<data name="AnotherInstance" xml:space="preserve">
|
||||||
|
<value>另一个实例正在运行,请关闭后重试</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateNewVersion" xml:space="preserve">
|
||||||
|
<value>有可用更新: {0} => {1}</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDescription" xml:space="preserve">
|
||||||
|
<value>更新内容:
|
||||||
|
{0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDownloading" xml:space="preserve">
|
||||||
|
<value>正在下载更新包...</value>
|
||||||
|
</data>
|
||||||
|
<data name="UpdateDownloadFinish" xml:space="preserve">
|
||||||
|
<value>关闭程序后, 将压缩包解压至当前目录即可完成更新.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBanner" xml:space="preserve">
|
||||||
|
<value>YaeAchievement - 原神成就导出工具 ({0})</value>
|
||||||
|
</data>
|
||||||
|
<data name="UsePreviousData" xml:space="preserve">
|
||||||
|
<value>使用上一次获取到的成就数据</value>
|
||||||
|
</data>
|
||||||
|
<data name="RefreshData" xml:space="preserve">
|
||||||
|
<value>要重新获取数据,手动删除 cache\d1a8ef40a67a5929.miko 后重新启动 YaeAchievement</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using YaeAchievement.res;
|
||||||
|
|
||||||
namespace YaeAchievement;
|
namespace YaeAchievement;
|
||||||
|
|
||||||
@@ -21,8 +22,8 @@ public class AppConfig {
|
|||||||
if (_instance?.Location == null || !Utils.CheckGamePathValid(_instance.Location)) {
|
if (_instance?.Location == null || !Utils.CheckGamePathValid(_instance.Location)) {
|
||||||
var gameInstallPath = Utils.FindGamePathFromRegistry();
|
var gameInstallPath = Utils.FindGamePathFromRegistry();
|
||||||
if (!string.IsNullOrEmpty(gameInstallPath)) {
|
if (!string.IsNullOrEmpty(gameInstallPath)) {
|
||||||
Console.WriteLine($"自动读取到游戏路径: {gameInstallPath}");
|
Console.WriteLine(App.ConfigInitGotPath, gameInstallPath);
|
||||||
Console.WriteLine($"如果确认路径无误,请按 Y ;若有误或需要自行选择,请按 N ");
|
Console.WriteLine(App.ConfigInitPathConfirm);
|
||||||
var key = Console.ReadKey().Key;
|
var key = Console.ReadKey().Key;
|
||||||
gameInstallPath = key == ConsoleKey.Y ? gameInstallPath : Utils.SelectGameExecutable();
|
gameInstallPath = key == ConsoleKey.Y ? gameInstallPath : Utils.SelectGameExecutable();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
|
using System.Net;
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using YaeAchievement.res;
|
||||||
using static AchievementAllDataNotify.Types.Achievement.Types;
|
using static AchievementAllDataNotify.Types.Achievement.Types;
|
||||||
|
|
||||||
namespace YaeAchievement;
|
namespace YaeAchievement;
|
||||||
@@ -10,25 +10,15 @@ namespace YaeAchievement;
|
|||||||
public static class Export {
|
public static class Export {
|
||||||
|
|
||||||
public static void Choose(AchievementAllDataNotify data) {
|
public static void Choose(AchievementAllDataNotify data) {
|
||||||
Console.Write("""
|
Console.Write(App.ExportChoose);
|
||||||
导出至:
|
|
||||||
[0] 椰羊 (https://cocogoat.work/achievement, 默认)
|
|
||||||
[1] SnapGenshin
|
|
||||||
[2] Paimon.moe
|
|
||||||
[3] Seelie.me
|
|
||||||
[4] 表格文件
|
|
||||||
[5] 原魔工具箱
|
|
||||||
[6] 寻空
|
|
||||||
输入一个数字(0-6):
|
|
||||||
""");
|
|
||||||
if (!int.TryParse(Console.ReadLine(), out var num)) num = 0;
|
if (!int.TryParse(Console.ReadLine(), out var num)) num = 0;
|
||||||
((Action<AchievementAllDataNotify>) (num switch {
|
((Action<AchievementAllDataNotify>) (num switch {
|
||||||
1 => ToSnapGenshin,
|
1 => ToSnapGenshin,
|
||||||
2 => ToPaimon,
|
2 => ToPaimon,
|
||||||
3 => ToSeelie,
|
3 => ToSeelie,
|
||||||
4 => ToCSV,
|
4 => ToCSV,
|
||||||
5 => ToWxApp1,
|
5 => ToXunkong,
|
||||||
6 => ToXunkong,
|
6 => ToWxApp1,
|
||||||
7 => ToRawJson,
|
7 => ToRawJson,
|
||||||
_ => ToCocogoat
|
_ => ToCocogoat
|
||||||
})).Invoke(data);
|
})).Invoke(data);
|
||||||
@@ -38,17 +28,17 @@ public static class Export {
|
|||||||
var result = JsonConvert.SerializeObject(ExportToUIAFApp(data));
|
var result = JsonConvert.SerializeObject(ExportToUIAFApp(data));
|
||||||
using var request = new HttpRequestMessage {
|
using var request = new HttpRequestMessage {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
RequestUri = new Uri("https://77.cocogoat.work/v1/memo?source=全部成就"),
|
RequestUri = new Uri($"https://77.cocogoat.work/v1/memo?source={App.AllAchievement}"),
|
||||||
Content = new StringContent(result, Encoding.UTF8, "application/json")
|
Content = new StringContent(result, Encoding.UTF8, "application/json")
|
||||||
};
|
};
|
||||||
using var response = Utils.CHttpClient.Value.Send(request);
|
using var response = Utils.CHttpClient.Value.Send(request);
|
||||||
if (response.StatusCode != HttpStatusCode.Created) {
|
if (response.StatusCode != HttpStatusCode.Created) {
|
||||||
Console.WriteLine("导出失败, 请联系开发者以获取帮助");
|
Console.WriteLine(App.ExportToCocogoatFail);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dynamic memo = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result)!;
|
dynamic memo = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result)!;
|
||||||
Console.WriteLine(Utils.ShellOpen($"https://cocogoat.work/achievement?memo={memo.key}")
|
Console.WriteLine(Utils.ShellOpen($"https://cocogoat.work/achievement?memo={memo.key}")
|
||||||
? "在浏览器内进行下一步操作"
|
? App.ExportToCocogoatSuccess
|
||||||
: $"https://cocogoat.work/achievement?memo={memo.key}");
|
: $"https://cocogoat.work/achievement?memo={memo.key}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,16 +54,16 @@ public static class Export {
|
|||||||
Content = new StringContent(result, Encoding.UTF8, "application/json")
|
Content = new StringContent(result, Encoding.UTF8, "application/json")
|
||||||
};
|
};
|
||||||
using var response = Utils.CHttpClient.Value.Send(request);
|
using var response = Utils.CHttpClient.Value.Send(request);
|
||||||
Console.WriteLine($"在小程序导入页面输入以下代码: {id}");
|
Console.WriteLine(App.ExportToWxApp1Success, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ToSnapGenshin(AchievementAllDataNotify data) {
|
private static void ToSnapGenshin(AchievementAllDataNotify data) {
|
||||||
if (CheckSnapScheme()) {
|
if (CheckSnapScheme()) {
|
||||||
Utils.CopyToClipboard(JsonConvert.SerializeObject(ExportToUIAFApp(data)));
|
Utils.CopyToClipboard(JsonConvert.SerializeObject(ExportToUIAFApp(data)));
|
||||||
Utils.ShellOpen("snapgenshin://achievement/import/uiaf");
|
Utils.ShellOpen("snapgenshin://achievement/import/uiaf");
|
||||||
Console.WriteLine("在 SnapGenshin 进行下一步操作");
|
Console.WriteLine(App.ExportToSnapGenshinSuccess);
|
||||||
} else {
|
} else {
|
||||||
Console.WriteLine("更新 SnapGenshin 至最新版本后重试");
|
Console.WriteLine(App.ExportToSnapGenshinNeedUpdate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +72,7 @@ public static class Export {
|
|||||||
var output = new Dictionary<uint, Dictionary<uint, bool>>();
|
var output = new Dictionary<uint, Dictionary<uint, bool>>();
|
||||||
foreach (var ach in data.List.Where(a => a.Status is Status.Finished or Status.RewardTaken)) {
|
foreach (var ach in data.List.Where(a => a.Status is Status.Finished or Status.RewardTaken)) {
|
||||||
if (!info.Items.TryGetValue(ach.Id, out var achInfo) || achInfo == null) {
|
if (!info.Items.TryGetValue(ach.Id, out var achInfo) || achInfo == null) {
|
||||||
Console.WriteLine($"Unable to find {ach.Id} in metadata.");
|
Console.WriteLine($@"Unable to find {ach.Id} in metadata.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var map = output.GetValueOrDefault(achInfo.Group, new Dictionary<uint, bool>());
|
var map = output.GetValueOrDefault(achInfo.Group, new Dictionary<uint, bool>());
|
||||||
@@ -94,7 +84,7 @@ public static class Export {
|
|||||||
};
|
};
|
||||||
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-paimon.json");
|
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-paimon.json");
|
||||||
File.WriteAllText(path, JsonConvert.SerializeObject(final));
|
File.WriteAllText(path, JsonConvert.SerializeObject(final));
|
||||||
Console.WriteLine($"成就数据已导出至 {path}");
|
Console.WriteLine(App.ExportToFileSuccess, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ToSeelie(AchievementAllDataNotify data) {
|
private static void ToSeelie(AchievementAllDataNotify data) {
|
||||||
@@ -109,7 +99,7 @@ public static class Export {
|
|||||||
};
|
};
|
||||||
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-seelie.json");
|
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-seelie.json");
|
||||||
File.WriteAllText(path, JsonConvert.SerializeObject(final));
|
File.WriteAllText(path, JsonConvert.SerializeObject(final));
|
||||||
Console.WriteLine($"成就数据已导出至 {path}");
|
Console.WriteLine(App.ExportToFileSuccess, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
@@ -119,7 +109,7 @@ public static class Export {
|
|||||||
foreach (var ach in data.List.OrderBy(a => a.Id)) {
|
foreach (var ach in data.List.OrderBy(a => a.Id)) {
|
||||||
if (UnusedAchievement.Contains(ach.Id)) continue;
|
if (UnusedAchievement.Contains(ach.Id)) continue;
|
||||||
if (!info.Items.TryGetValue(ach.Id, out var achInfo) || achInfo == null) {
|
if (!info.Items.TryGetValue(ach.Id, out var achInfo) || achInfo == null) {
|
||||||
Console.WriteLine($"Unable to find {ach.Id} in metadata.");
|
Console.WriteLine($@"Unable to find {ach.Id} in metadata.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var finishAt = "";
|
var finishAt = "";
|
||||||
@@ -140,16 +130,16 @@ public static class Export {
|
|||||||
}));
|
}));
|
||||||
var path = Path.GetFullPath($"achievement-{DateTime.Now:yyyyMMddHHmmss}.csv");
|
var path = Path.GetFullPath($"achievement-{DateTime.Now:yyyyMMddHHmmss}.csv");
|
||||||
File.WriteAllText(path, $"\uFEFF{string.Join("\n", output)}");
|
File.WriteAllText(path, $"\uFEFF{string.Join("\n", output)}");
|
||||||
Console.WriteLine($"成就数据已导出至 {path}");
|
Console.WriteLine(App.ExportToFileSuccess, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ToXunkong(AchievementAllDataNotify data) {
|
private static void ToXunkong(AchievementAllDataNotify data) {
|
||||||
if (CheckXunkongScheme()) {
|
if (CheckXunkongScheme()) {
|
||||||
Utils.CopyToClipboard(JsonConvert.SerializeObject(ExportToUIAFApp(data)));
|
Utils.CopyToClipboard(JsonConvert.SerializeObject(ExportToUIAFApp(data)));
|
||||||
Utils.ShellOpen("xunkong://import-achievement?caller=YaeAchievement&from=clipboard");
|
Utils.ShellOpen("xunkong://import-achievement?caller=YaeAchievement&from=clipboard");
|
||||||
Console.WriteLine("在寻空中进行下一步操作");
|
Console.WriteLine(App.ExportToXunkongSuccess);
|
||||||
} else {
|
} else {
|
||||||
Console.WriteLine("更新寻空至最新版本后重试");
|
Console.WriteLine(App.ExportToXunkongNeedUpdate);
|
||||||
Utils.ShellOpen("ms-windows-store://pdp/?productid=9N2SVG0JMT12");
|
Utils.ShellOpen("ms-windows-store://pdp/?productid=9N2SVG0JMT12");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,7 +147,7 @@ public static class Export {
|
|||||||
private static void ToRawJson(AchievementAllDataNotify data) {
|
private static void ToRawJson(AchievementAllDataNotify data) {
|
||||||
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-raw.json");
|
var path = Path.GetFullPath($"export-{DateTime.Now:yyyyMMddHHmmss}-raw.json");
|
||||||
File.WriteAllText(path, JsonConvert.SerializeObject(data, Formatting.Indented));
|
File.WriteAllText(path, JsonConvert.SerializeObject(data, Formatting.Indented));
|
||||||
Console.WriteLine($"成就数据已导出至 {path}");
|
Console.WriteLine(App.ExportToFileSuccess, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
@@ -200,10 +190,10 @@ public static class Export {
|
|||||||
|
|
||||||
private static string ToDesc(this Status status) {
|
private static string ToDesc(this Status status) {
|
||||||
return status switch {
|
return status switch {
|
||||||
Status.Invalid => "未知",
|
Status.Invalid => App.StatusInvalid,
|
||||||
Status.Finished => "已完成但未领取奖励",
|
Status.Finished => App.StatusFinished,
|
||||||
Status.Unfinished => "未完成",
|
Status.Unfinished => App.StatusUnfinished,
|
||||||
Status.RewardTaken => "已完成",
|
Status.RewardTaken => App.StatusRewardTaken,
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(status), status, null)
|
_ => throw new ArgumentOutOfRangeException(nameof(status), status, null)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
using YaeAchievement;
|
using YaeAchievement;
|
||||||
using YaeAchievement.AppCenterSDK;
|
using YaeAchievement.AppCenterSDK;
|
||||||
using YaeAchievement.AppCenterSDK.Models;
|
using YaeAchievement.AppCenterSDK.Models;
|
||||||
|
using YaeAchievement.res;
|
||||||
using static YaeAchievement.Utils;
|
using static YaeAchievement.Utils;
|
||||||
|
|
||||||
InstallExitHook();
|
InstallExitHook();
|
||||||
|
|
||||||
CheckVcRuntime();
|
CheckVcRuntime();
|
||||||
CheckIsTempDir();
|
|
||||||
CheckSelfIsRunning();
|
CheckSelfIsRunning();
|
||||||
TryDisableQuickEdit();
|
TryDisableQuickEdit();
|
||||||
InstallExceptionHook();
|
InstallExceptionHook();
|
||||||
CheckGenshinIsRunning();
|
CheckGenshinIsRunning();
|
||||||
|
|
||||||
Console.WriteLine("----------------------------------------------------");
|
Console.WriteLine(@"----------------------------------------------------");
|
||||||
Console.WriteLine($"YaeAchievement - 原神成就导出工具 ({GlobalVars.AppVersionName})");
|
Console.WriteLine(App.AppBanner, GlobalVars.AppVersionName);
|
||||||
Console.WriteLine("https://github.com/HolographicHat/YaeAchievement");
|
Console.WriteLine(@"https://github.com/HolographicHat/YaeAchievement");
|
||||||
Console.WriteLine("----------------------------------------------------");
|
Console.WriteLine(@"----------------------------------------------------");
|
||||||
|
|
||||||
AppConfig.Load();
|
AppConfig.Load();
|
||||||
CheckUpdate();
|
CheckUpdate();
|
||||||
@@ -28,8 +28,8 @@ new EventLog("AppInit") {
|
|||||||
}.Enqueue();
|
}.Enqueue();
|
||||||
var historyCache = new CacheFile("ExportData");
|
var historyCache = new CacheFile("ExportData");
|
||||||
if (historyCache.LastWriteTime.AddMinutes(10) > DateTime.UtcNow) {
|
if (historyCache.LastWriteTime.AddMinutes(10) > DateTime.UtcNow) {
|
||||||
Console.WriteLine("使用上一次获取到的成就数据");
|
Console.WriteLine(App.UsePreviousData);
|
||||||
Console.WriteLine("要重新获取数据,手动删除 cache\\d1a8ef40a67a5929.miko 后重新启动 YaeAchievement");
|
Console.WriteLine(App.RefreshData);
|
||||||
Export.Choose(AchievementAllDataNotify.Parser.ParseFrom(historyCache.Read().Content));
|
Export.Choose(AchievementAllDataNotify.Parser.ParseFrom(historyCache.Read().Content));
|
||||||
} else {
|
} else {
|
||||||
StartAndWaitResult(AppConfig.GamePath, str => {
|
StartAndWaitResult(AppConfig.GamePath, str => {
|
||||||
|
|||||||
46
src/Utils.cs
46
src/Utils.cs
@@ -6,6 +6,7 @@ using System.Net.Http.Headers;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using YaeAchievement.AppCenterSDK;
|
using YaeAchievement.AppCenterSDK;
|
||||||
|
using YaeAchievement.res;
|
||||||
using YaeAchievement.Win32;
|
using YaeAchievement.Win32;
|
||||||
using static YaeAchievement.Win32.OpenFileFlags;
|
using static YaeAchievement.Win32.OpenFileFlags;
|
||||||
|
|
||||||
@@ -67,17 +68,17 @@ public static class Utils {
|
|||||||
public static void CheckUpdate() {
|
public static void CheckUpdate() {
|
||||||
var info = UpdateInfo.Parser.ParseFrom(GetBucketFileAsByteArray("schicksal/version"))!;
|
var info = UpdateInfo.Parser.ParseFrom(GetBucketFileAsByteArray("schicksal/version"))!;
|
||||||
if (GlobalVars.AppVersionCode != info.VersionCode) {
|
if (GlobalVars.AppVersionCode != info.VersionCode) {
|
||||||
Console.WriteLine($"有可用更新: {GlobalVars.AppVersionName} => {info.VersionName}");
|
Console.WriteLine(App.UpdateNewVersion, GlobalVars.AppVersionName, info.VersionName);
|
||||||
Console.WriteLine($"更新内容: \n{info.Description}");
|
Console.WriteLine(App.UpdateDescription, info.Description);
|
||||||
if (info.EnableAutoDownload) {
|
if (info.EnableAutoDownload) {
|
||||||
Console.WriteLine("正在下载更新包...");
|
Console.WriteLine(App.UpdateDownloading);
|
||||||
var fullPath = Path.GetFullPath($"update.{Path.GetExtension(info.PackageLink)}");
|
var fullPath = Path.GetFullPath($"update.{Path.GetExtension(info.PackageLink)}");
|
||||||
File.WriteAllBytes(fullPath, GetBucketFileAsByteArray(info.PackageLink));
|
File.WriteAllBytes(fullPath, GetBucketFileAsByteArray(info.PackageLink));
|
||||||
Console.WriteLine("关闭程序后, 将压缩包解压至当前目录即可完成更新.");
|
Console.WriteLine(App.UpdateDownloadFinish);
|
||||||
ShellOpen(fullPath);
|
ShellOpen(fullPath);
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
Console.WriteLine($"下载地址: {info.PackageLink}");
|
Console.WriteLine(App.DownloadLink, info.PackageLink);
|
||||||
if (info.ForceUpdate) {
|
if (info.ForceUpdate) {
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
@@ -92,20 +93,13 @@ public static class Utils {
|
|||||||
var cur = Process.GetCurrentProcess();
|
var cur = Process.GetCurrentProcess();
|
||||||
foreach (var process in Process.GetProcesses().Where(process => process.Id != cur.Id)) {
|
foreach (var process in Process.GetProcesses().Where(process => process.Id != cur.Id)) {
|
||||||
if (process.ProcessName == cur.ProcessName) {
|
if (process.ProcessName == cur.ProcessName) {
|
||||||
Console.WriteLine("另一个实例正在运行,请关闭后重试");
|
Console.WriteLine(App.AnotherInstance);
|
||||||
Environment.Exit(302);
|
Environment.Exit(302);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Process.LeaveDebugMode();
|
Process.LeaveDebugMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CheckIsTempDir() {
|
|
||||||
if (GlobalVars.AppPath.Contains(Path.GetTempPath())) {
|
|
||||||
Console.WriteLine("请将程序完整解压后再运行");
|
|
||||||
Environment.Exit(303);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool ShellOpen(string path) {
|
public static bool ShellOpen(string path) {
|
||||||
return new Process {
|
return new Process {
|
||||||
StartInfo = {
|
StartInfo = {
|
||||||
@@ -129,14 +123,14 @@ public static class Utils {
|
|||||||
size = Marshal.SizeOf<OpenFileName>(),
|
size = Marshal.SizeOf<OpenFileName>(),
|
||||||
owner = Native.GetConsoleWindow(),
|
owner = Native.GetConsoleWindow(),
|
||||||
flags = Explorer | NoNetworkButton | FileMustExist | NoChangeDir,
|
flags = Explorer | NoNetworkButton | FileMustExist | NoChangeDir,
|
||||||
title = "选择主程序",
|
title = App.SelectTitle,
|
||||||
filter = "国服/国际服主程序 (YuanShen/GenshinImpact.exe)\0YuanShen.exe;GenshinImpact.exe\0",
|
filter = $"{App.SelectFilterName} (YuanShen/GenshinImpact.exe)\0YuanShen.exe;GenshinImpact.exe\0",
|
||||||
maxFile = 32768
|
maxFile = 32768
|
||||||
};
|
};
|
||||||
new Thread(() => {
|
new Thread(() => {
|
||||||
var handle = Native.FindWindow("#32770", "选择主程序");
|
var handle = Native.FindWindow("#32770", App.SelectTitle);
|
||||||
while (handle == IntPtr.Zero) {
|
while (handle == IntPtr.Zero) {
|
||||||
handle = Native.FindWindow("#32770", "选择主程序");
|
handle = Native.FindWindow("#32770", App.SelectTitle);
|
||||||
Thread.Sleep(1);
|
Thread.Sleep(1);
|
||||||
}
|
}
|
||||||
var currentThreadId = Native.GetCurrentThreadId();
|
var currentThreadId = Native.GetCurrentThreadId();
|
||||||
@@ -151,7 +145,7 @@ public static class Utils {
|
|||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
throw new SystemException($"Dialog error: {err}");
|
throw new SystemException($"Dialog error: {err}");
|
||||||
}
|
}
|
||||||
Console.WriteLine("操作被取消");
|
Console.WriteLine(App.SelectCanceled);
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
var path = Marshal.PtrToStringAuto(fnPtr)!;
|
var path = Marshal.PtrToStringAuto(fnPtr)!;
|
||||||
@@ -169,7 +163,7 @@ public static class Utils {
|
|||||||
Process.EnterDebugMode();
|
Process.EnterDebugMode();
|
||||||
foreach (var process in Process.GetProcesses()) {
|
foreach (var process in Process.GetProcesses()) {
|
||||||
if (process.ProcessName is "GenshinImpact" or "YuanShen" && !process.HasExited) {
|
if (process.ProcessName is "GenshinImpact" or "YuanShen" && !process.HasExited) {
|
||||||
Console.WriteLine($"原神正在运行,请关闭后重试 ({process.Id})");
|
Console.WriteLine(App.GenshinIsRunning, process.Id);
|
||||||
Environment.Exit(301);
|
Environment.Exit(301);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,7 +176,7 @@ public static class Utils {
|
|||||||
public static void InstallExitHook() {
|
public static void InstallExitHook() {
|
||||||
AppDomain.CurrentDomain.ProcessExit += (_, _) => {
|
AppDomain.CurrentDomain.ProcessExit += (_, _) => {
|
||||||
proc?.Kill();
|
proc?.Kill();
|
||||||
Console.WriteLine("按任意键退出");
|
Console.WriteLine(App.PressKeyToExit);
|
||||||
Console.ReadKey();
|
Console.ReadKey();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -190,7 +184,7 @@ public static class Utils {
|
|||||||
public static void InstallExceptionHook() {
|
public static void InstallExceptionHook() {
|
||||||
AppDomain.CurrentDomain.UnhandledException += (_, e) => {
|
AppDomain.CurrentDomain.UnhandledException += (_, e) => {
|
||||||
Console.WriteLine(e.ExceptionObject.ToString());
|
Console.WriteLine(e.ExceptionObject.ToString());
|
||||||
Console.WriteLine("正在上报错误信息...");
|
Console.WriteLine(App.UploadError);
|
||||||
AppCenter.TrackCrash((Exception) e.ExceptionObject);
|
AppCenter.TrackCrash((Exception) e.ExceptionObject);
|
||||||
AppCenter.Upload();
|
AppCenter.Upload();
|
||||||
Environment.Exit(-1);
|
Environment.Exit(-1);
|
||||||
@@ -212,13 +206,13 @@ public static class Utils {
|
|||||||
Environment.Exit(new Win32Exception().PrintMsgAndReturnErrCode("TerminateProcess fail"));
|
Environment.Exit(new Win32Exception().PrintMsgAndReturnErrCode("TerminateProcess fail"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Console.WriteLine($"原神正在启动 ({pid})");
|
Console.WriteLine(App.GameLoading, pid);
|
||||||
proc = Process.GetProcessById(Convert.ToInt32(pid));
|
proc = Process.GetProcessById(Convert.ToInt32(pid));
|
||||||
proc.EnableRaisingEvents = true;
|
proc.EnableRaisingEvents = true;
|
||||||
proc.Exited += (_, _) => {
|
proc.Exited += (_, _) => {
|
||||||
if (GlobalVars.UnexpectedExit) {
|
if (GlobalVars.UnexpectedExit) {
|
||||||
proc = null;
|
proc = null;
|
||||||
Console.WriteLine("游戏进程异常退出");
|
Console.WriteLine(App.GameProcessExit);
|
||||||
Environment.Exit(114514);
|
Environment.Exit(114514);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -287,9 +281,9 @@ public static class Utils {
|
|||||||
.Any(name => name.Contains("Microsoft Visual C++ 2022 X64 "));
|
.Any(name => name.Contains("Microsoft Visual C++ 2022 X64 "));
|
||||||
if (!installed) {
|
if (!installed) {
|
||||||
const string vcDownloadUrl = "https://aka.ms/vs/17/release/vc_redist.x64.exe";
|
const string vcDownloadUrl = "https://aka.ms/vs/17/release/vc_redist.x64.exe";
|
||||||
Console.WriteLine("未安装 VcRuntime");
|
Console.WriteLine(App.VcRuntimeNotInstalled);
|
||||||
Console.WriteLine($"下载地址: {vcDownloadUrl}");
|
Console.WriteLine(App.DownloadLink, vcDownloadUrl);
|
||||||
Console.WriteLine("安装完成后,重新打开 YaeAchievement");
|
Console.WriteLine(App.VcRuntimeAfterInstall);
|
||||||
ShellOpen(vcDownloadUrl);
|
ShellOpen(vcDownloadUrl);
|
||||||
Environment.Exit(303);
|
Environment.Exit(303);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user