Merge branch 'master' into patch-1

This commit is contained in:
megalon 2020-06-09 16:23:22 -07:00 committed by GitHub
commit 4fc3417360
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 2394 additions and 190 deletions

View file

@ -50,6 +50,12 @@
<setting name="ReinstallInstalled" serializeAs="String">
<value>True</value>
</setting>
<setting name="CloseWindowOnFinish" serializeAs="String">
<value>False</value>
</setting>
<setting name="LanguageCode" serializeAs="String">
<value />
</setting>
</ModAssistant.Properties.Settings>
<ModAssistant.Settings1>
<setting name="InstallFolder" serializeAs="String">

View file

@ -21,8 +21,11 @@ namespace ModAssistant
public static bool CheckInstalledMods;
public static bool SelectInstalledMods;
public static bool ReinstallInstalledMods;
public static bool CloseWindowOnFinish;
public static string Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
public static List<string> SavedMods = ModAssistant.Properties.Settings.Default.SavedMods.Split(',').ToList();
public static MainWindow window;
public static string Arguments;
public static bool Update = true;
public static bool GUI = true;
@ -31,12 +34,7 @@ namespace ModAssistant
{
// Set SecurityProtocol to prevent crash with TLS
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
// Load localisation languages
LoadLanguage(CultureInfo.CurrentCulture.Name);
// Uncomment the next line to debug localisation
// LoadLanguage("en-DEBUG");
Languages.LoadLanguages();
if (ModAssistant.Properties.Settings.Default.UpgradeRequired)
{
@ -68,27 +66,40 @@ namespace ModAssistant
CheckInstalledMods = ModAssistant.Properties.Settings.Default.CheckInstalled;
SelectInstalledMods = ModAssistant.Properties.Settings.Default.SelectInstalled;
ReinstallInstalledMods = ModAssistant.Properties.Settings.Default.ReinstallInstalled;
CloseWindowOnFinish = ModAssistant.Properties.Settings.Default.CloseWindowOnFinish;
await ArgumentHandler(e.Args);
await Init(Update, GUI);
await Init();
}
private async Task Init(bool Update, bool GUI)
private async Task Init()
{
if (Update)
{
await Task.Run(async () => await Updater.Run());
try
{
await Task.Run(async () => await Updater.Run());
}
catch (UnauthorizedAccessException)
{
Utils.StartAsAdmin(Arguments, true);
}
}
if (GUI)
{
MainWindow window = new MainWindow();
window = new MainWindow();
window.Show();
}
else
{
//Application.Current.Shutdown();
}
}
private async Task ArgumentHandler(string[] args)
{
Arguments = string.Join(" ", args);
while (args.Length > 0)
{
switch (args[0])
@ -103,6 +114,12 @@ namespace ModAssistant
await OneClickInstaller.InstallAsset(args[1]);
}
if (CloseWindowOnFinish)
{
await Task.Delay(5 * 1000);
Current.Shutdown();
}
Update = false;
GUI = false;
args = Shift(args, 2);
@ -120,7 +137,12 @@ namespace ModAssistant
}
else
{
LoadLanguage(args[1]);
if (Languages.LoadLanguage(args[1]))
{
ModAssistant.Properties.Settings.Default.LanguageCode = args[1];
ModAssistant.Properties.Settings.Default.Save();
Languages.UpdateUI(args[1]);
}
}
args = Shift(args, 2);
@ -156,6 +178,12 @@ namespace ModAssistant
args = Shift(args, 2);
break;
case "--runforever":
while (true)
{
}
default:
Utils.SendNotify((string)Current.FindResource("App:UnrecognizedArgument"));
args = Shift(args);
@ -185,29 +213,5 @@ namespace ModAssistant
e.Handled = true;
Application.Current.Shutdown();
}
private ResourceDictionary LanguagesDict
{
get
{
return Resources.MergedDictionaries[1];
}
}
private void LoadLanguage(string culture)
{
try
{
LanguagesDict.Source = new Uri($"Localisation/{culture}.xaml", UriKind.Relative);
}
catch (IOException)
{
if (culture.Contains("-"))
{
LoadLanguage(culture.Split('-').First());
}
// Can't load language file
}
}
}
}

View file

@ -1,7 +1,12 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Web;
using System.Windows;
using static ModAssistant.Http;
@ -13,82 +18,267 @@ namespace ModAssistant.API
private static readonly string CustomSongsFolder = Path.Combine("Beat Saber_Data", "CustomLevels");
private const bool BypassDownloadCounter = false;
public static async Task GetFromKey(string Key)
public static async Task<BeatSaverMap> GetFromKey(string Key, bool showNotification = true)
{
BeatSaverApiResponse Map = await GetResponse(BeatSaverURLPrefix + "/api/maps/detail/" + Key);
await InstallMap(Map);
if (showNotification) OneClickInstaller.Status.Show();
return await GetMap(Key, "key", showNotification);
}
public static async Task GetFromHash(string Hash)
public static async Task<BeatSaverMap> GetFromHash(string Hash, bool showNotification = true)
{
BeatSaverApiResponse Map = await GetResponse(BeatSaverURLPrefix + "/api/maps/by-hash/" + Hash);
await InstallMap(Map);
if (showNotification) OneClickInstaller.Status.Show();
return await GetMap(Hash, "hash", showNotification);
}
private static async Task<BeatSaverApiResponse> GetResponse(string url)
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;
if (showNotification) Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:Installing"), id)}");
try
{
var resp = await HttpClient.GetAsync(url);
var body = await resp.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<BeatSaverApiResponse>(body);
BeatSaverApiResponse beatsaver = await GetResponse(BeatSaverURLPrefix + urlSegment + id);
if (beatsaver != null && beatsaver.map != null)
{
map.response = beatsaver;
map.Name = await InstallMap(beatsaver.map, showNotification);
map.Success = true;
}
}
catch (Exception e)
{
MessageBox.Show($"{Application.Current.FindResource("OneClick:MapDownloadFailed")}\n\n" + e);
ModAssistant.Utils.Log($"Failed downloading BeatSaver map: {id} | Error: {e.Message}", "ERROR");
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:Failed"), (map.Name ?? id))}");
App.CloseWindowOnFinish = false;
}
return map;
}
private static async Task<BeatSaverApiResponse> GetResponse(string url, bool showNotification = true, int retries = 3)
{
if (retries == 0)
{
ModAssistant.Utils.Log($"Max tries reached: Skipping {url}", "ERROR");
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:RatelimitSkip"), url)}");
App.CloseWindowOnFinish = false;
throw new Exception("Max retries allowed");
}
BeatSaverApiResponse response = new BeatSaverApiResponse();
try
{
var resp = await HttpClient.GetAsync(url);
response.statusCode = resp.StatusCode;
response.ratelimit = GetRatelimit(resp.Headers);
string body = await resp.Content.ReadAsStringAsync();
if ((int)resp.StatusCode == 429)
{
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:RatelimitHit"), response.ratelimit.ResetTime)}");
await response.ratelimit.Wait();
return await GetResponse(url, showNotification, retries - 1);
}
if (response.statusCode == HttpStatusCode.OK)
{
response.map = JsonSerializer.Deserialize<BeatSaverApiResponseMap>(body);
return response;
}
else
{
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:Failed"), url)}");
App.CloseWindowOnFinish = false;
return response;
}
}
catch (Exception e)
{
if (showNotification)
{
MessageBox.Show($"{Application.Current.FindResource("OneClick:MapDownloadFailed")}\n\n" + e);
}
return null;
}
}
public static async Task InstallMap(BeatSaverApiResponse Map)
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);
await Utils.DownloadAsset(BeatSaverURLPrefix + Map.directDownload, CustomSongsFolder, Map.hash + ".zip", mapName, showNotification, true);
}
else
{
await Utils.DownloadAsset(BeatSaverURLPrefix + Map.downloadURL, CustomSongsFolder, Map.hash + ".zip", mapName);
await Utils.DownloadAsset(BeatSaverURLPrefix + Map.downloadURL, CustomSongsFolder, Map.hash + ".zip", mapName, showNotification, true);
}
#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);
}
string mimeType = MimeMapping.GetMimeMapping(zip);
if (!string.IsNullOrEmpty(file.Name))
if (!mimeType.StartsWith("application/x-zip"))
{
ModAssistant.Utils.Log($"Failed extracting BeatSaver map: {zip} \n| Content: {string.Join("\n", File.ReadAllLines(zip))}", "ERROR");
throw new Exception("File not a zip.");
}
try
{
using (FileStream stream = new FileStream(zip, FileMode.Open))
using (ZipArchive archive = new ZipArchive(stream))
{
foreach (ZipArchiveEntry file in archive.Entries)
{
file.ExtractToFile(Path.Combine(directory, file.FullName), true);
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);
}
}
}
}
catch (Exception e)
{
File.Delete(zip);
ModAssistant.Utils.Log($"Failed extracting BeatSaver map: {zip} | Error: {e} \n| Content: {string.Join("\n", File.ReadAllLines(zip))}", "ERROR");
throw new Exception("File extraction failed.");
}
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);
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);
}
throw new Exception("Zip file not found.");
}
return mapName;
}
public static BeatSaverRatelimit GetRatelimit(HttpResponseHeaders headers)
{
BeatSaverRatelimit ratelimit = new BeatSaverRatelimit();
if (headers.TryGetValues("Rate-Limit-Remaining", out IEnumerable<string> _remaining))
{
var Remaining = _remaining.GetEnumerator();
Remaining.MoveNext();
ratelimit.Remaining = Int32.Parse(Remaining.Current);
Remaining.Dispose();
}
if (headers.TryGetValues("Rate-Limit-Reset", out IEnumerable<string> _reset))
{
var Reset = _reset.GetEnumerator();
Reset.MoveNext();
ratelimit.Reset = Int32.Parse(Reset.Current);
ratelimit.ResetTime = UnixTimestampToDateTime((long)ratelimit.Reset);
Reset.Dispose();
}
if (headers.TryGetValues("Rate-Limit-Total", out IEnumerable<string> _total))
{
var Total = _total.GetEnumerator();
Total.MoveNext();
ratelimit.Total = Int32.Parse(Total.Current);
Total.Dispose();
}
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 Download(string url, string output, int retries = 3)
{
if (retries == 0)
{
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:RatelimitSkip"), url)}");
App.CloseWindowOnFinish = false;
ModAssistant.Utils.Log($"Max tries reached: Couldn't download {url}", "ERROR");
throw new Exception("Max retries allowed");
}
var resp = await HttpClient.GetAsync(url);
if ((int)resp.StatusCode == 429)
{
var ratelimit = new BeatSaver.BeatSaverRatelimit();
ratelimit = GetRatelimit(resp.Headers);
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:RatelimitHit"), ratelimit.ResetTime)}");
await ratelimit.Wait();
await Download(url, output, retries - 1);
}
using (var stream = await resp.Content.ReadAsStreamAsync())
using (var fs = new FileStream(output, FileMode.OpenOrCreate, FileAccess.Write))
{
await stream.CopyToAsync(fs);
}
}
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 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; }

View file

@ -0,0 +1,114 @@
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)
{
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;
Playlist playlist = JsonSerializer.Deserialize<Playlist>(File.ReadAllText(file));
int 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 (response.Success)
{
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("Options:InstallingPlaylist"), TextProgress(Minimum, Maximum, Value))} {response.Name}");
}
else
{
Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("Options:FailedPlaylistSong"), song.songName)}");
ModAssistant.Utils.Log($"Failed installing BeatSaver map: {song.songName} | {song.key} | {song.hash} | ({response?.response?.ratelimit?.Remaining})");
App.CloseWindowOnFinish = false;
await Task.Delay(3 * 1000);
Errors++;
}
}
Utils.SetMessage($"{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

@ -1,9 +1,12 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Windows;
using static ModAssistant.Http;
namespace ModAssistant.API
{
@ -11,12 +14,30 @@ namespace ModAssistant.API
{
public static readonly string BeatSaberPath = App.BeatSaberInstallDirectory;
public static void SetMessage(string message)
{
if (App.window == null)
{
OneClickStatus.Instance.MainText = message;
}
else
{
MainWindow.Instance.MainText = message;
}
}
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)
{
if (string.IsNullOrEmpty(displayName))
{
displayName = Path.GetFileNameWithoutExtension(fileName);
}
await DownloadAsset(link, folder, fileName, displayName, true);
}
public static async Task DownloadAsset(string link, string folder, string fileName, string displayName, bool showNotification, bool beatsaver = false)
{
if (string.IsNullOrEmpty(BeatSaberPath))
{
ModAssistant.Utils.SendNotify((string)Application.Current.FindResource("OneClick:InstallDirNotFound"));
@ -32,15 +53,24 @@ namespace ModAssistant.API
{
fileName = WebUtility.UrlDecode(Path.Combine(BeatSaberPath, folder, fileName));
}
if (string.IsNullOrEmpty(displayName))
{
displayName = Path.GetFileNameWithoutExtension(fileName);
}
await ModAssistant.Utils.Download(link, fileName);
ModAssistant.Utils.SendNotify(string.Format((string)Application.Current.FindResource("OneClick:InstalledAsset"), displayName));
if (beatsaver) await BeatSaver.Download(link, fileName);
else await ModAssistant.Utils.Download(link, fileName);
if (showNotification)
{
SetMessage(string.Format((string)Application.Current.FindResource("OneClick:InstalledAsset"), displayName));
}
}
catch
{
ModAssistant.Utils.SendNotify((string)Application.Current.FindResource("OneClick:AssetInstallFailed"));
SetMessage((string)Application.Current.FindResource("OneClick:AssetInstallFailed"));
App.CloseWindowOnFinish = false;
}
}
}
}

View file

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using ModAssistant.Pages;
namespace ModAssistant
{
class Languages
{
public static string LoadedLanguage { get; private set; }
public static List<CultureInfo> LoadedLanguages { get => availableCultures.ToList(); }
public static bool FirstRun = true;
private static string[] availableLanguageCodes = { "de", "en", "fr", "it", "ko", "nl", "ru", "zh" };
private static IEnumerable<CultureInfo> availableCultures;
public static void LoadLanguages()
{
var allCultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
// Get CultureInfo for any of the available translations
availableCultures = allCultures.Where(cultureInfo => availableLanguageCodes.Any(code => code.Equals(cultureInfo.Name)));
string savedLanguageCode = Properties.Settings.Default.LanguageCode;
if (!LoadLanguage(savedLanguageCode))
{
// If no language code was saved, load system language
if (!LoadLanguage(CultureInfo.CurrentUICulture.Name))
{
LoadLanguage("en");
}
}
UpdateUI(LoadedLanguage);
}
public static void UpdateUI(string languageCode)
{
if (Options.Instance != null && Options.Instance.LanguageSelectComboBox != null)
{
Options.Instance.LanguageSelectComboBox.ItemsSource = availableCultures.Select(cultureInfo => cultureInfo.NativeName).ToList();
Options.Instance.LanguageSelectComboBox.SelectedIndex = LoadedLanguages.FindIndex(cultureInfo => cultureInfo.Name.Equals(languageCode));
}
}
public static ResourceDictionary LanguagesDict
{
get
{
return Application.Current.Resources.MergedDictionaries[1];
}
}
public static bool LoadLanguage(string languageCode)
{
if (string.IsNullOrEmpty(languageCode)) return false;
try
{
LanguagesDict.Source = new Uri($"Localisation/{languageCode}.xaml", UriKind.Relative);
LoadedLanguage = languageCode;
return true;
}
catch (IOException)
{
if (languageCode.Contains("-"))
{
return LoadLanguage(languageCode.Split('-').First());
}
return false;
}
}
}
}

View file

@ -8,7 +8,8 @@ namespace ModAssistant
{
class OneClickInstaller
{
private static readonly string[] Protocols = new[] { "modelsaber", "beatsaver" };
private static readonly string[] Protocols = new[] { "modelsaber", "beatsaver", "bsplaylist" };
public static OneClickStatus Status = new OneClickStatus();
public static async Task InstallAsset(string link)
{
@ -23,6 +24,9 @@ namespace ModAssistant
case "beatsaver":
await BeatSaver(uri);
break;
case "bsplaylist":
await Playlist(uri);
break;
}
}
@ -34,9 +38,17 @@ namespace ModAssistant
private static async Task ModelSaber(Uri uri)
{
Status.Show();
API.Utils.SetMessage($"{string.Format((string)Application.Current.FindResource("OneClick:Installing"), System.Web.HttpUtility.UrlDecode(uri.Segments.Last()))}");
await API.ModelSaber.GetModel(uri);
}
private static async Task Playlist(Uri uri)
{
Status.Show();
await API.Playlists.DownloadAll(uri);
}
public static void Register(string Protocol, bool Background = false)
{
if (IsRegistered(Protocol) == true)

View file

@ -433,9 +433,19 @@ namespace ModAssistant
private static BitmapImage GetImageFromEmbeddedResources(string themeName, string imageName)
{
var assembly = Assembly.GetExecutingAssembly();
var resourceNames = assembly.GetManifestResourceNames();
var desiredResourceName = $"ModAssistant.Themes.{themeName}.{imageName}.png";
// Don't attempt to access non-existent manifest resources
if (!resourceNames.Contains(desiredResourceName))
{
return null;
}
try
{
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"ModAssistant.Themes.{themeName}.{imageName}.png"))
using (Stream stream = assembly.GetManifestResourceStream(desiredResourceName))
{
byte[] imageBytes = new byte[stream.Length];
stream.Read(imageBytes, 0, (int)stream.Length);

View file

@ -16,6 +16,7 @@ namespace ModAssistant
private static Version LatestVersion;
private static bool NeedsUpdate = false;
private static string NewExe = Path.Combine(Path.GetDirectoryName(Utils.ExePath), "ModAssistant.exe");
private static string Arguments = App.Arguments;
public static async Task<bool> CheckForUpdate()
{
@ -77,7 +78,7 @@ namespace ModAssistant
private static void RunNew()
{
Process.Start(NewExe);
Process.Start(NewExe, Arguments);
Application.Current.Dispatcher.Invoke(() => { Application.Current.Shutdown(); });
}
}

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;
@ -309,7 +310,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",
@ -339,6 +340,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;
@ -387,6 +404,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,244 @@
<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:de-DE</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 Bedingungen 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ändnisvoll.
</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 Bedingungen 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">Suchen...</sys:String>
<!-- 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">Besonderer Dank ♥</sys:String>
<sys:String x:Key="About:Donate">Spenden</sys:String>
<sys:String x:Key="About:HeadpatsButton">Kopf tä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">Installationsordner</sys:String>
<sys:String x:Key="Options:SelectFolderButton">Ordner wählen</sys:String>
<sys:String x:Key="Options:OpenFolderButton">Ordner ö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:Playlists">Playlists</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:CloseWindow">Close window when finished</sys:String> <!-- NEEDS TRANSLATING -->
<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">Werkzeuge</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Playlist installieren</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">Installiere Playlist: {0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">Titel fehlgeschlagen: {0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0} Fehler] Playlist Installation abgeschlossen: {1}</sys:String>
<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 anderweitig 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">Ordner auswählen</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Muss Mod Assistant 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 Installationspfad 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™ Installation Handler registriert!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Installation Handler entfernt!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitSkip">Max tries reached: Skipping {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitHit">Ratelimit hit. Resuming in {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:Failed">Download failed: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Design nicht gefunden, gehe zurück zum Standard 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>
@ -99,9 +100,16 @@
<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:Playlists">Options:Playlists</sys:String>
<sys:String x:Key="Options:CloseWindow">Options:CloseWindow</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>
@ -151,6 +159,10 @@
<sys:String x:Key="OneClick:AssetInstallFailed">OneClick:AssetInstallFailed</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick:ProtocolHandler:Registered</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick:ProtocolHandler:Unregistered</sys:String>
<sys:String x:Key="OneClick:Installing">{0} OneClick:Installing</sys:String>
<sys:String x:Key="OneClick:RatelimitSkip">{0} OneClick:RatelimitSkip</sys:String>
<sys:String x:Key="OneClick:RatelimitHit">{0} OneClick:RatelimitHit</sys:String>
<sys:String x:Key="OneClick:Failed">{0} OneClick:Failed</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Themes:ThemeNotFound</sys:String>

View file

@ -102,6 +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>
@ -139,9 +140,16 @@
<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:Playlists">Playlists</sys:String>
<sys:String x:Key="Options:CloseWindow">Close window when finished</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>
@ -210,6 +218,10 @@
<sys:String x:Key="OneClick:AssetInstallFailed">Failed to install.</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Install handlers registered!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Install handlers unregistered!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String>
<sys:String x:Key="OneClick:RatelimitSkip">Max tries reached: Skipping {0}</sys:String>
<sys:String x:Key="OneClick:RatelimitHit">Ratelimit hit. Resuming in {0}</sys:String>
<sys:String x:Key="OneClick:Failed">Download failed: {0}</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">Theme not found, reverting to default theme...</sys:String>

View file

@ -0,0 +1,251 @@
<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">Recherche...</sys:String>
<!-- 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:Playlists">Playlists</sys:String>
<sys:String x:Key="Options:CloseWindow">Fermer la fenêtre à la fin</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">Outils</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Installer une playlist</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">Installation de la playlist : {0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">Échec de la musique : {0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0} échecs] Installation de la playlist terminée : {1}</sys:String>
<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>
<sys:String x:Key="OneClick:Installing">Installation de : {0}</sys:String>
<sys:String x:Key="OneClick:RatelimitSkip">Maximum de tentatives atteint : {0} passé</sys:String>
<sys:String x:Key="OneClick:RatelimitHit">Limite atteinte. Reprise dans {0}</sys:String>
<sys:String x:Key="OneClick:Failed">Téléchargement échoué : {0}</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,244 @@
<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">Cerca...</sys:String>
<!-- 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:Playlists">Playlists</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:CloseWindow">Close window when finished</sys:String> <!-- NEEDS TRANSLATING -->
<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">Strumenti</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Installa Playlist</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">Installazione Playlist: {0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">Installazione canzone fallita: {0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0} fails] Installazione playlist terminata: {1}</sys:String>
<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>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitSkip">Max tries reached: Skipping {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitHit">Ratelimit hit. Resuming in {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:Failed">Download failed: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<!-- 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,243 @@
<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:Playlists">Playlists</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:CloseWindow">Close window when finished</sys:String> <!-- NEEDS TRANSLATING -->
<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>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitSkip">Max tries reached: Skipping {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitHit">Ratelimit hit. Resuming in {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:Failed">Download failed: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<!-- 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

@ -36,7 +36,7 @@
<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:
Door het gebruiken van dit programma verklaar ik de volgende voorwaarden te hebben gelezen en hier mee akkoord te gaan:
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
@ -67,7 +67,7 @@
<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
Lees alstublieft de 'Beginners Guide' op de
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
Wiki
</Hyperlink>. (engels)
@ -77,7 +77,7 @@
<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>
<sys:String x:Key="Intro:ModsTabEnabled">U kunt nu het mods tabblad gebruiken!</sys:String>
<!-- Mods Page -->
<sys:String x:Key="Mods:Title">Mods</sys:String>
@ -100,6 +100,7 @@
<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">Zoek...</sys:String>
<!-- About Page -->
<sys:String x:Key="About:Title">Over</sys:String>
@ -137,9 +138,16 @@
<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:Playlists">Afspeellijsten</sys:String>
<sys:String x:Key="Options:CloseWindow">Venster sluiten na afronding</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">Hulpmiddelen</sys:String>
<sys:String x:Key="Options:InstallPlaylist">Installeer afspeellijst</sys:String>
<sys:String x:Key="Options:InstallingPlaylist">Afspeellijst installeren: {0}</sys:String>
<sys:String x:Key="Options:FailedPlaylistSong">Installatie nummer mislukt: {0}</sys:String>
<sys:String x:Key="Options:FinishedPlaylist">[{0} mislukkingen] Afspeellijst geïnstalleerd: {1}</sys:String>
<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>
@ -208,7 +216,11 @@
<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>
<sys:String x:Key="OneClick:Installing">{0} word geïnstalleerd</sys:String>
<sys:String x:Key="OneClick:RatelimitSkip">Maximaal aantal pogingen bereikt: {0} word overgeslagen</sys:String>
<sys:String x:Key="OneClick:RatelimitHit">Snelheidslimiet bereikt. Gaat verder over {0}</sys:String>
<sys:String x:Key="OneClick:Failed">Download mislukt: {0}</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>

View file

@ -0,0 +1,244 @@
<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:ru-RU</sys:String>
<!-- App -->
<sys:String x:Key="App:InstallDirDialog:Title">Не получается найти папку с установленным Beat Saber!</sys:String>
<sys:String x:Key="App:InstallDirDialog:OkCancel">Нажмите ОК, чтобы попробовать снова или ЗАКРЫТЬ, чтобы закрыть приложение.</sys:String>
<sys:String x:Key="App:InvalidArgument">Недопустимый аргумент! '{0}' требуется выбор.</sys:String>
<sys:String x:Key="App:UnrecognizedArgument">Нераспознанный аргумент. Закрытие Mod Assistant.</sys:String>
<sys:String x:Key="App:UnhandledException">Произошло необработанное исключениеd</sys:String>
<sys:String x:Key="App:Exception">Исключение</sys:String>
<!-- Main Window -->
<sys:String x:Key="MainWindow:WindowTitle">ModAssistant</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">Добро пожаловать в Mod Assistant</sys:String>
<sys:String x:Key="Intro:Terms:Header">Прочитайте эту страницу полностью и внимательно</sys:String>
<Span x:Key="Intro:Terms:Line1">
Используя эту программу, вы прочитали и принимаете эти условия:
</Span>
<Span x:Key="Intro:Terms:Line2">
Beat Saber
<Bold>не имеет</Bold> нативной поддержки модификаций. Это означает:
</Span>
<Span x:Key="Intro:Terms:Term1">
Модификации
<Bold>могут прекращать работоспособность</Bold> каждое обновление. Это нормально, и
<Bold>это не</Bold> вина Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term2">
Модификации
<Bold>могут</Bold> вызывать ошибки и проблемы с производительностью. Это
<Bold>не</Bold> вина Beat Games.
</Span>
<Span x:Key="Intro:Terms:Term3">
Модификации создаются
<Bold>бесплатно</Bold> людьми в их
<Bold>свободное время.</Bold> Пожалуйста, будьте терпиливыми и взаимопонимающими.
</Span>
<Span x:Key="Intro:ReviewsBeatGamesFault">
<Bold>НЕ</Bold> оставляйте отрицательные отзывы потому что модификация не работает. Это
<Bold>не</Bold> вина Beat Games.
<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">Установка {0}</sys:String>
<sys:String x:Key="Mods:InstalledMod">Установлено {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">Не удалось извлечь {0} после попыток ({1}), пропускается. Эта модификация может работать некорректно, используйте на свой страх и риск</sys:String>
<sys:String x:Key="Mods:SearchLabel">Поиск...</sys:String>
<!-- About Page -->
<sys:String x:Key="About:Title">Информация</sys:String>
<sys:String x:Key="About:PageTitle">Про Mod Assistant</sys:String>
<sys:String x:Key="About:List:Header">Я ассистент, и я создал Mod Assistant для помощи модификациям с некоторыми личными принципами:</sys:String>
<sys:String x:Key="About:List:Item1">Простота</sys:String>
<sys:String x:Key="About:List:Item2">Портативность </sys:String>
<sys:String x:Key="About:List:Item3">Приложение одним файлом</sys:String>
<sys:String x:Key="About:List:Item4">Ответственное использование</sys:String>
<Span x:Key="About:SupportAssistant">
Если вам нравится программа и вы хотите меня поддержать, пожалуйста, посетите
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bs.assistant.moe/Donate/">
страницу для пожертвований
</Hyperlink>
или мой
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://www.patreon.com/AssistantMoe">
Patreon
</Hyperlink>
</Span>
<sys:String x:Key="About:SpecialThanks">Отдельное спасибо ♥</sys:String>
<sys:String x:Key="About:Donate">Поддержать</sys:String>
<sys:String x:Key="About:HeadpatsButton">Погладить</sys:String>
<sys:String x:Key="About:HugsButton">Обнять</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:Playlists">Playlists</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="Options:CloseWindow">Close window when finished</sys:String> <!-- NEEDS TRANSLATING -->
<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">Установить плейлист</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">Открыть AppData</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">Ссылка на лог успешно скопирована!</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">
Если из этого ничего вам не помогает, попросите помощи в
<Span Foreground="Blue">#support</Span> канал в
<Hyperlink NavigateUri="https://discord.gg/beatsabermods" local:HyperlinkExtensions.IsExternal="True">
BSMG
</Hyperlink>.
</Span>
<sys:String x:Key="Invalid:BoughtGame1">Если вы использовали нелицензионную версию игру, но купили игру</sys:String>
<sys:String x:Key="Invalid:SelectFolderButton">выберете папку</sys:String>
<sys:String x:Key="Invalid:BoughtGame2">Вам будет необходимо перезапустить Mod Assistant после того, как вы выберете папку с лицензионной копией игры</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">Установочный путь к Beat Saber не найден.</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>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitSkip">Max tries reached: Skipping {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:RatelimitHit">Ratelimit hit. Resuming in {0}</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:Failed">Download failed: {0}</sys:String> <!-- NEEDS TRANSLATING -->
<!-- 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">Mod Assistant</sys:String>
<sys:String x:Key="Utils:NoInstallFolder">Не удаётся обнаружить папку с Beat Saber. Пожалуйста, укажите путь вручную.</sys:String>
<sys:String x:Key="Utils:RunAsAdmin">Mod Assistant требует запустить эту задачу с правами администратора. Пожалуйста, попробуйте заново.</sys:String>
<sys:String x:Key="Utils:InstallDir:DialogTitle">Укажите папку с установленным Beat Saber</sys:String>
<sys:String x:Key="Utils:CannotOpenFolder">Не удаётся открыть папку: {0}</sys:String>
</ResourceDictionary>

View file

@ -55,6 +55,10 @@
</Span>
<Span x:Key="Intro:ReviewsRustySpoon">
如果我继续看到因为Mod不可用而留下的差评<Bold>我会亲自干掉Mod。</Bold>
<LineBreak/><LineBreak/>
我们发现<Bold><Span Foreground="Red"> 围城 </Span>的网站<Span Foreground="Red">未经作者同意擅自打包贩卖</Span></Bold>歌曲、模型,并抹黑社区中的成员。
<LineBreak/>
<Bold>请各位玩家引以为鉴,不要攻击其他玩家或支持这种行为,谢谢配合。</Bold>
</Span>
<Span x:Key="Intro:WikiGuide">
<Bold><Span Foreground="Red">请务必阅读</Span>
@ -63,7 +67,7 @@
</Hyperlink>
</Bold>,以及
<Hyperlink local:HyperlinkExtensions.IsExternal="True" NavigateUri="https://bsmg.wiki/pc-modding.html">
新手指南(英文)
新手指南(英文)
</Hyperlink>。
</Span>
<sys:String x:Key="Intro:AgreeButton">同意</sys:String>
@ -94,6 +98,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>
@ -131,9 +136,16 @@
<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:Playlists">Playlists</sys:String>
<sys:String x:Key="Options:CloseWindow">安装完成时关闭窗口</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>
@ -197,11 +209,15 @@
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">可能您的互联网连接或BeatSaver存在问题。</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">下载歌曲压缩包失败。</sys:String>
<sys:String x:Key="OneClick:InstallDirNotFound">找不到Beat Saber安装路径。</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">已安装{0}</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>
<sys:String x:Key="OneClick:Installing">正在下载:{0}</sys:String>
<sys:String x:Key="OneClick:RatelimitSkip">超过重试次数,跳过:{0}</sys:String>
<sys:String x:Key="OneClick:RatelimitHit">下载超时,重试:{0}</sys:String>
<sys:String x:Key="OneClick:Failed">下载失败:{0}</sys:String>
<!-- Themes Class -->
<sys:String x:Key="Themes:ThemeNotFound">找不到主题,恢复为默认主题...</sys:String>
<sys:String x:Key="Themes:ThemeSet">主题设置为{0}.</sys:String>

View file

@ -58,16 +58,17 @@
Margin="0,0,10,5"
Click="IntroButton_Click"
Style="{DynamicResource MainPageButton}">
<StackPanel Margin="0,8,0,0">
<StackPanel Margin="0,6,0,0">
<Image
Height="30"
VerticalAlignment="Bottom"
Source="{StaticResource info_circleDrawingImage}" />
<TextBlock
Margin="0,0,0,5"
<Viewbox Stretch="Uniform" Height="16">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Padding="2,0,2,0"
Text="{DynamicResource MainWindow:IntroButton}" />
</Viewbox>
</StackPanel>
</Button>
@ -84,11 +85,12 @@
Height="30"
VerticalAlignment="Bottom"
Source="{StaticResource microchipDrawingImage}" />
<TextBlock
Margin="0,0,0,5"
<Viewbox Stretch="Uniform" Height="16">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Padding="2,0,2,0"
Text="{DynamicResource MainWindow:ModsButton}" />
</Viewbox>
</StackPanel>
</Button>
@ -104,11 +106,12 @@
Height="30"
VerticalAlignment="Bottom"
Source="{StaticResource heartDrawingImage}" />
<TextBlock
Margin="0,0,0,5"
<Viewbox Stretch="Uniform" Height="16">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Padding="2,0,2,0"
Text="{DynamicResource MainWindow:AboutButton}" />
</Viewbox>
</StackPanel>
</Button>
@ -124,11 +127,12 @@
Height="30"
VerticalAlignment="Bottom"
Source="{StaticResource cogDrawingImage}" />
<TextBlock
Margin="0,0,0,5"
<Viewbox Stretch="Uniform" Height="16">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Padding="2,0,2,0"
Text="{DynamicResource MainWindow:OptionsButton}" />
</Viewbox>
</StackPanel>
</Button>
@ -166,8 +170,8 @@
<Grid Grid.Row="1" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="115" />
<ColumnDefinition Width="115" />
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Border
@ -184,9 +188,10 @@
<Button
Name="InfoButton"
Grid.Column="1"
Width="100"
Height="40"
Margin="0,10,0,0"
MinWidth="115"
Margin="10,10,0,0"
Padding="20,0,20,0"
HorizontalAlignment="Right"
Click="InfoButton_Click"
IsEnabled="False">
@ -197,32 +202,27 @@
Text="{DynamicResource MainWindow:ModInfoButton}" />
</StackPanel>
</Button>
<StackPanel
Grid.Column="2" Orientation="Horizontal"
<Button
Name="InstallButton"
Grid.Column="2"
Height="40"
Width="100"
Margin="0,10,0,0"
HorizontalAlignment="Right">
<Button
Name="InstallButton"
Width="100"
Height="40"
HorizontalAlignment="Right"
Click="InstallButton_Click"
IsEnabled="False">
<StackPanel>
<TextBlock
MinWidth="115"
Margin="10,10,0,0"
Padding="20,0,20,0"
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>
</StackPanel>
</Button>
</Grid>
</Grid>
</Grid>

View file

@ -95,6 +95,21 @@ namespace ModAssistant
}
}
/* Force the app to shutdown when The main window is closed.
*
* Explaination:
* OneClickStatus is initialized as a static object,
* so the window will exist, even if it is unused.
* This would cause Mod Assistant to not shutdown,
* because technically a window was still open.
*/
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.Shutdown();
}
private async void LoadVersionsAsync()
{
try

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" />
@ -67,19 +68,28 @@
</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\Languages.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\SemVersion.cs" />
<Compile Include="Libs\semver\IntExtensions.cs" />
<Compile Include="OneClickStatus.xaml.cs">
<DependentUpon>OneClickStatus.xaml</DependentUpon>
</Compile>
<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>
@ -101,6 +111,18 @@
<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>
@ -109,10 +131,18 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\ru.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Localisation\zh.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="OneClickStatus.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Pages\Intro.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>

View file

@ -0,0 +1,98 @@
<Window x:Class="ModAssistant.OneClickStatus"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ModAssistant"
mc:Ignorable="d"
Title="OneClick Installer" Height="800" Width="600" WindowStyle="ToolWindow" ResizeMode="NoResize">
<Window.Resources>
<local:DivideDoubleByTwoConverter x:Key="DivideDoubleByTwoConverter" />
<Style x:Key="Spin" TargetType="{x:Type Image}">
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="0" CenterX="{Binding Path=ActualWidth, Converter={StaticResource DivideDoubleByTwoConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Image}}" CenterY="{Binding Path=ActualHeight, Converter={StaticResource DivideDoubleByTwoConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Image}}" />
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard x:Name="RotateStarCompass">
<DoubleAnimation
AutoReverse="False"
RepeatBehavior="Forever"
Storyboard.TargetProperty="RenderTransform.Angle"
From="0"
To="360"
Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Rectangle Fill="{DynamicResource ModAssistantBackground}" Grid.RowSpan="2"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Image
Grid.Row="0"
Margin="60,0"
VerticalAlignment="Center"
Source="{DynamicResource loadingInnerDrawingImage}"
Stretch="Uniform" />
<Image
Grid.Row="0"
Margin="60,0"
VerticalAlignment="Center"
Source="{DynamicResource loadingMiddleDrawingImage}"
Stretch="Uniform" />
<Image
Grid.Row="0"
Margin="60,0"
VerticalAlignment="Center"
Source="{DynamicResource loadingOuterDrawingImage}"
Stretch="Uniform"
Style="{StaticResource Spin}" />
</Grid>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Border
Grid.Row="0"
Margin="10,0,10,10"
BorderBrush="{DynamicResource BottomStatusBarOutline}"
BorderThickness="1">
<ScrollViewer
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
Background="{DynamicResource BottomStatusBarBackground}"
Margin="0">
<TextBox
Name="HistoryTextBlock"
Margin="0"
Padding="5"
Background="{DynamicResource BottomStatusBarBackground}"
BorderThickness="0"
Foreground="{DynamicResource TextColor}" />
</ScrollViewer>
</Border>
</Grid>
</Grid>
</Window>

View file

@ -0,0 +1,64 @@
using System;
using System.Windows;
using System.Windows.Data;
namespace ModAssistant
{
/// <summary>
/// Interaction logic for OneClickStatus.xaml
/// </summary>
public partial class OneClickStatus : Window
{
public static OneClickStatus Instance;
public string HistoryText
{
get
{
return HistoryTextBlock.Text;
}
set
{
Dispatcher.Invoke(new Action(() => { OneClickStatus.Instance.HistoryTextBlock.Text = value; }));
}
}
public string MainText
{
get
{
return HistoryTextBlock.Text;
}
set
{
Dispatcher.Invoke(new Action(() => {
OneClickStatus.Instance.HistoryTextBlock.Text = string.IsNullOrEmpty(MainText) ? $"{value}" : $"{value}\n{MainText}";
}));
}
}
public OneClickStatus()
{
InitializeComponent();
Instance = this;
}
}
[ValueConversion(typeof(double), typeof(double))]
public class DivideDoubleByTwoConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType != typeof(double))
{
throw new InvalidOperationException("The target must be a double");
}
double d = (double)value;
return ((double)d) / 2;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
}

View file

@ -251,17 +251,19 @@
Orientation="Horizontal">
<Button
x:Name="PatButton"
Width="80"
Height="30"
MinWidth="80"
Margin="0,0,5,0"
Padding="20,0,20,0"
x:FieldModifier="public"
Click="HeadpatsButton_Click"
Content="{DynamicResource About:HeadpatsButton}" />
<Button
x:Name="HugButton"
Width="80"
Height="30"
MinWidth="80"
Margin="5,0,0,0"
Padding="20,0,20,0"
x:FieldModifier="public"
Click="HugsButton_Click"
Content="{DynamicResource About:HugsButton}" />

View file

@ -110,9 +110,9 @@
Orientation="Horizontal">
<Button
Name="Agree"
Width="100"
Height="35"
Margin="0,0,10,0"
Padding="20,0,20,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="Agree_Click">
@ -124,9 +124,9 @@
</Button>
<Button
Name="Disagree"
Width="100"
Height="35"
Margin="10,0,0,0"
Padding="20,0,20,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="Disagree_Click">

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
{
@ -717,5 +719,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

@ -29,6 +29,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" />
@ -45,6 +48,23 @@
FontWeight="Bold"
Text="{DynamicResource Options:PageTitle}" />
<TextBlock
Grid.Row="0"
Grid.Column="2"
Margin="5"
HorizontalAlignment="Right"
FontSize="22"
FontWeight="Bold"
Text="A 文" />
<ComboBox
Name="LanguageSelectComboBox"
Grid.Row="0"
Grid.Column="3"
Height="30"
HorizontalAlignment="Stretch"
VerticalContentAlignment="Center"
SelectionChanged="LanguageSelectComboBox_SelectionChanged" />
<TextBlock
Grid.Row="1"
Margin="5"
@ -72,17 +92,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}" />
@ -154,49 +174,55 @@
IsChecked="{Binding ReinstallInstalledMods, Mode=TwoWay}"
Unchecked="ReinstallInstalled_Unchecked" />
<TextBlock
Grid.Row="7"
<Menu
Grid.Row="8"
Grid.Column="0"
Margin="5"
HorizontalAlignment="Left"
FontSize="16"
FontWeight="Bold">
<TextBlock Text="{DynamicResource Options:EnableOneClickInstalls}" />
: ↳
</TextBlock>
<TextBlock
Grid.Row="8"
Margin="50,5,5,5"
HorizontalAlignment="Left"
FontSize="16"
FontWeight="Bold"
Text="{DynamicResource Options:BeatSaver}" />
<CheckBox
Name="BeatSaverProtocolHandler"
Grid.Row="8"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Checked="BeatSaverProtocolHandler_Checked"
IsChecked="{Binding BeatSaverProtocolHandlerEnabled}"
Unchecked="BeatSaverProtocolHandler_Unchecked" />
<TextBlock
Grid.Row="9"
Margin="50,5,5,5"
HorizontalAlignment="Left"
FontSize="16"
FontWeight="Bold"
Text="{DynamicResource Options:ModelSaber}" />
<CheckBox
Name="ModelSaberProtocolHandler"
Grid.Row="9"
Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Checked="ModelSaberProtocolHandler_Checked"
IsChecked="{Binding ModelSaberProtocolHandlerEnabled}"
Unchecked="ModelSaberProtocolHandler_Unchecked" />
Background="Transparent"
BorderBrush="Transparent">
<MenuItem
Header="{DynamicResource Options:EnableOneClickInstalls}"
StaysOpenOnClick="True"
Padding="5,0">
<MenuItem
Padding="5,0"
Header="{DynamicResource Options:BeatSaver}"
Name="BeatSaverProtocolHandler"
IsCheckable="True"
StaysOpenOnClick="True"
Checked="BeatSaverProtocolHandler_Checked"
IsChecked="{Binding BeatSaverProtocolHandlerEnabled}"
Unchecked="BeatSaverProtocolHandler_Unchecked"/>
<MenuItem
Padding="5,0"
Header="{DynamicResource Options:ModelSaber}"
Name="ModelSaberProtocolHandler"
IsCheckable="True"
StaysOpenOnClick="True"
Checked="ModelSaberProtocolHandler_Checked"
IsChecked="{Binding ModelSaberProtocolHandlerEnabled}"
Unchecked="ModelSaberProtocolHandler_Unchecked"/>
<MenuItem
Padding="5,0"
Header="{DynamicResource Options:Playlists}"
Name="PlaylistProtocolHandler"
IsCheckable="True"
StaysOpenOnClick="True"
Checked="PlaylistsProtocolHandler_Checked"
IsChecked="{Binding PlaylistsProtocolHandlerEnabled}"
Unchecked="PlaylistsProtocolHandler_Unchecked" />
<!-- <MenuItem
Padding="5,0"
Header="{DynamicResource Options:CloseWindow}"
Name="CloseWindowToggle"
IsCheckable="True"
StaysOpenOnClick="True"
Checked="CloseWindowOnFinish_Checked"
IsChecked="{Binding CloseWindowOnFinish}"
Unchecked="CloseWindowOnFinish_Unchecked" />
-->
</MenuItem>
</Menu>
<StackPanel
Grid.Row="12"
@ -244,18 +270,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}" />
@ -265,36 +291,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

@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;
@ -24,6 +27,8 @@ namespace ModAssistant.Pages
public bool ReinstallInstalledMods { get; set; }
public bool ModelSaberProtocolHandlerEnabled { get; set; }
public bool BeatSaverProtocolHandlerEnabled { get; set; }
public bool PlaylistsProtocolHandlerEnabled { get; set; }
public bool CloseWindowOnFinish { get; set; }
public string LogURL { get; private set; }
public Options()
@ -35,6 +40,7 @@ namespace ModAssistant.Pages
CheckInstalledMods = App.CheckInstalledMods;
SelectInstalledMods = App.SelectInstalledMods;
ReinstallInstalledMods = App.ReinstallInstalledMods;
CloseWindowOnFinish = App.CloseWindowOnFinish;
if (!CheckInstalledMods)
{
SelectInstalled.IsEnabled = false;
@ -51,6 +57,7 @@ namespace ModAssistant.Pages
{
ModelSaberProtocolHandlerEnabled = OneClickInstaller.IsRegistered("modelsaber");
BeatSaverProtocolHandlerEnabled = OneClickInstaller.IsRegistered("beatsaver");
PlaylistsProtocolHandlerEnabled = OneClickInstaller.IsRegistered("bsplaylist");
}
private void SelectDirButton_Click(object sender, RoutedEventArgs e)
@ -114,6 +121,22 @@ namespace ModAssistant.Pages
}
}
private void CloseWindowOnFinish_Checked(object sender, RoutedEventArgs e)
{
Properties.Settings.Default.CloseWindowOnFinish = true;
App.CloseWindowOnFinish = true;
CloseWindowOnFinish = true;
Properties.Settings.Default.Save();
}
private void CloseWindowOnFinish_Unchecked(object sender, RoutedEventArgs e)
{
Properties.Settings.Default.CloseWindowOnFinish = false;
App.CloseWindowOnFinish = false;
CloseWindowOnFinish = false;
Properties.Settings.Default.Save();
}
public void ModelSaberProtocolHandler_Checked(object sender, RoutedEventArgs e)
{
OneClickInstaller.Register("modelsaber");
@ -133,6 +156,15 @@ namespace ModAssistant.Pages
{
OneClickInstaller.Unregister("beatsaver");
}
public void PlaylistsProtocolHandler_Checked(object sender, RoutedEventArgs e)
{
OneClickInstaller.Register("bsplaylist");
}
public void PlaylistsProtocolHandler_Unchecked(object sender, RoutedEventArgs e)
{
OneClickInstaller.Unregister("bsplaylist");
}
private void SelectInstalled_Checked(object sender, RoutedEventArgs e)
{
@ -192,24 +224,33 @@ namespace ModAssistant.Pages
{
const string DateFormat = "yyyy-mm-dd HH:mm:ss";
DateTime now = DateTime.Now;
string logPath = Path.GetDirectoryName(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath);
string Log = Path.Combine(logPath, "log.log");
string GameLog = File.ReadAllText(Path.Combine(InstallDirectory, "Logs", "_latest.log"));
string Separator = File.Exists(Log) ? $"\n\n=============================================\n============= Mod Assistant Log =============\n=============================================\n\n" : string.Empty;
string ModAssistantLog = File.Exists(Log) ? File.ReadAllText(Log) : string.Empty;
var nvc = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("title", $"_latest.log ({now.ToString(DateFormat)})"),
new KeyValuePair<string, string>("expireUnit", "hour"),
new KeyValuePair<string, string>("expireLength", "5"),
new KeyValuePair<string, string>("code", File.ReadAllText(Path.Combine(InstallDirectory, "Logs", "_latest.log"))),
new KeyValuePair<string, string>("code", $"{GameLog}{Separator}{ModAssistantLog}"),
};
var req = new HttpRequestMessage(HttpMethod.Post, Utils.Constants.TeknikAPIUrl + "Paste")
string[] items = new string[nvc.Count];
for (int i = 0; i < nvc.Count; i++)
{
Content = new FormUrlEncodedContent(nvc),
};
KeyValuePair<string, string> item = nvc[i];
items[i] = WebUtility.UrlEncode(item.Key) + "=" + WebUtility.UrlEncode(item.Value);
}
var resp = await Http.HttpClient.SendAsync(req);
var body = await resp.Content.ReadAsStringAsync();
StringContent content = new StringContent(String.Join("&", items), null, "application/x-www-form-urlencoded");
HttpResponseMessage resp = await Http.HttpClient.PostAsync(Utils.Constants.TeknikAPIUrl + "Paste", content);
string body = await resp.Content.ReadAsStringAsync();
var TeknikResponse = Http.JsonSerializer.Deserialize<Utils.TeknikPasteResponse>(body);
Utils.TeknikPasteResponse TeknikResponse = Http.JsonSerializer.Deserialize<Utils.TeknikPasteResponse>(body);
LogURL = TeknikResponse.result.url;
}
@ -291,6 +332,36 @@ namespace ModAssistant.Pages
}
}
public void LanguageSelectComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if ((sender as ComboBox).SelectedItem == null)
{
// Apply default language
Console.WriteLine("Applying default language");
Languages.LoadLanguage("en");
}
else
{
// Get the matching language from the LoadedLanguages array, then try and use it
var languageName = (sender as ComboBox).SelectedItem.ToString();
var selectedLanguage = Languages.LoadedLanguages.Find(language => language.NativeName.CompareTo(languageName) == 0);
if (Languages.LoadLanguage(selectedLanguage.Name))
{
Properties.Settings.Default.LanguageCode = selectedLanguage.Name;
Properties.Settings.Default.Save();
if (Languages.FirstRun)
{
Languages.FirstRun = false;
}
else
{
Process.Start(Utils.ExePath, App.Arguments);
Application.Current.Dispatcher.Invoke(() => { Application.Current.Shutdown(); });
}
}
}
}
private void ApplicationThemeExportTemplate_Click(object sender, RoutedEventArgs e)
{
Themes.WriteThemeToDisk("Ugly Kulu-Ya-Ku");
@ -308,5 +379,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).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.6.0")]
[assembly: AssemblyFileVersion("1.1.6.0")]
[assembly: AssemblyVersion("1.1.12.0")]
[assembly: AssemblyFileVersion("1.1.12.0")]

View file

@ -178,5 +178,29 @@ namespace ModAssistant.Properties {
this["ReinstallInstalled"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool CloseWindowOnFinish {
get {
return ((bool)(this["CloseWindowOnFinish"]));
}
set {
this["CloseWindowOnFinish"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string LanguageCode {
get {
return ((string)(this["LanguageCode"]));
}
set {
this["LanguageCode"] = value;
}
}
}
}

View file

@ -41,5 +41,11 @@
<Setting Name="ReinstallInstalled" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="CloseWindowOnFinish" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="LanguageCode" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>