ServerManagers/src/Plugin.Common/Utils/ResourceUtils.cs
2021-12-02 17:23:26 +10:00

136 lines
5.2 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
namespace ServerManagerTool.Plugin.Common
{
public static class ResourceUtils
{
public static string GetResourceString(ResourceDictionary resources, string inKey)
{
if (resources == null)
throw new ArgumentNullException(nameof(resources), "parameter cannot be null.");
if (string.IsNullOrWhiteSpace(inKey))
throw new ArgumentNullException(nameof(inKey), "parameter cannot be null.");
if (resources.Contains(inKey) && resources[inKey] is string)
{
var resourceString = resources[inKey].ToString();
resourceString = resourceString.Replace("\\r", "\r");
resourceString = resourceString.Replace("\\n", "\n");
return resourceString;
}
return null;
}
public static void RemoveExceptResourceDictionary(Window window, string dictionaryName)
{
if (window == null || string.IsNullOrWhiteSpace(dictionaryName))
return;
var dictionariesToRemove = window.Resources.MergedDictionaries.Where(d => !d.Source.OriginalString.Contains(dictionaryName)).ToList();
if (dictionariesToRemove != null)
{
foreach (var dictionaryToRemove in dictionariesToRemove)
{
window.Resources.MergedDictionaries.Remove(dictionaryToRemove);
}
}
}
public static void RemoveExceptResourceDictionary(UserControl control, string dictionaryName)
{
if (control == null || string.IsNullOrWhiteSpace(dictionaryName))
return;
var dictionariesToRemove = control.Resources.MergedDictionaries.Where(d => !d.Source.OriginalString.Contains(dictionaryName)).ToList();
if (dictionariesToRemove != null)
{
foreach (var dictionaryToRemove in dictionariesToRemove)
{
control.Resources.MergedDictionaries.Remove(dictionaryToRemove);
}
}
}
public static void RemoveResourceDictionary(Window window, string dictionaryName)
{
if (window == null || string.IsNullOrWhiteSpace(dictionaryName))
return;
var dictionaryToRemove = window.Resources.MergedDictionaries.FirstOrDefault(d => d.Source.OriginalString.Contains(dictionaryName));
if (dictionaryToRemove != null)
{
window.Resources.MergedDictionaries.Remove(dictionaryToRemove);
}
}
public static void RemoveResourceDictionary(UserControl control, string dictionaryName)
{
if (control == null || string.IsNullOrWhiteSpace(dictionaryName))
return;
var dictionaryToRemove = control.Resources.MergedDictionaries.FirstOrDefault(d => d.Source.OriginalString.Contains(dictionaryName));
if (dictionaryToRemove != null)
{
control.Resources.MergedDictionaries.Remove(dictionaryToRemove);
}
}
public static void UpdateResourceDictionary(Window window, string languageCode)
{
if (window == null)
return;
RemoveExceptResourceDictionary(window, PluginHelper.LANGUAGECODE_FALLBACK);
var assembly = Assembly.GetCallingAssembly();
var resourcePath = assembly.GetManifestResourceNames().FirstOrDefault(r => r.EndsWith($"{languageCode}.xaml"));
if (string.IsNullOrWhiteSpace(resourcePath))
return;
using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
{
using (StreamReader reader = new StreamReader(stream))
{
var resourceDictionary = XamlReader.Load(reader.BaseStream) as ResourceDictionary;
if (resourceDictionary != null)
{
window.Resources.MergedDictionaries.Add(resourceDictionary);
}
}
}
}
public static void UpdateResourceDictionary(UserControl control, string languageCode)
{
if (control == null)
return;
RemoveExceptResourceDictionary(control, PluginHelper.LANGUAGECODE_FALLBACK);
var assembly = Assembly.GetCallingAssembly();
var resourcePath = assembly.GetManifestResourceNames().FirstOrDefault(r => r.EndsWith($"{languageCode}.xaml"));
if (string.IsNullOrWhiteSpace(resourcePath))
return;
using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
{
using (StreamReader reader = new StreamReader(stream))
{
var resourceDictionary = XamlReader.Load(reader.BaseStream) as ResourceDictionary;
if (resourceDictionary != null)
{
control.Resources.MergedDictionaries.Add(resourceDictionary);
}
}
}
}
}
}