7babb08ac4
Simplify applying font for English
307 lines
9.5 KiB
C#
307 lines
9.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms.Layout;
|
|
using System.Xml;
|
|
using Mesen.GUI.Config;
|
|
using Mesen.GUI.Controls;
|
|
|
|
namespace Mesen.GUI.Forms
|
|
{
|
|
public enum Language
|
|
{
|
|
SystemDefault = 0,
|
|
English = 1,
|
|
French = 2,
|
|
Japanese = 3,
|
|
Russian = 4,
|
|
Spanish = 5,
|
|
Ukrainian = 6,
|
|
Portuguese = 7,
|
|
Catalan = 8,
|
|
Chinese = 9,
|
|
Italian = 10,
|
|
Polish = 11,
|
|
}
|
|
|
|
class ResourceHelper
|
|
{
|
|
private static Language _language;
|
|
private static XmlDocument _resources = new XmlDocument();
|
|
private static XmlDocument _enResources = new XmlDocument();
|
|
|
|
public static Language GetCurrentLanguage()
|
|
{
|
|
if (_language == Language.SystemDefault)
|
|
{
|
|
_language = DetectLanguage();
|
|
}
|
|
return _language;
|
|
}
|
|
|
|
public static string GetLanguageCode()
|
|
{
|
|
switch(ResourceHelper.GetCurrentLanguage()) {
|
|
case Language.English: return "en";
|
|
case Language.French: return "fr";
|
|
case Language.Japanese: return "ja";
|
|
case Language.Russian: return "ru";
|
|
case Language.Spanish: return "es";
|
|
case Language.Ukrainian: return "uk";
|
|
case Language.Portuguese: return "pt";
|
|
case Language.Catalan: return "ca";
|
|
case Language.Chinese: return "zh";
|
|
case Language.Italian: return "it";
|
|
case Language.Polish: return "pl";
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
public static void UpdateEmuLanguage()
|
|
{
|
|
InteropEmu.SetDisplayLanguage(_language);
|
|
}
|
|
|
|
public static void LoadResources(Language language)
|
|
{
|
|
if(language == Language.SystemDefault) {
|
|
language = DetectLanguage();
|
|
}
|
|
|
|
string filename;
|
|
string enFilename = "resources.en.xml";
|
|
switch(language) {
|
|
default:
|
|
case Language.English: filename = enFilename; break;
|
|
case Language.French: filename = "resources.fr.xml"; break;
|
|
case Language.Japanese: filename = "resources.ja.xml"; break;
|
|
case Language.Russian: filename = "resources.ru.xml"; break;
|
|
case Language.Spanish: filename = "resources.es.xml"; break;
|
|
case Language.Ukrainian: filename = "resources.uk.xml"; break;
|
|
case Language.Portuguese: filename = "resources.pt.xml"; break;
|
|
case Language.Catalan: filename = "resources.ca.xml"; break;
|
|
case Language.Chinese: filename = "resources.zh.xml"; break;
|
|
case Language.Italian: filename = "resources.it.xml"; break;
|
|
case Language.Polish: filename = "resources.pl.xml"; break;
|
|
}
|
|
|
|
_language = language;
|
|
|
|
using(Stream stream = ResourceManager.GetZippedResource(filename)) {
|
|
_resources.Load(stream);
|
|
}
|
|
|
|
using(Stream stream = ResourceManager.GetZippedResource(enFilename)) {
|
|
_enResources.Load(stream);
|
|
}
|
|
}
|
|
|
|
private static Language DetectLanguage()
|
|
{
|
|
Language language = Language.SystemDefault;
|
|
switch (System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)
|
|
{
|
|
default:
|
|
case "en": language = Language.English; break;
|
|
case "fr": language = Language.French; break;
|
|
case "ja": language = Language.Japanese; break;
|
|
case "ru": language = Language.Russian; break;
|
|
case "es": language = Language.Spanish; break;
|
|
case "uk": language = Language.Ukrainian; break;
|
|
case "pt": language = Language.Portuguese; break;
|
|
case "zh": language = Language.Chinese; break;
|
|
case "it": language = Language.Italian; break;
|
|
case "pl": language = Language.Polish; break;
|
|
}
|
|
return language;
|
|
}
|
|
|
|
public static string GetMessage(string id, params object[] args)
|
|
{
|
|
var baseNode = _resources.SelectSingleNode("/Resources/Messages/Message[@ID='" + id + "']");
|
|
if(baseNode == null) {
|
|
baseNode = _enResources.SelectSingleNode("/Resources/Messages/Message[@ID='" + id + "']");
|
|
}
|
|
|
|
if(baseNode != null) {
|
|
return string.Format(baseNode.InnerText, args);
|
|
} else {
|
|
return "[[" + id + "]]";
|
|
}
|
|
}
|
|
|
|
public static string GetEnumText(Enum e)
|
|
{
|
|
var baseNode = _resources.SelectSingleNode("/Resources/Enums/Enum[@ID='" + e.GetType().Name + "']/Value[@ID='" + e.ToString() + "']");
|
|
if(baseNode == null) {
|
|
baseNode = _enResources.SelectSingleNode("/Resources/Enums/Enum[@ID='" + e.GetType().Name + "']/Value[@ID='" + e.ToString() + "']");
|
|
}
|
|
|
|
if(baseNode != null) {
|
|
return baseNode.InnerText;
|
|
} else {
|
|
return e.ToString();
|
|
}
|
|
}
|
|
|
|
public static void ApplyResources(Form form)
|
|
{
|
|
if (GetCurrentLanguage() == Language.English){
|
|
form.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25f);
|
|
}
|
|
ApplyResources(form, form.Name);
|
|
}
|
|
|
|
public static void ApplyResources(Form form, string formName)
|
|
{
|
|
XmlNode baseNode = _resources.SelectSingleNode("/Resources/Forms/Form[@ID='" + formName + "']");
|
|
|
|
if(baseNode != null) {
|
|
if(baseNode.Attributes["Title"] != null) {
|
|
form.Text = baseNode.Attributes["Title"].Value;
|
|
}
|
|
ApplyResources(baseNode, form.Controls);
|
|
}
|
|
}
|
|
|
|
public static void ApplyResources(Form form, ContextMenuStrip contextMenu)
|
|
{
|
|
XmlNode baseNode = _resources.SelectSingleNode("/Resources/Forms/Form[@ID='" + form.Name + "']");
|
|
|
|
if(baseNode != null) {
|
|
ApplyResources(baseNode, contextMenu.Items);
|
|
}
|
|
}
|
|
|
|
private static void ApplyResources(XmlNode baseNode, UserControl control)
|
|
{
|
|
XmlNode controlNode = _resources.SelectSingleNode("/Resources/UserControls/UserControl[@ID='" + control.GetType().Name + "']");
|
|
|
|
if(controlNode != null) {
|
|
ApplyResources(controlNode, control.Controls);
|
|
} else {
|
|
ApplyResources(baseNode, control.Controls);
|
|
}
|
|
}
|
|
|
|
private static void ApplyResources(XmlNode baseNode, IEnumerable container)
|
|
{
|
|
foreach(object ctrl in container) {
|
|
string name = null;
|
|
if(ctrl is Control) {
|
|
name = ((Control)ctrl).Name;
|
|
} else if(ctrl is ToolStripItem) {
|
|
name = ((ToolStripItem)ctrl).Name;
|
|
} else if(ctrl is ColumnHeader) {
|
|
name = ((ColumnHeader)ctrl).Name;
|
|
} else if(ctrl is DataGridViewColumn) {
|
|
name = ((DataGridViewColumn)ctrl).Name;
|
|
}
|
|
|
|
var controlNode = baseNode.SelectSingleNode("Control[@ID='" + name + "']");
|
|
if(controlNode != null) {
|
|
if(ctrl is Control) {
|
|
((Control)ctrl).Text = controlNode.InnerText;
|
|
} else if(ctrl is ToolStripItem) {
|
|
((ToolStripItem)ctrl).Text = controlNode.InnerText;
|
|
if(((ToolStripItem)ctrl).DisplayStyle != ToolStripItemDisplayStyle.Image) {
|
|
((ToolStripItem)ctrl).ToolTipText = "";
|
|
}
|
|
} else if(ctrl is ColumnHeader) {
|
|
((ColumnHeader)ctrl).Text = controlNode.InnerText;
|
|
} else if(ctrl is DataGridViewColumn) {
|
|
((DataGridViewColumn)ctrl).HeaderText = controlNode.InnerText;
|
|
}
|
|
}
|
|
|
|
if(ctrl is DataGridView) {
|
|
ApplyResources(baseNode, ((DataGridView)ctrl).Columns);
|
|
} else if(ctrl is MenuStrip) {
|
|
ApplyResources(baseNode, ((MenuStrip)ctrl).Items);
|
|
} else if(ctrl is ContextMenuStrip) {
|
|
ApplyResources(baseNode, ((ContextMenuStrip)ctrl).Items);
|
|
} else if(ctrl is ListView) {
|
|
ApplyResources(baseNode, ((ListView)ctrl).Columns);
|
|
} else if(ctrl is ToolStrip) {
|
|
ApplyResources(baseNode, ((ToolStrip)ctrl).Items);
|
|
} else if(ctrl is ToolStripSplitButton) {
|
|
ApplyResources(baseNode, ((ToolStripSplitButton)ctrl).DropDownItems);
|
|
} else if(ctrl is UserControl) {
|
|
ApplyResources(baseNode, ctrl as UserControl);
|
|
} else if(ctrl is Control) {
|
|
ApplyResources(baseNode, ((Control)ctrl).Controls);
|
|
} else if(ctrl is ToolStripMenuItem) {
|
|
ApplyResources(baseNode, ((ToolStripMenuItem)ctrl).DropDownItems);
|
|
}
|
|
|
|
if(ctrl is Control) {
|
|
if(((Control)ctrl).ContextMenuStrip != null) {
|
|
ApplyResources(baseNode, ((Control)ctrl).ContextMenuStrip.Items);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static XmlDocument BuildResourceFile(Form form)
|
|
{
|
|
XmlDocument document = new XmlDocument();
|
|
XmlNode resources = document.CreateElement("Resources");
|
|
document.AppendChild(resources);
|
|
resources.AppendChild(document.CreateElement("Forms"));
|
|
|
|
BuildResourceFile(document, form, form.Controls);
|
|
|
|
return document;
|
|
}
|
|
|
|
private static void BuildResourceFile(XmlDocument xmlDoc, Form form, IEnumerable container)
|
|
{
|
|
var baseNode = xmlDoc.SelectSingleNode("/Resources/Forms/Form[@ID='" + form.Name + "']");
|
|
if(baseNode == null) {
|
|
baseNode = xmlDoc.CreateElement("Form");
|
|
baseNode.Attributes.Append(xmlDoc.CreateAttribute("ID"));
|
|
baseNode.Attributes.Append(xmlDoc.CreateAttribute("Title"));
|
|
baseNode.Attributes["ID"].Value = form.Name;
|
|
baseNode.Attributes["Title"].Value = form.Text;
|
|
xmlDoc.SelectSingleNode("/Resources/Forms").AppendChild(baseNode);
|
|
}
|
|
|
|
foreach(Component ctrl in container) {
|
|
string text = null;
|
|
string name = null;
|
|
if(ctrl is Control) {
|
|
text = ((Control)ctrl).Text;
|
|
name = ((Control)ctrl).Name;
|
|
} else if(ctrl is ToolStripItem) {
|
|
text = ((ToolStripItem)ctrl).Text;
|
|
name = ((ToolStripItem)ctrl).Name;
|
|
}
|
|
|
|
if(!string.IsNullOrWhiteSpace(text)) {
|
|
var controlNode = baseNode.SelectSingleNode("Control[@ID='" + name + "']");
|
|
if(controlNode == null) {
|
|
controlNode = xmlDoc.CreateElement("Control");
|
|
controlNode.Attributes.Append(xmlDoc.CreateAttribute("ID"));
|
|
controlNode.Attributes["ID"].Value = name;
|
|
baseNode.AppendChild(controlNode);
|
|
}
|
|
controlNode.InnerText = text;
|
|
}
|
|
if(ctrl is MenuStrip) {
|
|
BuildResourceFile(xmlDoc, form, ((MenuStrip)ctrl).Items);
|
|
} else if(ctrl is Control) {
|
|
BuildResourceFile(xmlDoc, form, ((Control)ctrl).Controls);
|
|
} else if(ctrl is ToolStripMenuItem) {
|
|
BuildResourceFile(xmlDoc, form, ((ToolStripMenuItem)ctrl).DropDownItems);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|