同步1.1.7与1.1.8更新内容

This commit is contained in:
WGzeyu 2020-05-19 01:19:39 +08:00
parent 44c1cfd509
commit 1bcdf5df97
31 changed files with 2298 additions and 357 deletions

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
@ -47,6 +47,9 @@
<setting name="SelectedTheme" serializeAs="String">
<value />
</setting>
<setting name="ReinstallInstalled" serializeAs="String">
<value>True</value>
</setting>
</ModAssistant.Properties.Settings>
<ModAssistant.Settings1>
<setting name="InstallFolder" serializeAs="String">
@ -57,4 +60,4 @@
</setting>
</ModAssistant.Settings1>
</userSettings>
</configuration>
</configuration>

View file

@ -28,6 +28,8 @@
<ResourceDictionary x:Name="GridViewColumnHeader_Style" Source="Styles/GridViewColumnHeader.xaml" />
<ResourceDictionary x:Name="ListView_Style" Source="Styles/ListView.xaml" />
<ResourceDictionary x:Name="ListViewItem_Style" Source="Styles/ListViewItem.xaml" />
<ResourceDictionary x:Name="Menu_Style" Source="Styles/Menu.xaml" />
<ResourceDictionary x:Name="MenuItem_Style" Source="Styles/MenuItem.xaml" />
<ResourceDictionary x:Name="CheckBox_Style" Source="Styles/CheckBox.xaml" />
<ResourceDictionary x:Name="ComboBoxItem_Style" Source="Styles/ComboBoxItem.xaml" />
<ResourceDictionary x:Name="ComboBox_Style" Source="Styles/ComboBox.xaml" />

View file

@ -20,8 +20,11 @@ namespace ModAssistant
public static bool SaveModSelection;
public static bool CheckInstalledMods;
public static bool SelectInstalledMods;
public static bool ReinstallInstalledMods;
public static string Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
public static List<string> SavedMods = ModAssistant.Properties.Settings.Default.SavedMods.Split(',').ToList();
public static bool Update = true;
public static bool GUI = true;
private async void Application_Startup(object sender, StartupEventArgs e)
@ -64,69 +67,113 @@ namespace ModAssistant
SaveModSelection = ModAssistant.Properties.Settings.Default.SaveSelected;
CheckInstalledMods = ModAssistant.Properties.Settings.Default.CheckInstalled;
SelectInstalledMods = ModAssistant.Properties.Settings.Default.SelectInstalled;
ReinstallInstalledMods = ModAssistant.Properties.Settings.Default.ReinstallInstalled;
if (e.Args.Length == 0)
await ArgumentHandler(e.Args);
await Init(Update, GUI);
}
private async Task Init(bool Update, bool GUI)
{
if (Update)
{
await Task.Run(async () => await Updater.Run());
}
if (GUI)
{
MainWindow window = new MainWindow();
window.Show();
}
else
{
await ArgumentHandler(e.Args);
}
}
private async Task ArgumentHandler(string[] args)
{
switch (args[0])
while (args.Length > 0)
{
case "--install":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--install"));
}
else
{
await OneClickInstaller.InstallAsset(args[1]);
}
break;
switch (args[0])
{
case "--install":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--install"));
}
else
{
await OneClickInstaller.InstallAsset(args[1]);
}
case "--no-update":
MainWindow window = new MainWindow();
window.Show();
break;
Update = false;
GUI = false;
args = Shift(args, 2);
break;
case "--register":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--register"));
}
else
{
OneClickInstaller.Register(args[1], true);
}
case "--no-update":
Update = false;
args = Shift(args);
break;
break;
case "--language":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--language"));
}
else
{
LoadLanguage(args[1]);
}
case "--unregister":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--unregister"));
}
else
{
OneClickInstaller.Unregister(args[1], true);
}
break;
args = Shift(args, 2);
break;
default:
Utils.SendNotify((string)Current.FindResource("App:UnrecognizedArgument"));
break;
case "--register":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--register"));
}
else
{
OneClickInstaller.Register(args[1], true);
}
Update = false;
GUI = false;
args = Shift(args, 2);
break;
case "--unregister":
if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
{
Utils.SendNotify(string.Format((string)Current.FindResource("App:InvalidArgument"), "--unregister"));
}
else
{
OneClickInstaller.Unregister(args[1], true);
}
Update = false;
GUI = false;
args = Shift(args, 2);
break;
default:
Utils.SendNotify((string)Current.FindResource("App:UnrecognizedArgument"));
args = Shift(args);
break;
}
}
}
private static string[] Shift(string[] array, int places = 1)
{
if (places >= array.Length) return Array.Empty<string>();
string[] newArray = new string[array.Length - places];
for (int i = places; i < array.Length; i++)
{
newArray[i - places] = array[i];
}
Current.Shutdown();
return newArray;
}
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)

View file

@ -0,0 +1,288 @@
using System;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Windows;
using static ModAssistant.Http;
namespace ModAssistant.API
{
public class BeatSaver
{
private const string BeatSaverURLPrefix = "https://beatsaver.com";
private static readonly string CustomSongsFolder = Path.Combine("Beat Saber_Data", "CustomLevels");
private const bool BypassDownloadCounter = false;
public static async Task<BeatSaverMap> GetFromKey(string Key, bool showNotification = true)
{
return await GetMap(Key, "key", showNotification);
}
public static async Task<BeatSaverMap> GetFromHash(string Hash, bool showNotification = true)
{
return await GetMap(Hash, "hash", showNotification);
}
private static async Task<BeatSaverMap> GetMap(string id, string type, bool showNotification)
{
string urlSegment;
switch (type)
{
case "hash":
urlSegment = "/api/maps/by-hash/";
break;
case "key":
urlSegment = "/api/maps/detail/";
break;
default:
return null;
}
BeatSaverMap map = new BeatSaverMap();
map.Success = false;
try
{
BeatSaverApiResponse beatsaver = await GetResponse(BeatSaverURLPrefix + urlSegment + id);
map.Name = await InstallMap(beatsaver.map, showNotification);
map.Success = true;
}
catch (Exception e)
{
ModAssistant.Utils.Log($"Failed downloading BeatSaver map: {id} | Error: {e}", "ERROR");
}
return map;
}
private static async Task<BeatSaverApiResponse> GetResponse(string url, bool showNotification = true)
{
BeatSaverApiResponse response = new BeatSaverApiResponse();
try
{
var resp = await HttpClient.GetAsync(url);
response.statusCode = resp.StatusCode;
response.ratelimit = GetRatelimit(resp.Headers);
if (response.statusCode == HttpStatusCode.OK)
{
if (response.ratelimit.IsSafe)
{
string body = await resp.Content.ReadAsStringAsync();
response.map = JsonSerializer.Deserialize<BeatSaverApiResponseMap>(body);
return response;
}
else
{
return response;
}
}
else
{
return response;
}
}
catch (Exception e)
{
if (showNotification)
{
MessageBox.Show($"{Application.Current.FindResource("OneClick:MapDownloadFailed")}\n\n" + e);
}
return null;
}
}
private static BeatSaverRatelimit GetRatelimit(HttpResponseHeaders headers)
{
BeatSaverRatelimit ratelimit = new BeatSaverRatelimit();
var _rateLimitRemaining = headers.GetValues("Rate-Limit-Remaining").GetEnumerator();
var _rateLimitReset = headers.GetValues("Rate-Limit-Reset").GetEnumerator();
var _rateLimitTotal = headers.GetValues("Rate-Limit-Total").GetEnumerator();
_rateLimitRemaining.MoveNext();
_rateLimitReset.MoveNext();
_rateLimitTotal.MoveNext();
ratelimit.Remaining = Int32.Parse(_rateLimitRemaining.Current);
ratelimit.Reset = Int32.Parse(_rateLimitReset.Current);
ratelimit.Total = Int32.Parse(_rateLimitTotal.Current);
ratelimit.ResetTime = UnixTimestampToDateTime((long)ratelimit.Reset);
return ratelimit;
}
public static DateTime UnixTimestampToDateTime(double unixTime)
{
DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
long unixTimeStampInTicks = (long)(unixTime * TimeSpan.TicksPerSecond);
return new DateTime(unixStart.Ticks + unixTimeStampInTicks, System.DateTimeKind.Utc);
}
public static async Task<string> InstallMap(BeatSaverApiResponseMap Map, bool showNotification = true)
{
string zip = Path.Combine(Utils.BeatSaberPath, CustomSongsFolder, Map.hash) + ".zip";
string mapName = string.Concat(($"{Map.key} ({Map.metadata.songName} - {Map.metadata.levelAuthorName})")
.Split(ModAssistant.Utils.Constants.IllegalCharacters));
string directory = Path.Combine(Utils.BeatSaberPath, CustomSongsFolder, mapName);
#pragma warning disable CS0162 // Unreachable code detected
if (BypassDownloadCounter)
{
await Utils.DownloadAsset(BeatSaverURLPrefix + Map.directDownload, CustomSongsFolder, Map.hash + ".zip", mapName, showNotification);
}
else
{
await Utils.DownloadAsset(BeatSaverURLPrefix + Map.downloadURL, CustomSongsFolder, Map.hash + ".zip", mapName, showNotification);
}
#pragma warning restore CS0162 // Unreachable code detected
if (File.Exists(zip))
{
using (FileStream stream = new FileStream(zip, FileMode.Open))
using (ZipArchive archive = new ZipArchive(stream))
{
foreach (ZipArchiveEntry file in archive.Entries)
{
string fileDirectory = Path.GetDirectoryName(Path.Combine(directory, file.FullName));
if (!Directory.Exists(fileDirectory))
{
Directory.CreateDirectory(fileDirectory);
}
if (!string.IsNullOrEmpty(file.Name))
{
file.ExtractToFile(Path.Combine(directory, file.FullName), true);
}
}
}
File.Delete(zip);
}
else
{
if (showNotification)
{
string line1 = (string)Application.Current.FindResource("OneClick:SongDownload:Failed");
string line2 = (string)Application.Current.FindResource("OneClick:SongDownload:NetworkIssues");
string title = (string)Application.Current.FindResource("OneClick:SongDownload:FailedTitle");
MessageBox.Show($"{line1}\n{line2}", title);
}
return null;
}
return mapName;
}
public class BeatSaverMap
{
public BeatSaverApiResponse response { get; set; }
public bool Success { get; set; }
public string Name { get; set; }
}
public class BeatSaverApiResponse
{
public HttpStatusCode statusCode { get; set; }
public BeatSaverRatelimit ratelimit { get; set;}
public BeatSaverApiResponseMap map { get; set; }
}
public class BeatSaverRatelimit
{
public int Remaining { get; set; }
public int Total { get; set; }
public int Reset { get; set; }
public DateTime ResetTime { get; set; }
public bool IsSafe
{
get
{
if (Remaining > 3) return true;
else return false;
}
}
public async Task Wait()
{
await Task.Delay(new TimeSpan(ResetTime.Ticks - DateTime.Now.Ticks));
}
}
public class BeatSaverApiResponseMap
{
public Metadata metadata { get; set; }
public Stats stats { get; set; }
public string description { get; set; }
public DateTime? deletedAt { get; set; }
public string _id { get; set; }
public string key { get; set; }
public string name { get; set; }
public Uploader uploader { get; set; }
public DateTime uploaded { get; set; }
public string hash { get; set; }
public string directDownload { get; set; }
public string downloadURL { get; set; }
public string coverURL { get; set; }
public class Difficulties
{
public bool easy { get; set; }
public bool normal { get; set; }
public bool hard { get; set; }
public bool expert { get; set; }
public bool expertPlus { get; set; }
}
public class Metadata
{
public Difficulties difficulties { get; set; }
public Characteristic[] characteristics { get; set; }
public double duration { get; set; }
public string songName { get; set; }
public string songSubName { get; set; }
public string songAuthorName { get; set; }
public string levelAuthorName { get; set; }
public double bpm { get; set; }
}
public class Characteristic
{
public string name { get; set; }
public CharacteristicDifficulties difficulties { get; set; }
}
public class CharacteristicDifficulties
{
public Difficulty easy { get; set; }
public Difficulty normal { get; set; }
public Difficulty hard { get; set; }
public Difficulty expert { get; set; }
public Difficulty expertPlus { get; set; }
}
public class Difficulty
{
public double? duration { get; set; }
public double? length { get; set; }
public double bombs { get; set; }
public double notes { get; set; }
public double obstacles { get; set; }
public double njs { get; set; }
public double njsOffset { get; set; }
}
public class Stats
{
public int downloads { get; set; }
public int plays { get; set; }
public int downVotes { get; set; }
public int upVotes { get; set; }
public double heat { get; set; }
public double rating { get; set; }
}
public class Uploader
{
public string _id { get; set; }
public string username { get; set; }
}
}
}
}

View file

@ -0,0 +1,34 @@
using System;
using System.Threading.Tasks;
namespace ModAssistant.API
{
class ModelSaber
{
private const string ModelSaberURLPrefix = "https://modelsaber.com/files/";
private const string CustomAvatarsFolder = "CustomAvatars";
private const string CustomSabersFolder = "CustomSabers";
private const string CustomPlatformsFolder = "CustomPlatforms";
private const string CustomBloqsFolder = "CustomNotes";
public static async Task GetModel(Uri uri)
{
switch (uri.Host)
{
case "avatar":
await Utils.DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomAvatarsFolder);
break;
case "saber":
await Utils.DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomSabersFolder);
break;
case "platform":
await Utils.DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomPlatformsFolder);
break;
case "bloq":
await Utils.DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomBloqsFolder);
break;
}
}
}
}

View file

@ -0,0 +1,126 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using static ModAssistant.Http;
using System.Windows;
namespace ModAssistant.API
{
public class Playlists
{
private const string BSaberURLPrefix = "https://bsaber.com/PlaylistAPI/";
private const string PlaylistsFolder = "Playlists";
private static readonly string BeatSaberPath = Utils.BeatSaberPath;
public static async Task DownloadAll(Uri uri)
{
switch (uri.Host)
{
case "playlist":
Uri url = new Uri($"{uri.LocalPath.Trim('/')}");
string filename = await Get(url);
await DownloadFrom(filename);
break;
}
}
public static async Task<string> Get(Uri url)
{
string filename = url.Segments.Last();
string absolutePath = Path.Combine(BeatSaberPath, PlaylistsFolder, filename);
try
{
await Utils.DownloadAsset(url.ToString(), PlaylistsFolder, filename);
return absolutePath;
}
catch
{
return null;
}
}
public static async Task DownloadFrom(string file, bool gui = false, System.Windows.Controls.ProgressBar progress = null)
{
if (Path.Combine(BeatSaberPath, PlaylistsFolder) != Path.GetDirectoryName(file))
{
string destination = Path.Combine(BeatSaberPath, PlaylistsFolder, Path.GetFileName(file));
File.Copy(file, destination, true);
}
int Errors = 0;
int Minimum = 0;
int Value = 0;
if (progress != null)
{
progress.Minimum = 0;
progress.Maximum = 1;
progress.Value = 0;
}
Playlist playlist = JsonSerializer.Deserialize<Playlist>(File.ReadAllText(file));
int Maximum = playlist.songs.Length;
if (progress != null) progress.Maximum = playlist.songs.Length;
foreach (Playlist.Song song in playlist.songs)
{
API.BeatSaver.BeatSaverMap response = new BeatSaver.BeatSaverMap();
if (!string.IsNullOrEmpty(song.hash))
{
response = await BeatSaver.GetFromHash(song.hash, false);
}
else if (!string.IsNullOrEmpty(song.key))
{
response = await BeatSaver.GetFromKey(song.key, false);
}
Value++;
if (progress != null) progress.Value++;
if (gui)
{
if (response.Success)
{
MainWindow.Instance.MainText = $"{string.Format((string)Application.Current.FindResource("Options:InstallingPlaylist"), TextProgress(Minimum, Maximum, Value))}";
}
else
{
MainWindow.Instance.MainText = $"{string.Format((string)Application.Current.FindResource("Options:FailedPlaylistSong"), song.songName)}";
ModAssistant.Utils.Log($"Failed installing BeatSaver map: {song.songName} | {song.key} | {song.hash}");
await Task.Delay(3 * 1000);
Errors++;
}
}
}
if (gui)
{
MainWindow.Instance.MainText = $"{string.Format((string)Application.Current.FindResource("Options:FinishedPlaylist"), Errors, playlist.playlistTitle)}";
}
}
private static string TextProgress(int min, int max, int value)
{
if (max == value)
{
return $" {string.Concat(Enumerable.Repeat("", 10))} [{value}/{max}]";
}
int interval = (int)Math.Floor((double)value / ( ((double)max - (double)min ) / (double)10));
return $" {string.Concat(Enumerable.Repeat("", interval))}{string.Concat(Enumerable.Repeat("", 10 - interval))} [{value}/{max}]";
}
class Playlist
{
public string playlistTitle { get; set; }
public string playlistAuthor { get; set; }
public string image { get; set; }
public Song[] songs { get; set; }
public class Song
{
public string key { get; set; }
public string hash { get; set; }
public string songName { get; set; }
public string uploader { get; set; }
}
}
}
}

View file

@ -0,0 +1,59 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
namespace ModAssistant.API
{
public class Utils
{
public static readonly string BeatSaberPath = App.BeatSaberInstallDirectory;
public static async Task DownloadAsset(string link, string folder, bool showNotifcation, string fileName = null)
{
await DownloadAsset(link, folder, fileName, null, showNotifcation);
}
public static async Task DownloadAsset(string link, string folder, string fileName = null, string displayName = null)
{
await DownloadAsset(link, folder, fileName, displayName, true);
}
public static async Task DownloadAsset(string link, string folder, string fileName, string displayName, bool showNotification)
{
if (string.IsNullOrEmpty(BeatSaberPath))
{
ModAssistant.Utils.SendNotify((string)Application.Current.FindResource("OneClick:InstallDirNotFound"));
}
try
{
Directory.CreateDirectory(Path.Combine(BeatSaberPath, folder));
if (string.IsNullOrEmpty(fileName))
{
fileName = WebUtility.UrlDecode(Path.Combine(BeatSaberPath, folder, new Uri(link).Segments.Last()));
}
else
{
fileName = WebUtility.UrlDecode(Path.Combine(BeatSaberPath, folder, fileName));
}
if (string.IsNullOrEmpty(displayName))
{
displayName = Path.GetFileNameWithoutExtension(fileName);
}
await ModAssistant.Utils.Download(link, fileName);
if (showNotification)
{
ModAssistant.Utils.SendNotify(string.Format((string)Application.Current.FindResource("OneClick:InstalledAsset"), displayName));
}
}
catch
{
ModAssistant.Utils.SendNotify((string)Application.Current.FindResource("OneClick:AssetInstallFailed"));
}
}
}
}

View file

@ -1,31 +1,15 @@
using Microsoft.Win32;
using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
using static ModAssistant.Http;
namespace ModAssistant
{
class OneClickInstaller
{
private const string ModelSaberURLPrefix = "https://modelsaber.com/files/";
private const string BeatSaverURLPrefix = "https://beatsaver.com";
private static readonly string[] Protocols = new[] { "modelsaber", "beatsaver", "bsplaylist" };
private static readonly string BeatSaberPath = App.BeatSaberInstallDirectory;
private const string CustomAvatarsFolder = "CustomAvatars";
private const string CustomSabersFolder = "CustomSabers";
private const string CustomPlatformsFolder = "CustomPlatforms";
private const string CustomBloqsFolder = "CustomNotes";
private static readonly string CustomSongsFolder = Path.Combine("Beat Saber_Data", "CustomLevels");
private static readonly string[] Protocols = new[] { "modelsaber", "beatsaver" };
private const bool BypassDownloadCounter = false;
public static async Task InstallAsset(string link)
{
Uri uri = new Uri(link);
@ -39,121 +23,26 @@ namespace ModAssistant
case "beatsaver":
await BeatSaver(uri);
break;
case "bsplaylist":
await Playlist(uri);
break;
}
}
private static async Task BeatSaver(Uri uri)
{
string Key = uri.Host;
BeatSaverApiResponse Response;
try
{
var resp = await HttpClient.GetAsync(BeatSaverURLPrefix + "/api/maps/detail/" + Key);
var body = await resp.Content.ReadAsStringAsync();
Response = JsonSerializer.Deserialize<BeatSaverApiResponse>(body);
}
catch (Exception e)
{
MessageBox.Show($"{Application.Current.FindResource("OneClick:MapDownloadFailed")}\n\n" + e);
return;
}
string zip = Path.Combine(BeatSaberPath, CustomSongsFolder, Response.hash) + ".zip";
string directory = Path.Combine(
BeatSaberPath,
CustomSongsFolder,
string.Concat(
(Response.key + " (" + Response.metadata.songName + " - " + Response.metadata.levelAuthorName + ")")
.Split(Utils.Constants.IllegalCharacters)
)
);
if (BypassDownloadCounter)
{
await DownloadAsset(BeatSaverURLPrefix + Response.directDownload, CustomSongsFolder, Response.hash + ".zip");
}
else
{
await DownloadAsset(BeatSaverURLPrefix + Response.downloadURL, CustomSongsFolder, Response.hash + ".zip");
}
if (File.Exists(zip))
{
using (FileStream stream = new FileStream(zip, FileMode.Open))
using (ZipArchive archive = new ZipArchive(stream))
{
foreach (ZipArchiveEntry file in archive.Entries)
{
string fileDirectory = Path.GetDirectoryName(Path.Combine(directory, file.FullName));
if (!Directory.Exists(fileDirectory))
{
Directory.CreateDirectory(fileDirectory);
}
if (!string.IsNullOrEmpty(file.Name))
{
file.ExtractToFile(Path.Combine(directory, file.FullName), true);
}
}
}
File.Delete(zip);
}
else
{
string line1 = (string)Application.Current.FindResource("OneClick:SongDownload:Failed");
string line2 = (string)Application.Current.FindResource("OneClick:SongDownload:NetworkIssues");
string title = (string)Application.Current.FindResource("OneClick:SongDownload:FailedTitle");
MessageBox.Show($"{line1}\n{line2}", title);
}
await API.BeatSaver.GetFromKey(Key);
}
private static async Task ModelSaber(Uri uri)
{
switch (uri.Host)
{
case "avatar":
await DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomAvatarsFolder);
break;
case "saber":
await DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomSabersFolder);
break;
case "platform":
await DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomPlatformsFolder);
break;
case "bloq":
await DownloadAsset(ModelSaberURLPrefix + uri.Host + uri.AbsolutePath, CustomBloqsFolder);
break;
}
await API.ModelSaber.GetModel(uri);
}
private static async Task DownloadAsset(string link, string folder, string fileName = null)
private static async Task Playlist(Uri uri)
{
if (string.IsNullOrEmpty(BeatSaberPath))
{
Utils.SendNotify((string)Application.Current.FindResource("OneClick:InstallDirNotFound"));
}
try
{
Directory.CreateDirectory(Path.Combine(BeatSaberPath, folder));
if (string.IsNullOrEmpty(fileName))
{
fileName = WebUtility.UrlDecode(Path.Combine(BeatSaberPath, folder, new Uri(link).Segments.Last()));
}
else
{
fileName = WebUtility.UrlDecode(Path.Combine(BeatSaberPath, folder, fileName));
}
await Utils.Download(link, fileName);
Utils.SendNotify(string.Format((string)Application.Current.FindResource("OneClick:InstalledAsset"), Path.GetFileNameWithoutExtension(fileName)));
}
catch
{
Utils.SendNotify((string)Application.Current.FindResource("OneClick:AssetInstallFailed"));
}
await API.Playlists.DownloadAll(uri);
}
public static void Register(string Protocol, bool Background = false)
@ -242,84 +131,4 @@ namespace ModAssistant
return false;
}
}
#pragma warning disable IDE1006 // Naming Styles
class BeatSaverApiResponse
{
public Metadata metadata { get; set; }
public Stats stats { get; set; }
public string description { get; set; }
public DateTime? deletedAt { get; set; }
public string _id { get; set; }
public string key { get; set; }
public string name { get; set; }
public Uploader uploader { get; set; }
public DateTime uploaded { get; set; }
public string hash { get; set; }
public string directDownload { get; set; }
public string downloadURL { get; set; }
public string coverURL { get; set; }
public class Difficulties
{
public bool easy { get; set; }
public bool normal { get; set; }
public bool hard { get; set; }
public bool expert { get; set; }
public bool expertPlus { get; set; }
}
public class Metadata
{
public Difficulties difficulties { get; set; }
public Characteristic[] characteristics { get; set; }
public string songName { get; set; }
public string songSubName { get; set; }
public string songAuthorName { get; set; }
public string levelAuthorName { get; set; }
public double bpm { get; set; }
}
public class Characteristic
{
public string name { get; set; }
public CharacteristicDifficulties difficulties { get; set; }
}
public class CharacteristicDifficulties
{
public Difficulty easy { get; set; }
public Difficulty normal { get; set; }
public Difficulty hard { get; set; }
public Difficulty expert { get; set; }
public Difficulty expertPlus { get; set; }
}
public class Difficulty
{
public double? duration { get; set; }
public double? length { get; set; }
public double bombs { get; set; }
public double notes { get; set; }
public double obstacles { get; set; }
public double njs { get; set; }
}
public class Stats
{
public int downloads { get; set; }
public int plays { get; set; }
public int downVotes { get; set; }
public int upVotes { get; set; }
public double heat { get; set; }
public double rating { get; set; }
}
public class Uploader
{
public string _id { get; set; }
public string username { get; set; }
}
}
}
#pragma warning restore IDE1006 // Naming Styles

View file

@ -1,6 +1,7 @@
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
@ -322,7 +323,7 @@ namespace ModAssistant
public static string GetManualDir()
{
var dialog = new Microsoft.Win32.SaveFileDialog()
var dialog = new SaveFileDialog()
{
Title = (string)Application.Current.FindResource("Utils:InstallDir:DialogTitle"),
Filter = "Directory|*.this.directory",
@ -352,6 +353,22 @@ namespace ModAssistant
return null;
}
public static string GetManualFile(string filter = "", string title = "Open File")
{
var dialog = new OpenFileDialog()
{
Title = title,
Filter = filter,
Multiselect = false,
};
if (dialog.ShowDialog() == true)
{
return dialog.FileName;
}
return null;
}
public static bool IsVoid()
{
string directory = App.BeatSaberInstallDirectory;
@ -400,6 +417,13 @@ namespace ModAssistant
MessageBox.Show($"{string.Format((string)Application.Current.FindResource("Utils:CannotOpenFolder"), location)}.");
}
public static void Log(string message, string severity = "LOG")
{
string path = Path.GetDirectoryName(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath);
string logFile = $"{path}{Path.DirectorySeparatorChar}log.log";
File.AppendAllText(logFile, $"[{DateTime.UtcNow.ToString("yyyy-mm-dd HH:mm:ss.ffffff")}][{severity.ToUpper()}] {message}\n");
}
public static async Task Download(string link, string output)
{
var resp = await HttpClient.GetAsync(link);

View file

@ -0,0 +1,238 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ModAssistant"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ResourceDictionaryName">i18n:en-US</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">Der Beat Saber Installationsordner konnte nicht gefunden werden!</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">Drücke OK um es erneut zu versuchen, oder Abbrechen um das Programm zu beenden.</sys:String>
<sys:String x:Key="App:InvalidArgument">Ungültiges Argument! '{0}' benötigt eine Option.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">Unbekanntes Argument. Beende Mod Assistant.</sys:String>
<sys:String x:Key="App:UnhandledException">Eine nicht behandelte Ausnahme ist aufgetreten</sys:String>
<sys:String x:Key="App:Exception">Ausnahme</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">ModAssistant</sys:String>
<sys:String x:Key="MainWindow:IntroButton">Intro</sys:String>
<sys:String x:Key="MainWindow:ModsButton">Mods</sys:String>
<sys:String x:Key="MainWindow:AboutButton">Über</sys:String>
<sys:String x:Key="MainWindow:OptionsButton">Optionen</sys:String>
<sys:String x:Key="MainWindow:GameVersionLabel">Spiel Version</sys:String>
<sys:String x:Key="MainWindow:VersionLabel">Version</sys:String>
<sys:String x:Key="MainWindow:ModInfoButton">Mod Info</sys:String>
<sys:String x:Key="MainWindow:InstallButtonTop">Installieren/</sys:String>
<sys:String x:Key="MainWindow:InstallButtonBottom">Aktualisieren</sys:String>
<sys:String x:Key="MainWindow:GameVersionLoadFailed">Spielversion konnte nicht geladen werden, der Mods Tab wird nicht verfügbar sein.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Title">Neue Spielversion gefunden!</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line1">Es scheint ein Spiel Update gegeben zu haben.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line2">Bitte prüfe ob unten links die richtige Version ausgewählt ist!</sys:String>
<sys:String x:Key="MainWindow:NoModSelected">Kein Mod ausgewählt!</sys:String>
<sys:String x:Key="MainWindow:NoModInfoPage">{0} hat keine Informationsseite.</sys:String>
<!-- Intro Page -->
<sys:String x:Key="Intro:Title">Intro</sys:String>
<sys:String x:Key="Intro:PageTitle">Willkommen bei Mod Assistant</sys:String>
<sys:String x:Key="Intro:Terms:Header">Bitte lies diese Seite vollständig und aufmerksam!</sys:String>
<Span x:Key="Intro:Terms:Line1">
Durch Nutzung des Programms wird bestätigt, dass folgende Bedinungen gelesen und akzeptiert wurden:
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
unterstützt normalerweise <Bold>keine</Bold> Mods. Das heißt:
</Span>
<Span x:Key="Intro:Terms:Term1">
Mods
werden nach jedem Update <Bold>nicht mehr funktionieren</Bold>. Dies ist normal, und
die Schuld liegt <Bold>nicht</Bold> bei Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term2">
Mods
<Bold>werden</Bold> Fehler und Leistungsprobleme verursachen. Die Schuld
liegt <Bold>nicht</Bold> bei Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term3">
Mods werden
<Bold>kostenlos</Bold> von Leuten in deren
<Bold>Freizeit</Bold> erstellt. Bitte sei geduldig und verständnissvoll.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
Bitte gib <Bold>KEINE</Bold> schlechten Bewertungen weil die Mods nicht funktionieren. Die Schuld
liegt <Bold>nicht</Bold> bei Beat Games.
<LineBreak/> Sie versuchen nicht die Mods zu unterbinden.
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
Wenn ich weiterhin schlecht Bewertungen
<Italic>wegen</Italic> nicht funktionierenden Mods sehe,
<LineBreak/>
<Bold>Werde ich persönlich die Mods mit einem rostigen Löffel töten</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
Bitte lies den Einsteiger Leitfaden im
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
Wiki
</Hyperlink>.
</Span>
<sys:String x:Key="Intro:AgreeButton">Annehmen</sys:String>
<sys:String x:Key="Intro:DisagreeButton">Ablehnen</sys:String>
<sys:String x:Key="Intro:ClosingApp">Programm wird beendet: Du hast den Bedingunen nicht zugestimmt.</sys:String>
<sys:String x:Key="Intro:VersionDownloadFailed">Versionsliste konnte nicht geladen werden</sys:String>
<sys:String x:Key="Intro:ModsTabDisabled">Mods Tab deaktiviert. Bitte Programm neu starten um es nochmal zu versuchen.</sys:String>
<sys:String x:Key="Intro:ModsTabEnabled">Du kannst jetzt den Mods Tab benutzen!</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">Mods</sys:String>
<sys:String x:Key="Mods:Header:Name">Name</sys:String>
<sys:String x:Key="Mods:Header:Installed">Installiert</sys:String>
<sys:String x:Key="Mods:Header:Latest">Neuste</sys:String>
<sys:String x:Key="Mods:Header:Description">Beschreibung</sys:String>
<sys:String x:Key="Mods:Header:Uninstall">Entfernen</sys:String>
<sys:String x:Key="Mods:UninstallButton">Entfernen</sys:String>
<sys:String x:Key="Mods:LoadFailed">Modliste konnte nicht geladen werden</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">Prüfe installierte Mods</sys:String>
<sys:String x:Key="Mods:LoadingMods">Lade Mods</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">Laden der Mods abgeschlossen</sys:String>
<sys:String x:Key="Mods:InstallingMod">Installiere {0}</sys:String>
<sys:String x:Key="Mods:InstalledMod">{0} installiert</sys:String>
<sys:String x:Key="Mods:FinishedInstallingMods">Mod Installation abgeschlossen</sys:String>
<sys:String x:Key="Mods:ModDownloadLinkMissing">Downloadlink für {0} konnte nicht gefunden werden</sys:String>
<sys:String x:Key="Mods:UninstallBox:Title">{0} entfernen?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body1">Bist du dir sicher das du {0} entfernen möchtest?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body2">Dies kann die anderen Mods unbrauchbar machen</sys:String>
<sys:String x:Key="Mods:FailedExtract">Fehler beim Extrahieren von {0}, neuer Versuch in {1} Sekunden. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">Fehler beim Extrahieren von {0} nach {1} Versuchen, wird übersprungen. Dieser Mod funktioniert möglicherweise nicht richtig, also gehe auf eigenes Risiko vor</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String> <!-- NEEDS TRANSLATING -->
<!-- About Page -->
<sys:String x:Key="About:Title">Über</sys:String>
<sys:String x:Key="About:PageTitle">Über Mod Assistant</sys:String>
<sys:String x:Key="About:List:Header">Ich bin Assistant und ich habe Mod Assistant als Assistent für Mods mit ein paar Prinzipen im Auge gemacht:</sys:String>
<sys:String x:Key="About:List:Item1">Einfachheit</sys:String>
<sys:String x:Key="About:List:Item2">Portabilität</sys:String>
<sys:String x:Key="About:List:Item3">Nur eine Datei</sys:String>
<sys:String x:Key="About:List:Item4">Verantwortungsbewusster Umgang</sys:String>
<Span x:Key="About:SupportAssistant">
Wenn dir das Programm gefällt und du mich unterstützen möchtest, dann besuche meine
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
Spendenseite
</Hyperlink>
oder mein
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Besonder Dank ♥</sys:String>
<sys:String x:Key="About:Donate">Spenden</sys:String>
<sys:String x:Key="About:HeadpatsButton">Kopftätscheln</sys:String>
<sys:String x:Key="About:HugsButton">Umarmungen</sys:String>
<!-- Options Page -->
<sys:String x:Key="Options:Title">Optionen</sys:String>
<sys:String x:Key="Options:PageTitle">Einstellungen</sys:String>
<sys:String x:Key="Options:InstallFolder">Installations Ordner</sys:String>
<sys:String x:Key="Options:SelectFolderButton">Ordner wählen</sys:String>
<sys:String x:Key="Options:OpenFolderButton">Order öffnen</sys:String>
<sys:String x:Key="Options:SaveSelectedMods">Ausgewählte Mods speichern</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Installierte Mods prüfen</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Installierte Mods auswählen</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Installierte Mods neu installieren</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">OneClick™ Installation aktivieren</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Spiel Typ</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:Diagnostics">Diagnose</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Log öffnen</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">AppData öffnen</sys:String>
<sys:String x:Key="Options:UninstallBSIPAButton">BSIPA entfernen</sys:String>
<sys:String x:Key="Options:RemoveAllModsButton">Mods entfernen</sys:String>
<sys:String x:Key="Options:ApplicationTheme">Design</sys:String>
<sys:String x:Key="Options:ExportTemplateButton">Exportieren</sys:String>
<sys:String x:Key="Options:UploadingLog">Log wird hochgeladen</sys:String>
<sys:String x:Key="Options:LogUrlCopied">Log URL in die Zwischenablage kopiert!</sys:String>
<sys:String x:Key="Options:LogUploadFailed">Log Hochladen fehlgeschlagen!</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Title">Log Hochladen fehlgeschlagen!</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Body">Log Datei konnte nicht zu Teknik hochgeladen werden, bitte nochmal versuchen oder die Datei manuell senden.</sys:String>
<sys:String x:Key="Options:GettingModList">Lade Liste der Mods</sys:String>
<sys:String x:Key="Options:FindingBSIPAVersion">Suche BSIPA Version</sys:String>
<sys:String x:Key="Options:BSIPAUninstalled">BSIPA entfernt</sys:String>
<sys:String x:Key="Options:YeetModsBox:Title">Alle Mods entfernen?</sys:String>
<sys:String x:Key="Options:YeetModsBox:RemoveAllMods">Bist du dir sicher das du ALLE Mods entfernen möchtest?</sys:String>
<sys:String x:Key="Options:YeetModsBox:CannotBeUndone">Dies kann nicht rückgängig gemacht werden.</sys:String>
<sys:String x:Key="Options:AllModsUninstalled">Alle Mods entfernt</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Aktuelles Design wurde entfernt, gehe zurück zum Standart...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Designs Ordner nicht gefunden! Versuche die Vorlage zu exportieren...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">AppData Ordner nicht gefunden! Versuche dein Spiel zu starten.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Lade Mods</sys:String>
<!-- Invalid Page -->
<sys:String x:Key="Invalid:Title">Ungültig</sys:String>
<sys:String x:Key="Invalid:PageTitle">Ungültige Installation erkannt</sys:String>
<sys:String x:Key="Invalid:PageSubtitle">Die SPielinstallation ist beschädigt oder anderwärtig ungültig</sys:String>
<sys:String x:Key="Invalid:List:Header">Dies kann passieren wenn dein Spiel eine Raubkopie ist oder eine Raubkopie über eine legitime Version kopiert wurde</sys:String>
<Span x:Key="Invalid:List:Line1">
Falls dein Spiel eine Raubkopie ist,
<Bold>bitte kaufe das Spiel
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
HIER
</Hyperlink>
</Bold>.
</Span>
<Span x:Key="Invalid:List:Line2">
Wenn dein Spiel
<Bold>keine</Bold> Raubkopie ist, bitte
<Hyperlink NavigateUri="https://bsmg.wiki/support#clean-installation" local:HyperlinkExtensions.IsExternal="True">
mach eine saubere Neuinstallation
</Hyperlink>.
</Span>
<Span x:Key="Invalid:List:Line3">
Falls das nicht hilft, frage im
<Span Foreground="Blue">#support</Span> Kanal in der
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>.
</Span>
<sys:String x:Key="Invalid:BoughtGame1">Falls du eine Raubkopie hattest aber das Spiel jetzt gekauft hast</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">Select Folder</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Muss Mod Assisstant neu gestartet werden wenn eine legitime Version installiert wurde</sys:String>
<!-- OneClick Class -->
<sys:String x:Key="OneClick:MapDownloadFailed">Map Details konnten nicht geladen werden.</sys:String>
<sys:String x:Key="OneClick:SongDownloadFailed">Titel konnte nicht geladen werden.</sys:String>
<sys:String x:Key="OneClick:SongDownload:Failed">Titel konnte nicht geladen werden.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">Möglicherweise gibt es Probleme mit BeatSaver oder deiner Internetverbindung.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">Herunterladen der Titel ZIP fehlgeschlagen</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">Beat Saber Installations Pfad nicht gefunden.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installiert: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Installation fehlgeschlagen.</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Installion Handler registriert!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Installion Handler entfernt!</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Design nicht gefunden, gehe zurück zum Standart Design...</sys:String>
<sys:String x:Key="Themes:ThemeSet">Design gesetzt auf: {0}.</sys:String>
<sys:String x:Key="Themes:ThemeMissing">{0} existiert nicht.</sys:String>
<sys:String x:Key="Themes:SavedTemplateTheme">Designvorlage &quot;{0}&quot; in Design Ordner gespeichert.</sys:String>
<sys:String x:Key="Themes:TemplateThemeExists">Designvorlage existiert bereits!</sys:String>
<sys:String x:Key="Themes:FailedToLoadXaml">Fehler beim Laden der .xaml Datei von Design {0}: {1}</sys:String>
<!-- Updater Class -->
<sys:String x:Key="Updater:CheckFailed">Konnte nicht auf Aktualisierungen prüfen.</sys:String>
<sys:String x:Key="Updater:DownloadFailed">Konnte Aktualisierung nicht herunterladen.</sys:String>
<!-- Utils Class -->
<sys:String x:Key="Utils:NotificationTitle">Mod Assistant</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">Beat Saber Installationsordner konnte nicht erkannt werden. Bitte manuell auswählen.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">Mod Assistant muss diese Aufgabe mit Administrator Rechten ausführen. Bitte nochmal versuchen.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">Wähle den Beat Saber Installationsordner aus</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">Ordner konnte nicht geöffnet werden: {0}</sys:String>
</ResourceDictionary>

View file

@ -71,6 +71,7 @@
<sys:String x:Key="Mods:UninstallBox:Body2">Mods:UninstallBox:Body2</sys:String>
<sys:String x:Key="Mods:FailedExtract">{0} {1} {2} {3} Mods:FailedExtract</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">{0} {1} Mods:FailedExtractMaxReached</sys:String>
<sys:String x:Key="Mods:SearchLabel">Mods:SearchLabel</sys:String>
<!-- About Page -->
<sys:String x:Key="About:Title">About:Title</sys:String>
@ -95,12 +96,18 @@
<sys:String x:Key="Options:SaveSelectedMods">Options:SaveSelectedMods</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Options:CheckInstalledMods</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Options:SelectInstalledMods</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Options:Reinstall Installed Mods</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">Options:EnableOneClickInstalls</sys:String>
<sys:String x:Key="Options:BeatSaver">Options:BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">Options:ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Options:GameType</sys:String>
<sys:String x:Key="Options:GameType:Steam">Options:GameType:Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Options:GameType:Oculus</sys:String>
<sys:String x:Key="Options:Tools">Options:Tools</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Options:InstallPlaylist</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">{0} Options:InstallingPlaylist</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">{0} Options:FailedPlaylistSong</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">{0} {1} Options:FinishedPlaylist</sys:String>
<sys:String x:Key="Options:Diagnostics">Options:Diagnostics</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Options:OpenLogsButton</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">Options:OpenAppDataButton</sys:String>
@ -122,6 +129,7 @@
<sys:String x:Key="Options:AllModsUninstalled">Options:AllModsUninstalled</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Options:CurrentThemeRemoved</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Options:ThemeFolderNotFound</sys:String>
<sys:String x:Key="Options:AppDataNotFound">Options:AppDataNotFound</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Loading:Loading</sys:String>

View file

@ -72,7 +72,7 @@
Please read the Beginners Guide on the
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
Wiki
</Hyperlink>.
</Hyperlink> .
</Span>
<sys:String x:Key="Intro:AgreeButton">I Agree</sys:String>
<sys:String x:Key="Intro:DisagreeButton">Disagree</sys:String>
@ -92,8 +92,6 @@
<sys:String x:Key="Mods:LoadFailed">Could not load mods list</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">Checking installed mods</sys:String>
<sys:String x:Key="Mods:LoadingMods">Loading Mods</sys:String>
<sys:String x:Key="Mods:LoadingTrans">Loading Translation</sys:String>
<sys:String x:Key="Mods:DownloadingMod">Downloading {0}</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">Finished loading mods</sys:String>
<sys:String x:Key="Mods:InstallingMod">Installing {0}</sys:String>
<sys:String x:Key="Mods:InstalledMod">Installed {0}</sys:String>
@ -104,7 +102,7 @@
<sys:String x:Key="Mods:UninstallBox:Body2">This could break your other mods</sys:String>
<sys:String x:Key="Mods:FailedExtract">Failed to extract {0}, trying again in {1} seconds. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">Failed to extract {0} after max attempts ({1}), skipping. This mod might not work properly so proceed at your own risk</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String>
<!-- About Page -->
<sys:String x:Key="About:Title">About</sys:String>
@ -138,12 +136,18 @@
<sys:String x:Key="Options:SaveSelectedMods">Save Selected Mods</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Detect Installed Mods</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Select Installed Mods</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Reinstall Installed Mods</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">Enable OneClick™ Installs</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Game Type</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String>
<sys:String x:Key="Options:Diagnostics">Diagnostics</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Open Logs</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">Open AppData</sys:String>
@ -165,6 +169,7 @@
<sys:String x:Key="Options:AllModsUninstalled">All Mods Uninstalled</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Current theme has been removed, reverting to default...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Themes folder not found! Try exporting the template...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">AppData folder not found! Try launching your game.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Loading Mods</sys:String>
@ -180,21 +185,21 @@
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
HERE
</Hyperlink>
</Bold>.
</Bold> .
</Span>
<Span x:Key="Invalid:List:Line2">
If your copy of the game is
<Bold>not</Bold> pirated, please
<Hyperlink NavigateUri="https://bsmg.wiki/support#clean-installation" local:HyperlinkExtensions.IsExternal="True">
do a clean install
</Hyperlink>.
</Hyperlink> .
</Span>
<Span x:Key="Invalid:List:Line3">
If those don't help, ask for support in the
<Span Foreground="Blue">#support</Span> channel in
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>.
</Hyperlink> .
</Span>
<sys:String x:Key="Invalid:BoughtGame1">If you used to have a pirated version but have since bought the game</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">Select Folder</sys:String>

View file

@ -0,0 +1,245 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ModAssistant"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ResourceDictionaryName">i18n:fr-FR</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">Impossible de trouver le dossier d'installation de Beat Saber !</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">Appuyez sur OK pour réessayer, ou Annuler pour fermer l'application.</sys:String>
<sys:String x:Key="App:InvalidArgument">Argument invalide ! '{0}' nécessite une option.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">Argument non reconnu. Fermeture de Mod Assistant.</sys:String>
<sys:String x:Key="App:UnhandledException">Une exception non gérée est survenue</sys:String>
<sys:String x:Key="App:Exception">Exception</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">ModAssistant</sys:String>
<sys:String x:Key="MainWindow:IntroButton">Intro</sys:String>
<sys:String x:Key="MainWindow:ModsButton">Mods</sys:String>
<sys:String x:Key="MainWindow:AboutButton">À propos</sys:String>
<sys:String x:Key="MainWindow:OptionsButton">Options</sys:String>
<sys:String x:Key="MainWindow:GameVersionLabel">Version du jeu</sys:String>
<sys:String x:Key="MainWindow:VersionLabel">Version</sys:String>
<sys:String x:Key="MainWindow:ModInfoButton">Info sur le mod</sys:String>
<sys:String x:Key="MainWindow:InstallButtonTop">Installer</sys:String>
<sys:String x:Key="MainWindow:InstallButtonBottom">ou Mettre à jour</sys:String>
<sys:String x:Key="MainWindow:GameVersionLoadFailed">Impossible de charger les versions du jeu, l'onglet Mods sera indisponible.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Title">Nouvelle version du jeu détectée !</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line1">Il semble que le jeu a été mis à jour.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line2">Veuillez vous assurer que la bonne version soit sélectionnée en bas à gauche !</sys:String>
<sys:String x:Key="MainWindow:NoModSelected">Aucun mod sélectionné !</sys:String>
<sys:String x:Key="MainWindow:NoModInfoPage">{0} n'a pas de page informative.</sys:String>
<!-- Intro Page -->
<sys:String x:Key="Intro:Title">Intro</sys:String>
<sys:String x:Key="Intro:PageTitle">Bienvenue sur Mod Assistant</sys:String>
<sys:String x:Key="Intro:Terms:Header">Veuillez lire cette page entièrement et avec attention</sys:String>
<Span x:Key="Intro:Terms:Line1">
En utilisant ce programme, vous attestez que vous avez lu et accepté les modalités suivantes :
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
<Bold>ne</Bold> supporte
<Bold>pas</Bold> nativement les mods. Cela signifie que :
</Span>
<Span x:Key="Intro:Terms:Term1">
Les mods
<Bold>dysfonctionneront</Bold> à chaque mise à jour. C'est normal, et ce
<Bold>n'</Bold>est
<Bold>pas</Bold> la faute de Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term2">
Les mods
<Bold>causeront</Bold> des bugs et des problèmes de performance. Ce
<Bold>n'</Bold>est
<Bold>pas</Bold> la faute de Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term3">
Les mods sont créés
<Bold>gratuitement</Bold> par des gens sur leur
<Bold>temps libre.</Bold> Veuillez être patient et compréhensif.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
<Bold>NE</Bold> laissez
<Bold>PAS</Bold> de commentaires négatifs parce que les mods ne fonctionnent plus. Ce
<Bold>n'</Bold>est
<Bold>pas</Bold> la faute de Beat Games.
<LineBreak/> Ils n'essaient pas de faire disparaître les mods.
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
Si je continue de voir des gens laisser des commentaires négatifs
<Italic>parce que</Italic> les mods ne fonctionnent plus,
<LineBreak/>
<Bold>J'irai personnellement liquider les mods avec une cuillère rouillée</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
Veuillez lire le Guide du Débutant sur le
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/fr/pc-modding.html">
Wiki
</Hyperlink>.
</Span>
<sys:String x:Key="Intro:AgreeButton">J'accepte</sys:String>
<sys:String x:Key="Intro:DisagreeButton">Je refuse</sys:String>
<sys:String x:Key="Intro:ClosingApp">Fermeture de l'application : vous n'avez pas accepté les modalités et conditions.</sys:String>
<sys:String x:Key="Intro:VersionDownloadFailed">Impossible de télécharger la liste des versions</sys:String>
<sys:String x:Key="Intro:ModsTabDisabled">Onglet Mods désactivé. Veuillez relancer pour réessayer.</sys:String>
<sys:String x:Key="Intro:ModsTabEnabled">Vous pouvez désormais utiliser l'onglet Mods !</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">Mods</sys:String>
<sys:String x:Key="Mods:Header:Name">Nom</sys:String>
<sys:String x:Key="Mods:Header:Installed">Installé</sys:String>
<sys:String x:Key="Mods:Header:Latest">Récent</sys:String>
<sys:String x:Key="Mods:Header:Description">Description</sys:String>
<sys:String x:Key="Mods:Header:Uninstall">Désinstaller</sys:String>
<sys:String x:Key="Mods:UninstallButton">Désinstaller</sys:String>
<sys:String x:Key="Mods:LoadFailed">Impossible de charger la liste des mods</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">Vérification des mods installés</sys:String>
<sys:String x:Key="Mods:LoadingMods">Chargement des mods</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">Fin : mods chargés</sys:String>
<sys:String x:Key="Mods:InstallingMod">Installation de {0}</sys:String>
<sys:String x:Key="Mods:InstalledMod">{0} installé</sys:String>
<sys:String x:Key="Mods:FinishedInstallingMods">Fin : mods installés</sys:String>
<sys:String x:Key="Mods:ModDownloadLinkMissing">Impossible de trouver le lien de téléchargement de {0}</sys:String>
<sys:String x:Key="Mods:UninstallBox:Title">Désinstaller {0} ?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body1">Êtes-vous sûr de vouloir supprimer {0} ?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body2">Cela pourrait faire dysfonctionner d'autres mods installés</sys:String>
<sys:String x:Key="Mods:FailedExtract">Échec de l'extraction de {0}, nouvelle tentative dans {1} secondes. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">Échec de l'extraction de {0} après le maximum de tentatives ({1}), abandon. Ce mod pourrait ne pas fonctionner correctement, continuez à vos propres risques</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String> <!-- NEEDS TRANSLATING -->
<!-- About Page -->
<sys:String x:Key="About:Title">À propos</sys:String>
<sys:String x:Key="About:PageTitle">À propos de Mod Assistant</sys:String>
<sys:String x:Key="About:List:Header">Je suis Assistant, et je réalise Mod Assistant pour l'assistance aux mods, avec quelques principes en tête :</sys:String>
<sys:String x:Key="About:List:Item1">Simplicité</sys:String>
<sys:String x:Key="About:List:Item2">Portabilité</sys:String>
<sys:String x:Key="About:List:Item3">Exécutable unique</sys:String>
<sys:String x:Key="About:List:Item4">Utilisation responsable</sys:String>
<Span x:Key="About:SupportAssistant">
Si vous aimez ce programme et souhaitez me soutenir, veuillez visiter ma
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
page de don
</Hyperlink>
ou mon
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Remerciements particuliers ♥</sys:String>
<sys:String x:Key="About:Donate">Faire un don</sys:String>
<sys:String x:Key="About:HeadpatsButton">Caresses-tête</sys:String>
<sys:String x:Key="About:HugsButton">Câlins</sys:String>
<!-- Options Page -->
<sys:String x:Key="Options:Title">Options</sys:String>
<sys:String x:Key="Options:PageTitle">Paramètres</sys:String>
<sys:String x:Key="Options:InstallFolder">Dossier d'installation</sys:String>
<sys:String x:Key="Options:SelectFolderButton">Sélectionner un dossier</sys:String>
<sys:String x:Key="Options:OpenFolderButton">Ouvrir le dossier</sys:String>
<sys:String x:Key="Options:SaveSelectedMods">Sauvegarder les mods sélectionnés</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Détecter les mods installés</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Sélectionner les mods installés</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Réinstaller les mods installés</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">Activer les installations OneClick™</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Type du jeu</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:Diagnostics">Diagnostic</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Ouvrir les logs</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">Ouvrir AppData</sys:String>
<sys:String x:Key="Options:UninstallBSIPAButton">Désinstaller BSIPA</sys:String>
<sys:String x:Key="Options:RemoveAllModsButton">Supprimer tous les mods</sys:String>
<sys:String x:Key="Options:ApplicationTheme">Thème de l'application</sys:String>
<sys:String x:Key="Options:ExportTemplateButton">Exporter le modèle</sys:String>
<sys:String x:Key="Options:UploadingLog">Envoi des logs</sys:String>
<sys:String x:Key="Options:LogUrlCopied">URL des logs copiée dans le presse-papier !</sys:String>
<sys:String x:Key="Options:LogUploadFailed">L'envoi des logs a échoué</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Title">L'envoi des logs a échoué !</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Body">Impossible d'envoyer le fichier de logs à Teknik, veuillez réessayer ou envoyer le fichier manuellement.</sys:String>
<sys:String x:Key="Options:GettingModList">Récupération de la liste des mods</sys:String>
<sys:String x:Key="Options:FindingBSIPAVersion">Découverte de la version de BSIPA</sys:String>
<sys:String x:Key="Options:BSIPAUninstalled">BSIPA désinstallé</sys:String>
<sys:String x:Key="Options:YeetModsBox:Title">Désinstaller les mods ?</sys:String>
<sys:String x:Key="Options:YeetModsBox:RemoveAllMods">Êtes-vous sûr de vouloir supprimer TOUS les mods ?</sys:String>
<sys:String x:Key="Options:YeetModsBox:CannotBeUndone">Cela ne peut pas être annulé.</sys:String>
<sys:String x:Key="Options:AllModsUninstalled">Tous les mods ont été désinstallés</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Le thème actuel a été supprimé, passage au thème par défaut...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Dossier Themes non trouvé ! Essayez d'exporter le modèle...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">Dossier AppData non trouvé ! Essayez de lancer votre jeu.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Chargement des mods</sys:String>
<!-- Invalid Page -->
<sys:String x:Key="Invalid:Title">Invalide</sys:String>
<sys:String x:Key="Invalid:PageTitle">Installation invalide détectée</sys:String>
<sys:String x:Key="Invalid:PageSubtitle">Votre installation du jeu est corrompue sinon invalide</sys:String>
<sys:String x:Key="Invalid:List:Header">Cela peut survenir si votre copie du jeu est piratée, ou si vous copiez une copie piratée sur votre installation légitime</sys:String>
<Span x:Key="Invalid:List:Line1">
Si votre copie du jeu est piratée,
<Bold>veuillez acheter le jeu
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
ICI
</Hyperlink>
</Bold>.
</Span>
<Span x:Key="Invalid:List:Line2">
Si votre copie du jeu
<Bold>n'</Bold>est
<Bold>pas</Bold> piratée, veuillez
<Hyperlink NavigateUri="https://bsmg.wiki/fr/support/#installation-propre" local:HyperlinkExtensions.IsExternal="True">
faire une installation propre
</Hyperlink>.
</Span>
<Span x:Key="Invalid:List:Line3">
Si cela n'a pas fonctionné, demandez de l'aide au support dans le canal textuel
<Span Foreground="Blue">#support</Span> dans
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>.
</Span>
<sys:String x:Key="Invalid:BoughtGame1">Si vous utilisiez une version piratée mais avez acheté le jeu depuis</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">Sélectionner un dossier</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Vous devez relancer Mod Assistant après avoir choisi l'installation légitime</sys:String>
<!-- OneClick Class -->
<sys:String x:Key="OneClick:MapDownloadFailed">Impossible de récupérer les détails de la map.</sys:String>
<sys:String x:Key="OneClick:SongDownloadFailed">Impossible de télécharger la musique.</sys:String>
<sys:String x:Key="OneClick:SongDownload:Failed">Impossible de télécharger la musique.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">Il pourrait y avoir des problèmes avec BeatSaver ou votre connexion Internet.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">Échec du téléchargement du ZIP de la musique</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">Chemin de l'installation de Beat Saber non trouvé.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installé : {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Échec de l'installation.</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} : gestionnaires d'installation OneClick™ inscrits !</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} : gestionnaires d'installation OneClick™ désinscrits !</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Thème non trouvé, passage au thème par défaut...</sys:String>
<sys:String x:Key="Themes:ThemeSet">Thème défini sur {0}.</sys:String>
<sys:String x:Key="Themes:ThemeMissing">{0} n'existe pas.</sys:String>
<sys:String x:Key="Themes:SavedTemplateTheme">Modèle du thème &quot;{0}&quot; sauvegardé dans le dossier Themes.</sys:String>
<sys:String x:Key="Themes:TemplateThemeExists">Le modèle du thème existe déjà !</sys:String>
<sys:String x:Key="Themes:FailedToLoadXaml">Échec du chargement du fichier .xaml pour le thème {0} : {1}</sys:String>
<!-- Updater Class -->
<sys:String x:Key="Updater:CheckFailed">Impossible de vérifier les mises à jour.</sys:String>
<sys:String x:Key="Updater:DownloadFailed">Impossible de télécharger la mise à jour.</sys:String>
<!-- Utils Class -->
<sys:String x:Key="Utils:NotificationTitle">Mod Assistant</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">Impossible de détecter le dossier d'installation de Beat Saber. Veuillez le sélectionner manuellement.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">Mod Assistant a besoin de lancer cette tâche en administrateur. Veuillez réessayer.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">Sélectionnez le dossier d'installation de Beat Saber</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">Impossible d'ouvrir le dossier : {0}</sys:String>
</ResourceDictionary>

View file

@ -0,0 +1,238 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ModAssistant"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ResourceDictionaryName">i18n:it-IT</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">Impossibile trovare la directory d'installazione di Beat Saber</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">Premi OK per riprovare, oppure Cancel per chiudere l'applicazione.</sys:String>
<sys:String x:Key="App:InvalidArgument">Argomento non valido! '{0}' ha bisogno di un'opzione.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">Argomento non riconosciuto. Chiusura di Mod Assistant.</sys:String>
<sys:String x:Key="App:UnhandledException">Si è appena verificata un'eccezione non gestita</sys:String>
<sys:String x:Key="App:Exception">Eccezione</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">ModAssistant</sys:String>
<sys:String x:Key="MainWindow:IntroButton">Introduzione</sys:String>
<sys:String x:Key="MainWindow:ModsButton">Mod</sys:String>
<sys:String x:Key="MainWindow:AboutButton">Info</sys:String>
<sys:String x:Key="MainWindow:OptionsButton">Opzioni</sys:String>
<sys:String x:Key="MainWindow:GameVersionLabel">Versione del gioco</sys:String>
<sys:String x:Key="MainWindow:VersionLabel">Versione</sys:String>
<sys:String x:Key="MainWindow:ModInfoButton">Info sulla mod</sys:String>
<sys:String x:Key="MainWindow:InstallButtonTop">Installa</sys:String>
<sys:String x:Key="MainWindow:InstallButtonBottom">o Aggiorna</sys:String>
<sys:String x:Key="MainWindow:GameVersionLoadFailed">Non è stato possibile caricare le versioni del gioco, il menù Mod non sarà disponibile.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Title">Rilevata nuova versione del gioco!</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line1">Sembra che ci sia stato un aggiornamento del gioco.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line2">Per piacere verifica che sia selezionata la versione corretta nel menù in basso a sinistra</sys:String>
<sys:String x:Key="MainWindow:NoModSelected">Nessuna mod selezionata!</sys:String>
<sys:String x:Key="MainWindow:NoModInfoPage">{0} non ha una pagina di informazioni.</sys:String>
<!-- Intro Page -->
<sys:String x:Key="Intro:Title">Introduzione</sys:String>
<sys:String x:Key="Intro:PageTitle">Benvenuto/a in Mod Assistant</sys:String>
<sys:String x:Key="Intro:Terms:Header">Ti invitiamo a leggere questa pagina fino alla fine e con cautela</sys:String>
<Span x:Key="Intro:Terms:Line1">
Utilizzando questo programma, attesti di accettare i seguenti termini:
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
<Bold>non</Bold> supporta nativamente le mod. Ciò significa che:
</Span>
<Span x:Key="Intro:Terms:Term1">
Le mod
<Bold>smetteranno di funzionare</Bold> ad ogni aggiornamento. È assolutamente normale, e
<Bold>non è</Bold> colpa di Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term2">
Le mod
<Bold>causeranno</Bold> bug e problemi di prestazioni. Questa
<Bold>non è</Bold> colpa di Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term3">
Le mod sono fatte
<Bold>gratuitamente</Bold> da sviluppatori nel loro
<Bold>tempo libero.</Bold> Ti invitiamo ad essere paziente e di comprendere la situazione.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
<Bold>NON</Bold> lasciare feedback negativi solo perche le mod smettono di funzionare. Questa
<Bold>non è</Bold> colpa Beat Games.
<LineBreak/> Non è loro intenzione "rompere" le mod.
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
Se continuerò a trovare persone che lasciano feedback negativi
<Italic>perchè</Italic> le mod smettono di funzionare,
<LineBreak/>
<Bold>Mi assicurerò di farle sparire dalla circolazione</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
Ti invitiamo a leggere la guida introduttiva sulla
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
Wiki
</Hyperlink>.
</Span>
<sys:String x:Key="Intro:AgreeButton">Accetto</sys:String>
<sys:String x:Key="Intro:DisagreeButton">Non accetto</sys:String>
<sys:String x:Key="Intro:ClosingApp">Chiusura dell'app: Non hai accettato i termini e condizioni.</sys:String>
<sys:String x:Key="Intro:VersionDownloadFailed">Non sono riuscito a scaricare la lista delle versioni</sys:String>
<sys:String x:Key="Intro:ModsTabDisabled">Menù delle mod disattivato. Ti invitiamo a riprovare riavviando il programma.</sys:String>
<sys:String x:Key="Intro:ModsTabEnabled">Ora puoi utilizzare il menù Mod!</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">Mod</sys:String>
<sys:String x:Key="Mods:Header:Name">Nome</sys:String>
<sys:String x:Key="Mods:Header:Installed">Versione installata</sys:String>
<sys:String x:Key="Mods:Header:Latest">Ultima versione</sys:String>
<sys:String x:Key="Mods:Header:Description">Descrizione</sys:String>
<sys:String x:Key="Mods:Header:Uninstall">Disinstalla</sys:String>
<sys:String x:Key="Mods:UninstallButton">Disinstalla</sys:String>
<sys:String x:Key="Mods:LoadFailed">Impossibile caricare la lista delle mod</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">Controllo le mod installate</sys:String>
<sys:String x:Key="Mods:LoadingMods">Carico le mod</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">Caricamento delle mod completato</sys:String>
<sys:String x:Key="Mods:InstallingMod">Installazione di {0} in corso</sys:String>
<sys:String x:Key="Mods:InstalledMod">{0} installato</sys:String>
<sys:String x:Key="Mods:FinishedInstallingMods">Installazione delle mod completata</sys:String>
<sys:String x:Key="Mods:ModDownloadLinkMissing">Impossibile trovare il link di download per {0}</sys:String>
<sys:String x:Key="Mods:UninstallBox:Title">Vuoi disinstallare {0}?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body1">Sei sicuro di voler disinstallare {0}?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body2">Continuando, altre mod potrebbero smettere di funzionare</sys:String>
<sys:String x:Key="Mods:FailedExtract">Impossibile estrarre {0}, prossimo tentativo in {1} secondi. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">Non sono riuscito ad estrarre {0} dopo aver raggiunto il numero massimo di tentativi ({1}), salto questa mod. Questa protrebbe anche non funzionare correttamente, quindi procedi a tuo rischio e pericolo</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String> <!-- NEEDS TRANSLATING -->
<!-- About Page -->
<sys:String x:Key="About:Title">Info</sys:String>
<sys:String x:Key="About:PageTitle">Info su Mod Assistant</sys:String>
<sys:String x:Key="About:List:Header">Ciao, sono Assistant, ed ho creato Mod Assistant per aiutarmi con le mod, con alcuni principi in testa:</sys:String>
<sys:String x:Key="About:List:Item1">Semplicità d'uso</sys:String>
<sys:String x:Key="About:List:Item2">Portabilità</sys:String>
<sys:String x:Key="About:List:Item3">Un solo eseguibile</sys:String>
<sys:String x:Key="About:List:Item4">Uso responsabile</sys:String>
<Span x:Key="About:SupportAssistant">
Se ti piace questo programma, e volessi supportarmi, puoi visitare la mia
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
pagina delle donazioni
</Hyperlink>
oppure il mio
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Ringraziamenti speciali ♥</sys:String>
<sys:String x:Key="About:Donate">Donazioni</sys:String>
<sys:String x:Key="About:HeadpatsButton">Carezze</sys:String>
<sys:String x:Key="About:HugsButton">Abbracci</sys:String>
<!-- Options Page -->
<sys:String x:Key="Options:Title">Opzioni</sys:String>
<sys:String x:Key="Options:PageTitle">Impostazioni</sys:String>
<sys:String x:Key="Options:InstallFolder">Directory d'Installazione</sys:String>
<sys:String x:Key="Options:SelectFolderButton">Seleziona Cartella</sys:String>
<sys:String x:Key="Options:OpenFolderButton">Apri Cartella</sys:String>
<sys:String x:Key="Options:SaveSelectedMods">Salva le Mod Selezionate</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Rileva le Mod Installate</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Seleziona le Mod Installate</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Reinstalla le Mod</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">Attiva OneClick™</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Tipo di Installazione</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:Diagnostics">Diagnostica</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Apri il Log</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">Apri AppData</sys:String>
<sys:String x:Key="Options:UninstallBSIPAButton">Disinstalla BSIPA</sys:String>
<sys:String x:Key="Options:RemoveAllModsButton">Rimuovi Tutte le Mod</sys:String>
<sys:String x:Key="Options:ApplicationTheme">Tema dell'app</sys:String>
<sys:String x:Key="Options:ExportTemplateButton">Esporta Template</sys:String>
<sys:String x:Key="Options:UploadingLog">Caricamento del Log</sys:String>
<sys:String x:Key="Options:LogUrlCopied">URL del Log copiato negli Appunti!</sys:String>
<sys:String x:Key="Options:LogUploadFailed">Caricamento del Log Fallito</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Title">Caricamento del Log Fallito!</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Body">Non sono riuscito a caricare il Log su Teknik, ti invitiamo a riprovare oppure puoi caricare il file manualmente.</sys:String>
<sys:String x:Key="Options:GettingModList">Prendo la lista delle Mod</sys:String>
<sys:String x:Key="Options:FindingBSIPAVersion">Cerco la versione di BSIPA</sys:String>
<sys:String x:Key="Options:BSIPAUninstalled">BSIPA Disinstallato</sys:String>
<sys:String x:Key="Options:YeetModsBox:Title">Disinstallare tutte le Mod?</sys:String>
<sys:String x:Key="Options:YeetModsBox:RemoveAllMods">Sei sicuro di voler rimuovere TUTTE le mod?</sys:String>
<sys:String x:Key="Options:YeetModsBox:CannotBeUndone">Questa azione non può essere annullata.</sys:String>
<sys:String x:Key="Options:AllModsUninstalled">Tutte le Mod sono state Disinstallate</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Il tema corrente è stato rimosso, torno al principale...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Cartella del tema non trovata! Prova ad esportare il template...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">Cartella AppData non trovata! Prova ad avviare il gioco.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Caricamento delle Mod</sys:String>
<!-- Invalid Page -->
<sys:String x:Key="Invalid:Title">Non Valida</sys:String>
<sys:String x:Key="Invalid:PageTitle">Installazione non valida rilevata</sys:String>
<sys:String x:Key="Invalid:PageSubtitle">La tua installazione di BeatSaber è corrotta o invalida</sys:String>
<sys:String x:Key="Invalid:List:Header">Ciò accade se hai una copia piratata, oppure se hai installato una versione originale senza rimuovere quella piratata</sys:String>
<Span x:Key="Invalid:List:Line1">
Se la tua copia è piratata,
<Bold>ti invitiamo a compare il gioco
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
QUI
</Hyperlink>
</Bold>.
</Span>
<Span x:Key="Invalid:List:Line2">
Se la tua copia del gioco
<Bold>non è</Bold> piratata, ti invitiamo a
<Hyperlink NavigateUri="https://bsmg.wiki/support#clean-installation" local:HyperlinkExtensions.IsExternal="True">
reinstallare il gioco
</Hyperlink>.
</Span>
<Span x:Key="Invalid:List:Line3">
Se questo non aiuta, puoi sempre chiedere aiuto nel canale
<Span Foreground="Blue">#support</Span> all'interno del
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
Server Discord di BSMG
</Hyperlink>.
</Span>
<sys:String x:Key="Invalid:BoughtGame1">Se avevi la versione piratata, ma hai comprato il gioco</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">Seleziona cartella</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Dovrai riavviare ModAssistant dopo aver cambiato la directory d'Installazione</sys:String>
<!-- OneClick Class -->
<sys:String x:Key="OneClick:MapDownloadFailed">Impossibile estrarre i dettagli della mappa.</sys:String>
<sys:String x:Key="OneClick:SongDownloadFailed">Impossibile scaricare il brano.</sys:String>
<sys:String x:Key="OneClick:SongDownload:Failed">Non sono riuscito a scaricare il brano.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">Ci possono essere problemi con BeatSaver e/o la tua connessione ad Internet.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">Download del file ZIP della mappa fallito</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">Directory d'installazione di Beat Saber non trovata.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installato: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Non sono riuscito ad installare la mappa.</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} Registrazione dei gestori OneClick™ riuscita!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} De-Regitrazione dei gestori OneClick™ riuscita!</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Tema non trovato, ritorno al tema predefinito...</sys:String>
<sys:String x:Key="Themes:ThemeSet">Tema impostato su {0}.</sys:String>
<sys:String x:Key="Themes:ThemeMissing">{0} non esiste.</sys:String>
<sys:String x:Key="Themes:SavedTemplateTheme">Template del tema &quot;{0}&quot; salvato nella cartella Themes.</sys:String>
<sys:String x:Key="Themes:TemplateThemeExists">Template del tema già esistente!</sys:String>
<sys:String x:Key="Themes:FailedToLoadXaml">Impossibile caricare il file .xaml per il tema {0}: {1}</sys:String>
<!-- Updater Class -->
<sys:String x:Key="Updater:CheckFailed">Impossibile controllare gli aggiornamenti.</sys:String>
<sys:String x:Key="Updater:DownloadFailed">Impossibile scaricare l'aggiornamento.</sys:String>
<!-- Utils Class -->
<sys:String x:Key="Utils:NotificationTitle">Mod Assistant</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">Impossibile determinare automaticamente la directory d'installazione di Beat Saber. Ti invitiamo a selezionarla manualmente.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">Mod Assistant ha bisogno di eseguire questa azione come Amministratore. Ti invitiamo a riprovare.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">Seleziona la directory d'installazione di Beat Saber</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">Impossibile aprire la seguente cartella: {0}</sys:String>
</ResourceDictionary>

View file

@ -0,0 +1,237 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ModAssistant"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ResourceDictionaryName">i18n:ko-KR</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">비트세이버 설치 폴더를 찾을 수 없습니다!</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">OK를 눌러 재시도하거나, Cancel을 눌러 프로그램을 종료할 수 있습니다.</sys:String>
<sys:String x:Key="App:InvalidArgument">유효하지 않은 인수입니다! '{0}'은 옵션을 필요로 합니다.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">인식할 수 없는 인수입니다. 모드 어시스턴트를 종료합니다.</sys:String>
<sys:String x:Key="App:UnhandledException">처리되지 않은 예외가 발생했습니다.</sys:String>
<sys:String x:Key="App:Exception">예외</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">모드 어시스턴트</sys:String>
<sys:String x:Key="MainWindow:IntroButton">인트로</sys:String>
<sys:String x:Key="MainWindow:ModsButton">모드</sys:String>
<sys:String x:Key="MainWindow:AboutButton">정보</sys:String>
<sys:String x:Key="MainWindow:OptionsButton">옵션</sys:String>
<sys:String x:Key="MainWindow:GameVersionLabel">게임 버전</sys:String>
<sys:String x:Key="MainWindow:VersionLabel">버전</sys:String>
<sys:String x:Key="MainWindow:ModInfoButton">모드 설명</sys:String>
<sys:String x:Key="MainWindow:InstallButtonTop">설치</sys:String>
<sys:String x:Key="MainWindow:InstallButtonBottom">또는 업데이트</sys:String>
<sys:String x:Key="MainWindow:GameVersionLoadFailed">게임 버전을 로드할 수 없었기 때문에 모드 탭이 비활성화됩니다.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Title">새로운 게임 버전이 감지되었습니다!</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line1">게임 업데이트가 있었던 것 같습니다.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line2">왼쪽 아래에 선택된 버전이 맞는 버전인지 다시 한번 확인해주세요!</sys:String>
<sys:String x:Key="MainWindow:NoModSelected">아무런 모드도 선택되지 않았습니다!</sys:String>
<sys:String x:Key="MainWindow:NoModInfoPage">{0}는 설명 페이지를 가지고 있지 않습니다.</sys:String>
<!-- Intro Page -->
<sys:String x:Key="Intro:Title">인트로</sys:String>
<sys:String x:Key="Intro:PageTitle">모드 어시스턴트에 어서오세요</sys:String>
<sys:String x:Key="Intro:Terms:Header">이 페이지를 정독해주세요</sys:String>
<Span x:Key="Intro:Terms:Line1">
이 프로그램을 사용하려면 다음 약관을 읽고 동의해야 합니다:
</Span>
<Span x:Key="Intro:Terms:Line2">
비트세이버는 공식적으로 모드를
<Bold>지원하지 않습니다.</Bold>
</Span>
<Span x:Key="Intro:Terms:Term1">
이것은 모드들이 매 업데이트마다
<Bold>망가진다는 것을</Bold> 의미합니다. 이것은 일반적이며, Beat Games'의 탓이
<Bold>아닙니다.</Bold>
</Span>
<Span x:Key="Intro:Terms:Term2">
모드들은 버그와 성능 문제를
<Bold>발생시킵니다.</Bold> 이것은 Beat Games'의 탓이
<Bold>아닙니다.</Bold>
</Span>
<Span x:Key="Intro:Terms:Term3">
모드들은
<Bold>무료로</Bold> 만들어졌으며 모더들의
<Bold>소중한 시간의 결과물입니다.</Bold>기다림을 갖고 이해해주세요.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
모드가 망가진 것 때문에 게임에 대한 부정적인 의견을<Bold>남기지 마세요.</Bold> 이것은 Beat Games'의 탓이
<Bold>아닙니다.</Bold>
<LineBreak/> Beat Games'는 모드를 죽이려 하지 않습니다.
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
만일 사람들이 모드가
<Italic>망가진 것을 이유로</Italic> 부정적인 의견을 남기는 것을 계속 보게 된다면,
<LineBreak/>
<Bold>제가 개인적으로 모드를 터트릴지도요..?</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
위키
</Hyperlink>에 있는 초보자 가이드를 읽어주세요.
</Span>
<sys:String x:Key="Intro:AgreeButton">동의합니다</sys:String>
<sys:String x:Key="Intro:DisagreeButton">거부합니다</sys:String>
<sys:String x:Key="Intro:ClosingApp">어플리케이션을 종료합니다: 당신은 약관에 동의하지 않았습니다.</sys:String>
<sys:String x:Key="Intro:VersionDownloadFailed">버전 리스트를 다운로드할 수 없었습니다</sys:String>
<sys:String x:Key="Intro:ModsTabDisabled">모드 탭이 비활성화되었습니다. 어시스턴트를 재시작해주세요.</sys:String>
<sys:String x:Key="Intro:ModsTabEnabled">이제 모드 탭을 사용할 수 있습니다!</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">모드</sys:String>
<sys:String x:Key="Mods:Header:Name">이름</sys:String>
<sys:String x:Key="Mods:Header:Installed">설치 버전</sys:String>
<sys:String x:Key="Mods:Header:Latest">최신 버전</sys:String>
<sys:String x:Key="Mods:Header:Description">설명</sys:String>
<sys:String x:Key="Mods:Header:Uninstall">제거</sys:String>
<sys:String x:Key="Mods:UninstallButton">제거</sys:String>
<sys:String x:Key="Mods:LoadFailed">모드 목록을 불러올 수 없었습니다</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">설치된 모드들을 확인하고 있습니다</sys:String>
<sys:String x:Key="Mods:LoadingMods">모드들을 불러오고 있습니다</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">모드들을 불러왔습니다</sys:String>
<sys:String x:Key="Mods:InstallingMod">Installing {0}</sys:String>
<sys:String x:Key="Mods:InstalledMod">Installed {0}</sys:String>
<sys:String x:Key="Mods:FinishedInstallingMods">모드 설치를 마쳤습니다</sys:String>
<sys:String x:Key="Mods:ModDownloadLinkMissing">{0}를 위한 다운로드 링크를 찾을 수 없었습니다</sys:String>
<sys:String x:Key="Mods:UninstallBox:Title">{0}를 제거하시겠습니까?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body1">정말로 {0}를 제거하시겠습니까?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body2">다른 모드를 사용 못하게 만들 수도 있습니다.</sys:String>
<sys:String x:Key="Mods:FailedExtract">{0}를 추출하는데 실패했습니다. {1}초 안에 재시도합니다. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">({1})회동안 {0}를 추출하는데 실패했습니다. 이 모드가 제대로 작동하지 않을지도 모릅니다</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String> <!-- NEEDS TRANSLATING -->
<!-- About Page -->
<sys:String x:Key="About:Title">정보</sys:String>
<sys:String x:Key="About:PageTitle">모드 어시스턴트에 대하여</sys:String>
<sys:String x:Key="About:List:Header">I'm Assistant, and I made Mod Assistant for mod assistance, with a few principles in mind:</sys:String>
<sys:String x:Key="About:List:Item1">Simplicity</sys:String>
<sys:String x:Key="About:List:Item2">Portability</sys:String>
<sys:String x:Key="About:List:Item3">Single Executable</sys:String>
<sys:String x:Key="About:List:Item4">Responsible use</sys:String>
<Span x:Key="About:SupportAssistant">
If you enjoy this program and would like to support me, please visit my
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
donation page
</Hyperlink>
or my
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Special Thanks ♥</sys:String>
<sys:String x:Key="About:Donate">Donate</sys:String>
<sys:String x:Key="About:HeadpatsButton">Headpats</sys:String>
<sys:String x:Key="About:HugsButton">Hugs</sys:String>
<!-- Options Page -->
<sys:String x:Key="Options:Title">옵션</sys:String>
<sys:String x:Key="Options:PageTitle">설정</sys:String>
<sys:String x:Key="Options:InstallFolder">설치 폴더</sys:String>
<sys:String x:Key="Options:SelectFolderButton">폴더 선택</sys:String>
<sys:String x:Key="Options:OpenFolderButton">폴더 열기</sys:String>
<sys:String x:Key="Options:SaveSelectedMods">선택된 모드 저장</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">설치된 모드 감지</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">설치된 모드 선택</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">설치된 모드 재설치</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">OneClick™ 설치 활성화</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">게임 유형</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:Diagnostics">진단</sys:String>
<sys:String x:Key="Options:OpenLogsButton">로그 열기</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">앱데이터 열기</sys:String>
<sys:String x:Key="Options:UninstallBSIPAButton">BSIPA 삭제</sys:String>
<sys:String x:Key="Options:RemoveAllModsButton">모든 모드 삭제</sys:String>
<sys:String x:Key="Options:ApplicationTheme">어플리케이션 테마</sys:String>
<sys:String x:Key="Options:ExportTemplateButton">템플릿 추출</sys:String>
<sys:String x:Key="Options:UploadingLog">로그 제출</sys:String>
<sys:String x:Key="Options:LogUrlCopied">로그 URL이 클립보드에 복사되었습니다!</sys:String>
<sys:String x:Key="Options:LogUploadFailed">로그 제출에 실패하였습니다</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Title">로그 제출에 실패하였습니다!</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Body">Teknik에게 로그 파일을 제출하는데에 실패하였습니다. 재시도하거나 수동으로 파일을 보내주세요.</sys:String>
<sys:String x:Key="Options:GettingModList">모드 목록을 얻는중입니다</sys:String>
<sys:String x:Key="Options:FindingBSIPAVersion">BSIPA 버전을 찾는중입니다</sys:String>
<sys:String x:Key="Options:BSIPAUninstalled">BSIPA가 제거되었습니다</sys:String>
<sys:String x:Key="Options:YeetModsBox:Title">모든 모드를 제거할까요?</sys:String>
<sys:String x:Key="Options:YeetModsBox:RemoveAllMods">정말로 모든 모드를 제거할까요?</sys:String>
<sys:String x:Key="Options:YeetModsBox:CannotBeUndone">이것은 취소할 수 없습니다.</sys:String>
<sys:String x:Key="Options:AllModsUninstalled">모든 모드가 제거되었습니다</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">현재 테마를 제거중입니다. 원래 테마로 돌아갑니다...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">테마 폴더를 찾을 수 없습니다! 템플릿으로 내보냅니다...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">AppData 폴더를 찾을 수 없습니다! 게임을 실행해보세요.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">모드 로딩중</sys:String>
<!-- Invalid Page -->
<sys:String x:Key="Invalid:Title">잘못된 프로그램</sys:String>
<sys:String x:Key="Invalid:PageTitle">잘못된 프로그램 설치가 감지되었습니다</sys:String>
<sys:String x:Key="Invalid:PageSubtitle">게임이 손상되었거나 다른 이유로 잘못된 것 같습니다</sys:String>
<sys:String x:Key="Invalid:List:Header">이 오류는 게임이 불법적인 경로로 받아졌거나, 불법적인 경로로 받아진 게임을 당신의 정상적인 게임에 덮어씌워졌을 때에 발생합니다</sys:String>
<Span x:Key="Invalid:List:Line1">
만일 당신이 게임을 불법적인 경로로 받았다면,
<Bold>
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
여기서
</Hyperlink>
</Bold>게임을 구매해주세요.
</Span>
<Span x:Key="Invalid:List:Line2">
만일 당신의 게임이 불법적인 경로로 받아진게
<Bold>아니라면</Bold>,
<Hyperlink NavigateUri="https://bsmg.wiki/support#clean-installation" local:HyperlinkExtensions.IsExternal="True">
클린재설치
</Hyperlink>를 해주세요.
</Span>
<Span x:Key="Invalid:List:Line3">
만일 그것들이 도움되지 않았다면,
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>의
<Span Foreground="Blue">#support</Span> 채널에서 도움을 구하세요.
</Span>
<sys:String x:Key="Invalid:BoughtGame1">만일 불법적인 경로로 받아진 게임을 가지고 있었다가 게임을 구매했다면,</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">폴더를 선택해주세요</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">정상적인 설치 이후 모드 어시스턴트를 재시작할 필요가 있습니다</sys:String>
<!-- OneClick Class -->
<sys:String x:Key="OneClick:MapDownloadFailed">맵의 세부정보를 얻어올 수 없었습니다.</sys:String>
<sys:String x:Key="OneClick:SongDownloadFailed">곡을 받아올 수 없었습니다.</sys:String>
<sys:String x:Key="OneClick:SongDownload:Failed">곡을 받아올 수 없었습니다.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">BeatSaver 또는 당신의 인터넷 연결에 문제가 있는 것 같습니다.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">노래 ZIP 파일을 받는 데에 실패했습니다.</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">비트세이버 설치 폴더를 찾을 수 없었습니다.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">설치됨: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">설치에 실패하였습니다.</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ 설치 관리자가 등록되었습니다!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ 설치 관리자가 등록 취소되었습니다!</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">테마를 찾을 수 없어, 기본 테마로 돌아갑니다...</sys:String>
<sys:String x:Key="Themes:ThemeSet">{0} 테마로 설정합니다.</sys:String>
<sys:String x:Key="Themes:ThemeMissing">{0}는 존재하지 않습니다.</sys:String>
<sys:String x:Key="Themes:SavedTemplateTheme">템플릿 테마 &quot;{0}&quot;가 템플릿 폴더에 저장되었습니다.</sys:String>
<sys:String x:Key="Themes:TemplateThemeExists">템플릿 테마가 이미 존재합니다!</sys:String>
<sys:String x:Key="Themes:FailedToLoadXaml">테마를 위한 .xaml 파일을 불러오지 못했습니다 {0}: {1}</sys:String>
<!-- Updater Class -->
<sys:String x:Key="Updater:CheckFailed">업데이트를 확인할 수 없습니다.</sys:String>
<sys:String x:Key="Updater:DownloadFailed">업데이트를 다운로드할 수 없습니다.</sys:String>
<!-- Utils Class -->
<sys:String x:Key="Utils:NotificationTitle">모드 어시스턴트</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">비트세이버 설치 폴더를 찾을 수 없습니다. 수동으로 선택해주세요.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">모드 어시스턴트는 이 작업을 관리자 권한으로 실행하는 것을 필요로 합니다. 다시 시도해주세요.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">비트세이버 설치 폴더를 선택해주세요</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">폴더를 열 수 없습니다: {0}</sys:String>
</ResourceDictionary>

View file

@ -0,0 +1,236 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ModAssistant"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="ResourceDictionaryName">i18n:en-US</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">Beat Saber installatie map niet gevonden!</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">Klik OK om opnieuw te proberen, of Annuleren om de applicatie af te sluiten.</sys:String>
<sys:String x:Key="App:InvalidArgument">Ongeldig argument! '{0}' heeft een optie nodig.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">Niet herkend argument. Mod Assistant sluit af.</sys:String>
<sys:String x:Key="App:UnhandledException">Een onverwerkte foutcode is zojuist opgetreden</sys:String>
<sys:String x:Key="App:Exception">Foutcode</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">ModAssistant</sys:String>
<sys:String x:Key="MainWindow:IntroButton">Introductie</sys:String>
<sys:String x:Key="MainWindow:ModsButton">Mods</sys:String>
<sys:String x:Key="MainWindow:AboutButton">Over</sys:String>
<sys:String x:Key="MainWindow:OptionsButton">Opties</sys:String>
<sys:String x:Key="MainWindow:GameVersionLabel">Game Versie</sys:String>
<sys:String x:Key="MainWindow:VersionLabel">Versie</sys:String>
<sys:String x:Key="MainWindow:ModInfoButton">Mod Info</sys:String>
<sys:String x:Key="MainWindow:InstallButtonTop">Installeren</sys:String>
<sys:String x:Key="MainWindow:InstallButtonBottom">of Update</sys:String>
<sys:String x:Key="MainWindow:GameVersionLoadFailed">Kan de game versie niet laden, Mods tabblad zal onbeschikbaar zijn.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Title">Nieuwe Game Versie Gedetecteerd!</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line1">Het lijkt erop dat er een game update is geweest.</sys:String>
<sys:String x:Key="MainWindow:GameUpdateDialog:Line2">Controleer alstublieft of de correcte versie geselecteerd is linksonder in de hoek</sys:String>
<sys:String x:Key="MainWindow:NoModSelected">Geen mod geselecteerd!</sys:String>
<sys:String x:Key="MainWindow:NoModInfoPage">{0} heeft geen info pagina</sys:String>
<!-- Introductie Pagina -->
<sys:String x:Key="Intro:Title">Introductie</sys:String>
<sys:String x:Key="Intro:PageTitle">Welkom bij Mod Assistant</sys:String>
<sys:String x:Key="Intro:Terms:Header">Lees deze pagina alstublieft volledig en aandachtig</sys:String>
<Span x:Key="Intro:Terms:Line1">
Door het gebruiken van dit programma verlkaar ik de volgende voorwaarden te hebben gelezen en hier mee akkoord te gaan:
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
Ondersteund mods <Bold>niet</Bold> van zichzelf, dit betekent dat:
</Span>
<Span x:Key="Intro:Terms:Term1">
Mods
Elke update <Bold>niet meer werken</Bold>, dit is normaal en <Bold>niet</Bold> de fout van Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term2">
Mods
<Bold>zullen</Bold> bugs en prestatievermindering veroorzaken. Dit is <Bold>niet</Bold> een fout van Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term3">
Mods worden
<Bold>gratis</Bold> gemaakt door mensen in hun
<Bold>vrije tijd.</Bold> Wees alstublieft geduldig en begripvol.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
Laat <Bold>GEEN</Bold> negatieve beoordelingen achter op beat saber omdat mods niet meer werken. Dit is
<Bold>niet</Bold> de fout van Beat Games.
<LineBreak/> Ze proberen niet mods ontoegankelijk te maken.
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
Als ik blijf zien dat mensen negatieve reviews achterlaten
<Italic>omdat</Italic> mods niet meer werken,
<LineBreak/>
<Bold>zal ik persoonlijk met een roestige lepel mods niet meer laten werken</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
Lees alstublieft de 'Beginners Guide' op de wiki
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
Wiki
</Hyperlink>. (engels)
</Span>
<sys:String x:Key="Intro:AgreeButton">Accepteer</sys:String>
<sys:String x:Key="Intro:DisagreeButton">Accepteer niet</sys:String>
<sys:String x:Key="Intro:ClosingApp">Sluit applicatie af: U accepteerde de voorwaarden niet.</sys:String>
<sys:String x:Key="Intro:VersionDownloadFailed">Kon de versie lijst niet downloaden</sys:String>
<sys:String x:Key="Intro:ModsTabDisabled">Mods tabblad uitgeschakeld. Herstart het programma om opnieuw te proberen.</sys:String>
<sys:String x:Key="Intro:ModsTabEnabled">U kan nu het mods tabblad gebruiken!</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">Mods</sys:String>
<sys:String x:Key="Mods:Header:Name">Naam</sys:String>
<sys:String x:Key="Mods:Header:Installed">Geïnstalleerd</sys:String>
<sys:String x:Key="Mods:Header:Latest">Recentst</sys:String>
<sys:String x:Key="Mods:Header:Description">Beschrijving</sys:String>
<sys:String x:Key="Mods:Header:Uninstall">Deïnstalleer</sys:String>
<sys:String x:Key="Mods:UninstallButton">Deïnstalleer</sys:String>
<sys:String x:Key="Mods:LoadFailed">Kon de mod lijst niet laden</sys:String>
<sys:String x:Key="Mods:CheckingInstalledMods">Geïnstalleerde mods controleren</sys:String>
<sys:String x:Key="Mods:LoadingMods">Mods Laden</sys:String>
<sys:String x:Key="Mods:FinishedLoadingMods">Klaar met mods laden</sys:String>
<sys:String x:Key="Mods:InstallingMod">{0} wordt geïnstalleerd</sys:String>
<sys:String x:Key="Mods:InstalledMod">{0} is geïnstalleerd</sys:String>
<sys:String x:Key="Mods:FinishedInstallingMods">Klaar met mods installeren</sys:String>
<sys:String x:Key="Mods:ModDownloadLinkMissing">Kon de download link voor {0} niet vinden</sys:String>
<sys:String x:Key="Mods:UninstallBox:Title">{0} deïnstalleren?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body1"> Weet U zeker dat U {0} wilt verwijderen?</sys:String>
<sys:String x:Key="Mods:UninstallBox:Body2">Dit zou uw andere mods niet meer kunnen laten werken</sys:String>
<sys:String x:Key="Mods:FailedExtract">Kon {0} niet extracten, probeer opniew over {1} seconden. ({2}/{3})</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">Kon {0} niet extracten na maximaal aantal pogingen ({1}), Overslaan. Deze mod werkt msischien niet goed dus ga verder op eigen risico</sys:String>
<sys:String x:Key="Mods:SearchLabel">Search...</sys:String> <!-- NEEDS TRANSLATING -->
<!-- About Page -->
<sys:String x:Key="About:Title">Over</sys:String>
<sys:String x:Key="About:PageTitle">Over Mod Assistant</sys:String>
<sys:String x:Key="About:List:Header">Ik ben Assistant, en ik heb Mod Assistant gemaakt om te assisteren met mods, met een aantal principes als basis:</sys:String>
<sys:String x:Key="About:List:Item1">Eenvoud</sys:String>
<sys:String x:Key="About:List:Item2">Draagbaarheid</sys:String>
<sys:String x:Key="About:List:Item3">Één enkel uitvoerbaar bestand</sys:String>
<sys:String x:Key="About:List:Item4">Verantwoordelijk gebruik</sys:String>
<Span x:Key="About:SupportAssistant">
Als U dit programma nuttig vind en mij graag wilt steunen, ga dan naar mijn
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
donatie pagina
</Hyperlink>
of mijn
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Bijzondere dank ♥</sys:String>
<sys:String x:Key="About:Donate">Doneer</sys:String>
<sys:String x:Key="About:HeadpatsButton">Tik op hoofd</sys:String>
<sys:String x:Key="About:HugsButton">Knuffels</sys:String>
<!-- Options Page -->
<sys:String x:Key="Options:Title">Opties</sys:String>
<sys:String x:Key="Options:PageTitle">Instellingen</sys:String>
<sys:String x:Key="Options:InstallFolder">Installatie map</sys:String>
<sys:String x:Key="Options:SelectFolderButton">Selecteer map</sys:String>
<sys:String x:Key="Options:OpenFolderButton">Open map</sys:String>
<sys:String x:Key="Options:SaveSelectedMods">Sla geselecteerde mods op</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">Detecteer geïnstalleerde mods</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">Selecteer geïnstalleerde mods</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">Geïnstalleerde mods herinstalleren</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">Activeer OneClick™ Installaties</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">Game Type</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">Tools</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallPlaylist">Install Playlist</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:InstallingPlaylist">Installing Playlist: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FailedPlaylistSong">Failed song: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Finished Installing Playlist: {1}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:Diagnostics">Diagnostiek</sys:String>
<sys:String x:Key="Options:OpenLogsButton">Open Logs</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">Open AppData</sys:String>
<sys:String x:Key="Options:UninstallBSIPAButton">Deïnstalleer BSIPA</sys:String>
<sys:String x:Key="Options:RemoveAllModsButton">Verwijder Alle Mods</sys:String>
<sys:String x:Key="Options:ApplicationTheme">Applicatie thema</sys:String>
<sys:String x:Key="Options:ExportTemplateButton">Exporteer sjabloon</sys:String>
<sys:String x:Key="Options:UploadingLog">Log aan het uploaden</sys:String>
<sys:String x:Key="Options:LogUrlCopied">Log URL gekopieerd naar klembord!</sys:String>
<sys:String x:Key="Options:LogUploadFailed">Log Upload Mislukt</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Title">Log upload mislukt!</sys:String>
<sys:String x:Key="Options:LogUploadFailed:Body">Kon het log bestand niet uploaden naar teknik, probeer alstublieft opnieuw of upload handmatig.</sys:String>
<sys:String x:Key="Options:GettingModList">Mod Lijst Ophalen</sys:String>
<sys:String x:Key="Options:FindingBSIPAVersion">BSIPA versie vinden</sys:String>
<sys:String x:Key="Options:BSIPAUninstalled">BSIPA Gedeïnstalleerd</sys:String>
<sys:String x:Key="Options:YeetModsBox:Title">Deïnstalleer ALLE mods?</sys:String>
<sys:String x:Key="Options:YeetModsBox:RemoveAllMods">Weet U zeker dat U ALLE mods wilt deïnstalleren?</sys:String>
<sys:String x:Key="Options:YeetModsBox:CannotBeUndone">Dit kan niet ongedaan gemaakt worden.</sys:String>
<sys:String x:Key="Options:AllModsUninstalled">Alle mods gedeïnstalleerd</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">Huidig thema is verwijderd, terugvallen op standaard...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">Thema map niet gevonden! probeer het sjabloon te exporteren...</sys:String>
<sys:String x:Key="Options:AppDataNotFound">Appdata map niet gevonden! probeer Uw spel te starten.</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">Mods Laden</sys:String>
<!-- Invalid Page -->
<sys:String x:Key="Invalid:Title">Ongeldig</sys:String>
<sys:String x:Key="Invalid:PageTitle">Ongeldige Installatie Gedetecteerd</sys:String>
<sys:String x:Key="Invalid:PageSubtitle">Uw game installatie is corrupt of ongeldig</sys:String>
<sys:String x:Key="Invalid:List:Header">Dit kan gebeuren als U een gepirateerde versie heeft, of een gepirateerde versie over de legitieme versie heeft gekopieerd</sys:String>
<Span x:Key="Invalid:List:Line1">
Als Uw game versie is gepirateerd,
<Bold>Koop alstublieft de game
<Hyperlink NavigateUri="https://beatgames.com/" local:HyperlinkExtensions.IsExternal="True">
HIER
</Hyperlink>
</Bold>.
</Span>
<Span x:Key="Invalid:List:Line2">
Als Uw game versie
<Bold>niet</Bold> gepirateerd is, doe dan alstublieft
<Hyperlink NavigateUri="https://bsmg.wiki/support#clean-installation" local:HyperlinkExtensions.IsExternal="True">
een "schone" installatie
</Hyperlink>.
</Span>
<Span x:Key="Invalid:List:Line3">
Als dat allebei niet helpt, vraag om hulp in de
<Span Foreground="Blue">#support</Span> channel in
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>. (Engels)
</Span>
<sys:String x:Key="Invalid:BoughtGame1">Als U een gepirateerde versie van het spel had maar nu het spel hebt gekocht</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">Selecteer map</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Dan moet U Mod Assistant opnieuw starten na het wisselen naar de legitieme installatie</sys:String>
<!-- OneClick Class -->
<sys:String x:Key="OneClick:MapDownloadFailed">Kon de Map details niet vinden.</sys:String>
<sys:String x:Key="OneClick:SongDownloadFailed">Kon het nummer niet downloaden.</sys:String>
<sys:String x:Key="OneClick:SongDownload:Failed">Kon het nummer niet downlaoden.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">Er kunnen problemen zijn met BeatSaver of Uw internet verbinding.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">Kon de ZIP van het nummer niet downloaden</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">Kon het Beat Saber installatie pad niet vinden</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">{0} Geïnstalleerd</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Installatie mislukt</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Installeer afhandelingen geregistreerd!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Install afhandelingen uitgeregistreerd!</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Thema niet gevonden, terugvallen op standaard thema...</sys:String>
<sys:String x:Key="Themes:ThemeSet">Theme ingesteld op {0}.</sys:String>
<sys:String x:Key="Themes:ThemeMissing">{0} bestaat niet.</sys:String>
<sys:String x:Key="Themes:SavedTemplateTheme">Thema sjabloon &quot;{0}&quot; opgeslagen in de thema map.</sys:String>
<sys:String x:Key="Themes:TemplateThemeExists">Thema sjabloon bestaat al!</sys:String>
<sys:String x:Key="Themes:FailedToLoadXaml">.xaml bestand laden voor {0} mislukt: {1}</sys:String>
<!-- Updater Class -->
<sys:String x:Key="Updater:CheckFailed">Kon niet controleren voor updates</sys:String>
<sys:String x:Key="Updater:DownloadFailed">Kon update niet downloaden</sys:String>
<!-- Utils Class -->
<sys:String x:Key="Utils:NotificationTitle">Mod Assistant</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">Kon Uw Beat Saber installatie map niet vinden. Selecteer deze alstublieft handmatig.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">Mod Assistant moet deze taak als adminstrator uitvoeren. Probeer alstublieft opnieuw.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">Selecteer Uw Beat Saber installatie map</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">Kan map niet openen: {0}</sys:String>
</ResourceDictionary>

View file

@ -100,7 +100,7 @@
<sys:String x:Key="Mods:UninstallBox:Body2">这可能会导致其他Mod不可用。</sys:String>
<sys:String x:Key="Mods:FailedExtract">{0}解压失败,将在{1}秒后重试。({2}/{3}</sys:String>
<sys:String x:Key="Mods:FailedExtractMaxReached">{0}在重试{1}次后仍然无法解压将被跳过。注意这个Mod可能无法使用。</sys:String>
<sys:String x:Key="Mods:SearchLabel">搜索...</sys:String>
<!-- About Page -->
<sys:String x:Key="About:Title">关于</sys:String>
@ -134,12 +134,18 @@
<sys:String x:Key="Options:SaveSelectedMods">保存选中的Mod</sys:String>
<sys:String x:Key="Options:CheckInstalledMods">检查已安装的Mod</sys:String>
<sys:String x:Key="Options:SelectInstalledMods">选中已安装的Mod</sys:String>
<sys:String x:Key="Options:ReinstallInstalledMods">重新安装已有Mod</sys:String>
<sys:String x:Key="Options:EnableOneClickInstalls">在以下站点启用OneClick™一键安装</sys:String>
<sys:String x:Key="Options:BeatSaver">BeatSaver</sys:String>
<sys:String x:Key="Options:ModelSaber">ModelSaber</sys:String>
<sys:String x:Key="Options:GameType">游戏类型</sys:String>
<sys:String x:Key="Options:GameType:Steam">Steam</sys:String>
<sys:String x:Key="Options:GameType:Oculus">Oculus</sys:String>
<sys:String x:Key="Options:Tools">工具</sys:String>
<sys:String x:Key="Options:InstallPlaylist">添加歌单Playlist</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">正在添加歌单:{0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">失败歌曲:{0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0}失败]添加{1}完成</sys:String>
<sys:String x:Key="Options:Diagnostics">诊断工具</sys:String>
<sys:String x:Key="Options:OpenLogsButton">打开日志</sys:String>
<sys:String x:Key="Options:OpenAppDataButton">打开游戏存档</sys:String>
@ -161,6 +167,7 @@
<sys:String x:Key="Options:AllModsUninstalled">已卸载所有Mod</sys:String>
<sys:String x:Key="Options:CurrentThemeRemoved">当前主题已被删除,恢复为默认...</sys:String>
<sys:String x:Key="Options:ThemeFolderNotFound">找不到主题文件夹!请尝试导出模板</sys:String>
<sys:String x:Key="Options:AppDataNotFound">找不到游戏存档路径!请尝试启动游戏后重试。</sys:String>
<!-- Loading Page -->
<sys:String x:Key="Loading:Loading">正在加载Mod...</sys:String>

View file

@ -198,26 +198,31 @@
</StackPanel>
</Button>
<Button
Name="InstallButton"
Grid.Column="2"
Width="100"
<StackPanel
Grid.Column="2" Orientation="Horizontal"
Height="40"
Width="100"
Margin="0,10,0,0"
HorizontalAlignment="Right"
Click="InstallButton_Click"
IsEnabled="False">
<StackPanel>
<TextBlock
HorizontalAlignment="Right">
<Button
Name="InstallButton"
Width="100"
Height="40"
HorizontalAlignment="Right"
Click="InstallButton_Click"
IsEnabled="False">
<StackPanel>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Text="{DynamicResource MainWindow:InstallButtonTop}" />
<TextBlock
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Text="{DynamicResource MainWindow:InstallButtonBottom}" />
</StackPanel>
</Button>
</StackPanel>
</Button>
</StackPanel>
</Grid>
</Grid>
</Grid>

View file

@ -95,7 +95,7 @@ namespace ModAssistant
}
if(Utils.Constants.DownloadSite == "国内中转")
{
MessageBox.Show("你当前正在使用国内中转源的ModAssistant。不是从BeatMods源站下载\n而是连接WGzeyu提供的国际线路较好的国内服务器中转访问源站下载。\n\n通常我们建议使用源站版直接连接BeatMods下载。\n但国内部分运营商连接BeatMods时下载速度甚至低于20KB/s\n完全下不动导致报错无法安装这个版本就是为了这些用户准备的。\n\n国内中转服务器由中文版作者WGzeyu提供。\n由于中转服务器带宽较低且每次中转安装都会占用作者的网速与流量\n所以我们对中转下载设置了限速3Mbps安装常用Mod总计需一分钟左右。\n\n【注意】如果软件发布了更新那么国内中转版会默认更新到源站版\n但文件名不会变如有需要可重新到群文件下载新的国内中转版。\n\n点击确定将打开源站中文列表版ModAssistant下载地址。");
MessageBox.Show("你当前正在使用国内中转源的ModAssistant。不是从BeatMods源站下载\n而是连接WGzeyu提供的国际线路较好的国内服务器中转访问源站下载。\n\n通常我们建议使用源站版直接连接BeatMods下载。\n但国内部分运营商连接BeatMods时下载速度甚至低于20KB/s\n完全下不动导致报错无法安装这个版本就是为了这些用户准备的。\n\n国内中转服务器由中文版作者WGzeyu提供。\n由于中转服务器带宽较低且每次中转安装都会占用作者的网速与流量\n所以我们对中转下载设置了限速3Mbps安装常用Mod总计需一分钟左右。\n\n【注意】如果软件发布了更新那么国内中转版会默认更新到源站版\n但文件名不会变如有需要可重新到资源共享下载新的国内中转版。\n\n点击确定将打开源站中文列表版ModAssistant下载地址。");
System.Diagnostics.Process.Start("https://github.com/wgzeyu/ModAssistant-CN/releases/latest");
}
}

View file

@ -38,6 +38,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression" />
@ -65,18 +66,26 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Classes\External Interfaces\BeatSaver.cs" />
<Compile Include="Classes\External Interfaces\ModelSaber.cs" />
<Compile Include="Classes\External Interfaces\Playlists.cs" />
<Compile Include="Classes\External Interfaces\Utils.cs" />
<Compile Include="Classes\Http.cs" />
<Compile Include="Classes\HyperlinkExtensions.cs" />
<Compile Include="Classes\Promotions.cs" />
<Compile Include="Classes\Diagnostics.cs" />
<Compile Include="Classes\Themes.cs" />
<Compile Include="Classes\Updater.cs" />
<Compile Include="Libs\semver\IntExtensions.cs" />
<Compile Include="Libs\semver\SemVersion.cs" />
<Compile Include="Libs\semver\IntExtensions.cs" />
<Compile Include="Pages\Intro.xaml.cs">
<DependentUpon>Intro.xaml</DependentUpon>
</Compile>
<Compile Include="Classes\Mod.cs" />
<Page Include="Localisation\de.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\en-DEBUG.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -98,6 +107,22 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\fr.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\it.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\ko.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\nl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\zh.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@ -175,6 +200,14 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\MenuItem.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\Menu.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Styles\RepeatButton.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -244,6 +277,7 @@
<None Include="Properties\Settings.settings">
<Generator>PublicSettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</None>
</ItemGroup>
<ItemGroup>

View file

@ -12,15 +12,51 @@
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
Name="SearchText"
Padding="5,0,0,0"
Height="0"
Grid.Row="0"
Text="{DynamicResource Mods:SearchLabel}"
Panel.ZIndex="1"
Foreground="{DynamicResource TextColor}"
Background="{DynamicResource BottomStatusBarBackground}" />
<TextBox
Name="SearchBar"
Margin="0,-1,0,0"
Padding="3,1,0,0"
Height="0"
Grid.Row="0"
Panel.ZIndex="2"
Background="#00000000"
Foreground="{DynamicResource TextColor}"
TextChanged="SearchBar_TextChanged"
BorderThickness="0" />
<ListView
Name="ModsListView"
Grid.Column="1"
Grid.Row="1"
SelectionChanged="ModsListView_SelectionChanged"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Width="30">
<GridViewColumn.Header>
<Button
Name="SearchButton"
Background="#00000000"
BorderThickness="0"
Click="SearchButton_Click"
Padding="9,-1,9,0"
Margin="-5"
Content="🔍"
FontSize="11" />
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox

View file

@ -12,6 +12,8 @@ using System.Windows.Forms;
using System.Windows.Navigation;
using static ModAssistant.Http;
using ModAssistant.Libs;
using System.Windows.Media.Animation;
using TextBox = System.Windows.Controls.TextBox;
namespace ModAssistant.Pages
{
@ -360,7 +362,10 @@ namespace ModAssistant.Pages
foreach (Mod mod in ModsList)
{
// Ignore mods that are newer than installed version
if (mod.ListItem.IsNewerVersionInstalled) continue;
if (mod.ListItem.GetVersionComparison > 0) continue;
// Ignore mods that are on current version if we aren't reinstalling mods
if (mod.ListItem.GetVersionComparison == 0 && !App.ReinstallInstalledMods) continue;
if (mod.name.ToLower() == "bsipa")
{
@ -586,13 +591,14 @@ namespace ModAssistant.Pages
{
get
{
return !IsInstalled ? "-" : _installedVersion.ToString();
if (!IsInstalled || _installedVersion == null) return "-";
return _installedVersion.ToString();
}
set
{
if (value != null)
if (SemVersion.TryParse(value, out SemVersion tempInstalledVersion))
{
_installedVersion = SemVersion.Parse(value);
_installedVersion = tempInstalledVersion;
}
else
{
@ -619,12 +625,13 @@ namespace ModAssistant.Pages
}
}
public bool IsNewerVersionInstalled
public int GetVersionComparison
{
get
{
if (!IsInstalled) return false;
return _installedVersion > ModVersion;
if (!IsInstalled || _installedVersion < ModVersion) return -1;
if (_installedVersion > ModVersion) return 1;
return 0;
}
}
@ -759,5 +766,59 @@ namespace ModAssistant.Pages
System.Windows.Clipboard.SetText(((TextBlock)sender).Text);
Utils.SendNotify("Copied text to clipboard");
}
private void SearchButton_Click(object sender, RoutedEventArgs e)
{
if (SearchBar.Height == 0)
{
SearchBar.Focus();
Animate(SearchBar, 0, 16, new TimeSpan(0, 0, 0, 0, 300));
Animate(SearchText, 0, 16, new TimeSpan(0, 0, 0, 0, 300));
ModsListView.Items.Filter = new Predicate<object>(SearchFilter);
}
else
{
Animate(SearchBar, 16, 0, new TimeSpan(0, 0, 0, 0, 300));
Animate(SearchText, 16, 0, new TimeSpan(0, 0, 0, 0, 300));
ModsListView.Items.Filter = null;
}
}
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
ModsListView.Items.Filter = new Predicate<object>(SearchFilter);
if (SearchBar.Text.Length > 0)
{
SearchText.Text = null;
}
else
{
SearchText.Text = (string)FindResource("Mods:SearchLabel");
}
}
private bool SearchFilter(object mod)
{
ModListItem item = mod as ModListItem;
if (item.ModName.ToLower().Contains(SearchBar.Text.ToLower())) return true;
if (item.ModDescription.ToLower().Contains(SearchBar.Text.ToLower())) return true;
if (item.ModName.ToLower().Replace(" ", string.Empty).Contains(SearchBar.Text.ToLower().Replace(" ", string.Empty))) return true;
if (item.ModDescription.ToLower().Replace(" ", string.Empty).Contains(SearchBar.Text.ToLower().Replace(" ", string.Empty))) return true;
return false;
}
private void Animate(TextBlock target, double oldHeight, double newHeight, TimeSpan duration)
{
target.Height = oldHeight;
DoubleAnimation animation = new DoubleAnimation(newHeight, duration);
target.BeginAnimation(TextBlock.HeightProperty, animation);
}
private void Animate(TextBox target, double oldHeight, double newHeight, TimeSpan duration)
{
target.Height = oldHeight;
DoubleAnimation animation = new DoubleAnimation(newHeight, duration);
target.BeginAnimation(TextBox.HeightProperty, animation);
}
}
}

View file

@ -28,6 +28,9 @@
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
@ -71,17 +74,17 @@
<Button
Grid.Row="2"
Grid.Column="2"
Width="93"
Height="30"
Margin="3"
Margin="5"
Padding="5"
Click="SelectDirButton_Click"
Content="{DynamicResource Options:SelectFolderButton}" />
<Button
Grid.Row="2"
Grid.Column="3"
Width="93"
Height="30"
Margin="3"
Margin="5"
Padding="5"
Click="OpenDirButton_Click"
Content="{DynamicResource Options:OpenFolderButton}" />
@ -138,6 +141,23 @@
<TextBlock
Grid.Row="6"
Margin="50,5,5,5"
HorizontalAlignment="Left"
FontSize="16"
FontWeight="Bold"
Text="{DynamicResource Options:ReinstallInstalledMods}" />
<CheckBox
Name="ReinstallInstalled"
Grid.Row="6"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Checked="ReinstallInstalled_Checked"
IsChecked="{Binding ReinstallInstalledMods, Mode=TwoWay}"
Unchecked="ReinstallInstalled_Unchecked" />
<TextBlock
Grid.Row="7"
Margin="5"
HorizontalAlignment="Left"
FontSize="16"
@ -147,7 +167,7 @@
</TextBlock>
<TextBlock
Grid.Row="7"
Grid.Row="8"
Margin="50,5,5,5"
HorizontalAlignment="Left"
FontSize="16"
@ -155,7 +175,7 @@
Text="{DynamicResource Options:BeatSaver}" />
<CheckBox
Name="BeatSaverProtocolHandler"
Grid.Row="7"
Grid.Row="8"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
@ -164,7 +184,7 @@
Unchecked="BeatSaverProtocolHandler_Unchecked" />
<TextBlock
Grid.Row="8"
Grid.Row="9"
Margin="50,5,5,5"
HorizontalAlignment="Left"
FontSize="16"
@ -172,7 +192,7 @@
Text="{DynamicResource Options:ModelSaber}" />
<CheckBox
Name="ModelSaberProtocolHandler"
Grid.Row="8"
Grid.Row="9"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
@ -226,18 +246,18 @@
Name="ApplicationThemeExportTemplate"
Grid.Row="13"
Grid.Column="2"
Width="93"
Height="30"
Margin="3"
Margin="5"
Padding="5"
Click="ApplicationThemeExportTemplate_Click"
Content="{DynamicResource Options:ExportTemplateButton}" />
<Button
Name="ApplicationThemeOpenThemesFolder"
Grid.Row="13"
Grid.Column="3"
Width="93"
Height="30"
Margin="3"
Margin="5"
Padding="5"
Click="ApplicationThemeOpenThemesFolder_Click"
Content="{DynamicResource Options:OpenFolderButton}" />
@ -247,36 +267,58 @@
HorizontalAlignment="Left"
FontSize="24"
FontWeight="Bold"
Text="{DynamicResource Options:Diagnostics}" />
Text="{DynamicResource Options:Tools}" />
<StackPanel
Grid.Row="15"
Grid.ColumnSpan="4"
Margin="0"
HorizontalAlignment="Left"
Orientation="Horizontal">
<Button
Width="80"
Height="30"
Margin="5"
Padding="5"
Click="InstallPlaylistButton_Click"
Content="{DynamicResource Options:InstallPlaylist}" />
</StackPanel>
<TextBlock
Grid.Row="16"
Margin="15,5,5,5"
HorizontalAlignment="Left"
FontSize="24"
FontWeight="Bold"
Text="{DynamicResource Options:Diagnostics}" />
<StackPanel
Grid.Row="17"
Grid.ColumnSpan="4"
Margin="0"
HorizontalAlignment="Left"
Orientation="Horizontal">
<Button
Height="30"
Margin="5"
Padding="5"
Click="OpenLogsDirButton_Click"
Content="{DynamicResource Options:OpenLogsButton}" />
<Button
x:Name="OpenAppData"
Width="100"
Height="30"
Margin="5"
Padding="5"
Click="OpenAppDataButton_Click"
Content="{DynamicResource Options:OpenAppDataButton}" />
<Button
x:Name="YeetBSIPA"
Width="100"
Height="30"
Margin="5"
Padding="5"
Click="YeetBSIPAButton_Click"
Content="{DynamicResource Options:UninstallBSIPAButton}" />
<Button
Width="110"
Height="30"
Margin="5"
Padding="5"
Background="{DynamicResource ButtonDangerBackground}"
Click="YeetModsButton_Click">
<TextBlock Foreground="White" Text="{DynamicResource Options:RemoveAllModsButton}" />

View file

@ -21,6 +21,7 @@ namespace ModAssistant.Pages
public bool SaveSelection { get; set; }
public bool CheckInstalledMods { get; set; }
public bool SelectInstalledMods { get; set; }
public bool ReinstallInstalledMods { get; set; }
public bool ModelSaberProtocolHandlerEnabled { get; set; }
public bool BeatSaverProtocolHandlerEnabled { get; set; }
public string LogURL { get; private set; }
@ -33,8 +34,13 @@ namespace ModAssistant.Pages
SaveSelection = App.SaveModSelection;
CheckInstalledMods = App.CheckInstalledMods;
SelectInstalledMods = App.SelectInstalledMods;
ReinstallInstalledMods = App.ReinstallInstalledMods;
if (!CheckInstalledMods)
{
SelectInstalled.IsEnabled = false;
ReinstallInstalled.IsEnabled = false;
}
UpdateHandlerStatus();
@ -85,6 +91,7 @@ namespace ModAssistant.Pages
CheckInstalledMods = true;
Properties.Settings.Default.Save();
SelectInstalled.IsEnabled = true;
ReinstallInstalled.IsEnabled = true;
if (MainWindow.ModsOpened)
{
@ -99,6 +106,7 @@ namespace ModAssistant.Pages
CheckInstalledMods = false;
Properties.Settings.Default.Save();
SelectInstalled.IsEnabled = false;
ReinstallInstalled.IsEnabled = false;
if (MainWindow.ModsOpened)
{
@ -142,6 +150,22 @@ namespace ModAssistant.Pages
Properties.Settings.Default.Save();
}
private void ReinstallInstalled_Checked(object sender, RoutedEventArgs e)
{
Properties.Settings.Default.ReinstallInstalled = true;
App.ReinstallInstalledMods = true;
ReinstallInstalledMods = true;
Properties.Settings.Default.Save();
}
private void ReinstallInstalled_Unchecked(object sender, RoutedEventArgs e)
{
Properties.Settings.Default.ReinstallInstalled = false;
App.ReinstallInstalledMods = false;
ReinstallInstalledMods = false;
Properties.Settings.Default.Save();
}
private async void OpenLogsDirButton_Click(object sender, RoutedEventArgs e)
{
try
@ -194,7 +218,14 @@ namespace ModAssistant.Pages
string location = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
"AppData", "LocalLow", "Hyperbolic Magnetism");
Utils.OpenFolder(location);
if (Directory.Exists(location))
{
Utils.OpenFolder(location);
}
else
{
MessageBox.Show((string)Application.Current.FindResource("Options:AppDataNotFound"));
}
}
private async void YeetBSIPAButton_Click(object sender, RoutedEventArgs e)
@ -277,5 +308,14 @@ namespace ModAssistant.Pages
MessageBox.Show((string)Application.Current.FindResource("Options:ThemeFolderNotFound"));
}
}
private void InstallPlaylistButton_Click(object sender, RoutedEventArgs e)
{
string playlistFile = Utils.GetManualFile();
if (File.Exists(playlistFile))
{
Task.Run(() => { API.Playlists.DownloadFrom(playlistFile, true).Wait(); });
}
}
}
}

View file

@ -51,5 +51,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.602.0")]
[assembly: AssemblyFileVersion("1.1.602.0")]
[assembly: AssemblyVersion("1.1.801.0")]
[assembly: AssemblyFileVersion("1.1.801.0")]

View file

@ -1,28 +1,28 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ModAssistant.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")]
public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -34,7 +34,7 @@ namespace ModAssistant.Properties {
this["InstallFolder"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -46,7 +46,7 @@ namespace ModAssistant.Properties {
this["StoreType"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
@ -58,7 +58,7 @@ namespace ModAssistant.Properties {
this["SaveSelected"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
@ -70,7 +70,7 @@ namespace ModAssistant.Properties {
this["CheckInstalled"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
@ -82,7 +82,7 @@ namespace ModAssistant.Properties {
this["SavedMods"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
@ -94,7 +94,7 @@ namespace ModAssistant.Properties {
this["Agreed"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
@ -106,7 +106,7 @@ namespace ModAssistant.Properties {
this["SelectInstalled"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -118,7 +118,7 @@ namespace ModAssistant.Properties {
this["GameVersion"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -130,7 +130,7 @@ namespace ModAssistant.Properties {
this["AllGameVersions"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
@ -142,7 +142,7 @@ namespace ModAssistant.Properties {
this["UpgradeRequired"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -154,7 +154,7 @@ namespace ModAssistant.Properties {
this["LastTab"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@ -166,5 +166,17 @@ namespace ModAssistant.Properties {
this["SelectedTheme"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool ReinstallInstalled {
get {
return ((bool)(this["ReinstallInstalled"]));
}
set {
this["ReinstallInstalled"] = value;
}
}
}
}

View file

@ -1,42 +1,45 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ModAssistant.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="InstallFolder" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="StoreType" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SaveSelected" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="CheckInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="SavedMods" Type="System.String" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="Agreed" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="SelectInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="GameVersion" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="AllGameVersions" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="UpgradeRequired" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="LastTab" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SelectedTheme" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
<Profiles />
<Settings>
<Setting Name="InstallFolder" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="StoreType" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SaveSelected" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="CheckInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="SavedMods" Type="System.String" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="Agreed" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="SelectInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="GameVersion" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="AllGameVersions" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="UpgradeRequired" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="LastTab" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SelectedTheme" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ReinstallInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>

28
ModAssistant/Settings.cs Normal file
View file

@ -0,0 +1,28 @@
namespace ModAssistant.Properties {
// 通过此类可以处理设置类的特定事件:
// 在更改某个设置的值之前将引发 SettingChanging 事件。
// 在更改某个设置的值之后将引发 PropertyChanged 事件。
// 在加载设置值之后将引发 SettingsLoaded 事件。
// 在保存设置值之前将引发 SettingsSaving 事件。
public sealed partial class Settings {
public Settings() {
// // 若要为保存和更改设置添加事件处理程序,请取消注释下列行:
//
// this.SettingChanging += this.SettingChangingEventHandler;
//
// this.SettingsSaving += this.SettingsSavingEventHandler;
//
}
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
// 在此处添加用于处理 SettingChangingEvent 事件的代码。
}
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
// 在此处添加用于处理 SettingsSaving 事件的代码。
}
}
}

View file

@ -0,0 +1,8 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="Menu">
<Setter Property="Background" Value="{DynamicResource ButtonBackground}" />
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBackground}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource TextColor}" />
</Style>
</ResourceDictionary>

View file

@ -0,0 +1,66 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="MenuItem">
<Setter Property="Background" Value="{DynamicResource ButtonBackground}" />
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBackground}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource TextColor}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border
x:Name="templateRoot"
BorderBrush="{DynamicResource ButtonOutline}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="4"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<Grid VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/>
<Path x:Name="GlyphPanel" Data="F1M10,1.2L4.7,9.1 4.5,9.1 0,5.2 1.3,3.5 4.3,6.1 8.3,0 10,1.2z" Fill="{TemplateBinding Foreground}" FlowDirection="LeftToRight" Margin="3" Visibility="Collapsed" VerticalAlignment="Center"/>
<ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="1" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<Popup x:Name="PART_Popup" AllowsTransparency="True" Focusable="False" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom">
<ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}">
<Grid RenderOptions.ClearTypeHint="Enabled">
<Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="1">
<Rectangle x:Name="OpaqueRect" Fill="Black" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/>
</Canvas>
<Rectangle Fill="#FFD7D7D7" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1" />
<ItemsPresenter x:Name="ItemsPresenter" Margin="0,0,0,0" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/>
</Grid>
</ScrollViewer>
</Popup>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSuspendingPopupAnimation" Value="True">
<Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/>
</Trigger>
<Trigger Property="Icon" Value="{x:Null}">
<Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/>
<Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/>
</Trigger>
<Trigger Property="IsHighlighted" Value="True">
<Setter Property="Background" Value="{DynamicResource ButtonHighlightedBackground}" />
<Setter Property="Foreground" Value="{DynamicResource TextHighlighted}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="#FF707070"/>
<Setter Property="Fill" TargetName="GlyphPanel" Value="#FF707070"/>
</Trigger>
<Trigger Property="CanContentScroll" SourceName="SubMenuScrollViewer" Value="False">
<Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/>
<Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View file

@ -1,7 +1,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--
ModAssistant BSMG theem by Megalon2D
ModAssistant BSMG theme by Megalon2D
https://twitter.com/megalon2D
-->