Merge pull request #175 from megalon/feature/language-select

Language select
This commit is contained in:
megalon 2020-06-01 19:52:01 -07:00 committed by GitHub
commit d1203ac255
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 132 additions and 31 deletions

View file

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

View file

@ -35,12 +35,6 @@ 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");
if (ModAssistant.Properties.Settings.Default.UpgradeRequired)
{
ModAssistant.Properties.Settings.Default.Upgrade();
@ -142,7 +136,7 @@ namespace ModAssistant
}
else
{
LoadLanguage(args[1]);
Languages.LoadLanguage(args[1]);
}
args = Shift(args, 2);
@ -213,29 +207,5 @@ namespace ModAssistant
e.Handled = true;
Application.Current.Shutdown();
}
private ResourceDictionary LanguagesDict
{
get
{
return Resources.MergedDictionaries[1];
}
}
private void LoadLanguage(string culture)
{
try
{
LanguagesDict.Source = new Uri($"Localisation/{culture}.xaml", UriKind.Relative);
}
catch (IOException)
{
if (culture.Contains("-"))
{
LoadLanguage(culture.Split('-').First());
}
// Can't load language file
}
}
}
}

View file

@ -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(); }
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 (savedLanguageCode.Length == 0)
{
// If no language code was saved, load system language
savedLanguageCode = CultureInfo.CurrentUICulture.Name.Split('-').First();
}
else if (!availableLanguageCodes.Any(code => code.Equals(savedLanguageCode)))
{
// If language code isn't supported, load English instead
savedLanguageCode = "en";
}
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(savedLanguageCode)); ;
}
LoadLanguage(savedLanguageCode);
}
private static ResourceDictionary LanguagesDict
{
get
{
return Application.Current.Resources.MergedDictionaries[1];
}
}
public static void LoadLanguage(string languageCode)
{
try
{
LanguagesDict.Source = new Uri($"Localisation/{languageCode}.xaml", UriKind.Relative);
Properties.Settings.Default.LanguageCode = languageCode;
Properties.Settings.Default.Save();
}
catch (IOException)
{
if (languageCode.Contains("-"))
{
LoadLanguage(languageCode.Split('-').First());
}
// Can't load language file
}
}
}
}

View file

@ -65,6 +65,8 @@ namespace ModAssistant
Themes.LoadThemes();
Themes.FirstLoad(Properties.Settings.Default.SelectedTheme);
Languages.LoadLanguages();
Task.Run(() => LoadVersionsAsync());
if (!Properties.Settings.Default.Agreed || string.IsNullOrEmpty(Properties.Settings.Default.LastTab))

View file

@ -72,6 +72,7 @@
<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" />

View file

@ -48,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"

View file

@ -331,6 +331,23 @@ 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);
Languages.LoadLanguage(selectedLanguage.Name);
}
}
private void ApplicationThemeExportTemplate_Click(object sender, RoutedEventArgs e)
{
Themes.WriteThemeToDisk("Ugly Kulu-Ya-Ku");

View file

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

View file

@ -44,5 +44,8 @@
<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>