mirror of
https://github.com/knah/VRCMelonAssistant.git
synced 2024-05-18 03:12:18 +12:00
Merge branch 'master' into patch-1
This commit is contained in:
commit
4fc3417360
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
114
ModAssistant/Classes/External Interfaces/Playlists.cs
Normal file
114
ModAssistant/Classes/External Interfaces/Playlists.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
76
ModAssistant/Classes/Languages.cs
Normal file
76
ModAssistant/Classes/Languages.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(); });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
244
ModAssistant/Localisation/de.xaml
Normal file
244
ModAssistant/Localisation/de.xaml
Normal 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 "{0}" 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
251
ModAssistant/Localisation/fr.xaml
Normal file
251
ModAssistant/Localisation/fr.xaml
Normal 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 "{0}" 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>
|
244
ModAssistant/Localisation/it.xaml
Normal file
244
ModAssistant/Localisation/it.xaml
Normal 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 "{0}" 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>
|
243
ModAssistant/Localisation/ko.xaml
Normal file
243
ModAssistant/Localisation/ko.xaml
Normal 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">템플릿 테마 "{0}"가 템플릿 폴더에 저장되었습니다.</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>
|
|
@ -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>
|
||||
|
|
244
ModAssistant/Localisation/ru.xaml
Normal file
244
ModAssistant/Localisation/ru.xaml
Normal 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">Шаблон темы "{0}" сохранён в папку с темами.</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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
98
ModAssistant/OneClickStatus.xaml
Normal file
98
ModAssistant/OneClickStatus.xaml
Normal 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>
|
64
ModAssistant/OneClickStatus.xaml.cs
Normal file
64
ModAssistant/OneClickStatus.xaml.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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}" />
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}" />
|
||||
|
|
|
@ -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(); });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")]
|
||||
|
|
24
ModAssistant/Properties/Settings.Designer.cs
generated
24
ModAssistant/Properties/Settings.Designer.cs
generated
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue