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