feat: add language override

This commit is contained in:
Anna 2022-02-08 15:23:00 -05:00
parent 9b1e87209a
commit 4779ed0f48
8 changed files with 204 additions and 9 deletions

View File

@ -23,6 +23,7 @@ internal class Configuration : IPluginConfiguration {
public bool SidebarTabView;
public CommandHelpSide CommandHelpSide = CommandHelpSide.None;
public KeybindMode KeybindMode = KeybindMode.Strict;
public LanguageOverride LanguageOverride = LanguageOverride.None;
public bool CanMove = true;
public bool CanResize = true;
public bool ShowTitleBar;
@ -49,6 +50,7 @@ internal class Configuration : IPluginConfiguration {
this.SidebarTabView = other.SidebarTabView;
this.CommandHelpSide = other.CommandHelpSide;
this.KeybindMode = other.KeybindMode;
this.LanguageOverride = other.LanguageOverride;
this.CanMove = other.CanMove;
this.CanResize = other.CanResize;
this.ShowTitleBar = other.ShowTitleBar;
@ -207,3 +209,56 @@ internal static class KeybindModeExt {
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};
internal static string? Tooltip(this KeybindMode mode) => mode switch {
KeybindMode.Flexible => Language.KeybindMode_Flexible_Tooltip,
KeybindMode.Strict => Language.KeybindMode_Strict_Tooltip,
_ => null,
};
}
[Serializable]
internal enum LanguageOverride {
None,
English,
French,
German,
Italian,
Japanese,
Korean,
Norwegian,
PortugueseBrazil,
Russian,
Spanish,
}
internal static class LanguageOverrideExt {
internal static string Name(this LanguageOverride mode) => mode switch {
LanguageOverride.None => Language.LanguageOverride_None,
LanguageOverride.English => "English",
LanguageOverride.French => "Français",
LanguageOverride.German => "Deutsch",
LanguageOverride.Italian => "Italiano",
LanguageOverride.Japanese => "日本語",
LanguageOverride.Korean => "한국어 (Korean)",
LanguageOverride.Norwegian => "Norsk",
LanguageOverride.PortugueseBrazil => "Português do Brasil",
LanguageOverride.Russian => "Русский",
LanguageOverride.Spanish => "Español",
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};
internal static string Code(this LanguageOverride mode) => mode switch {
LanguageOverride.None => "",
LanguageOverride.English => "en",
LanguageOverride.French => "fr",
LanguageOverride.German => "de",
LanguageOverride.Italian => "it",
LanguageOverride.Japanese => "ja",
LanguageOverride.Korean => "ko",
LanguageOverride.Norwegian => "no",
LanguageOverride.PortugueseBrazil => "pt-br",
LanguageOverride.Russian => "ru",
LanguageOverride.Spanish => "es",
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};
}

View File

@ -68,10 +68,11 @@ public sealed class Plugin : IDalamudPlugin {
#pragma warning disable CS8618
public Plugin() {
LanguageChanged(this.Interface!.UiLanguage);
this.Config = this.Interface.GetPluginConfig() as Configuration ?? new Configuration();
this.Config = this.Interface!.GetPluginConfig() as Configuration ?? new Configuration();
this.Config.Migrate();
this.LanguageChanged(this.Interface.UiLanguage);
this.Common = new XivCommonBase();
this.TextureCache = new TextureCache(this.DataManager!);
this.Functions = new GameFunctions.GameFunctions(this);
@ -79,12 +80,12 @@ public sealed class Plugin : IDalamudPlugin {
this.Ui = new PluginUi(this);
this.Framework!.Update += this.FrameworkUpdate;
this.Interface.LanguageChanged += LanguageChanged;
this.Interface.LanguageChanged += this.LanguageChanged;
}
#pragma warning restore CS8618
public void Dispose() {
this.Interface.LanguageChanged -= LanguageChanged;
this.Interface.LanguageChanged -= this.LanguageChanged;
this.Framework.Update -= this.FrameworkUpdate;
GameFunctions.GameFunctions.SetChatInteractable(true);
@ -99,8 +100,12 @@ public sealed class Plugin : IDalamudPlugin {
this.Interface.SavePluginConfig(this.Config);
}
private static void LanguageChanged(string langCode) {
Language.Culture = new CultureInfo(langCode);
internal void LanguageChanged(string langCode) {
var info = this.Config.LanguageOverride is LanguageOverride.None
? new CultureInfo(langCode)
: new CultureInfo(this.Config.LanguageOverride.Code());
Language.Culture = info;
}
private static readonly string[] ChatAddonNames = {

View File

@ -249,6 +249,51 @@ namespace ChatTwo.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Flexible.
/// </summary>
internal static string KeybindMode_Flexible_Name {
get {
return ResourceManager.GetString("KeybindMode_Flexible_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Process keybinds with modifiers even if other modifiers are pressed..
/// </summary>
internal static string KeybindMode_Flexible_Tooltip {
get {
return ResourceManager.GetString("KeybindMode_Flexible_Tooltip", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Strict.
/// </summary>
internal static string KeybindMode_Strict_Name {
get {
return ResourceManager.GetString("KeybindMode_Strict_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Only process keybinds with modifiers if no other modifiers are pressed..
/// </summary>
internal static string KeybindMode_Strict_Tooltip {
get {
return ResourceManager.GetString("KeybindMode_Strict_Tooltip", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Use Dalamud&apos;s default language.
/// </summary>
internal static string LanguageOverride_None {
get {
return ResourceManager.GetString("LanguageOverride_None", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Click the button to the left to see what&apos;s being worked on and what&apos;s next..
/// </summary>
@ -510,6 +555,51 @@ namespace ChatTwo.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to The way in which {0} should handle keybinds..
/// </summary>
internal static string Options_KeybindMode_Description {
get {
return ResourceManager.GetString("Options_KeybindMode_Description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Keybind mode.
/// </summary>
internal static string Options_KeybindMode_Name {
get {
return ResourceManager.GetString("Options_KeybindMode_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The language to display {0} in..
/// </summary>
internal static string Options_Language_Description {
get {
return ResourceManager.GetString("Options_Language_Description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Language.
/// </summary>
internal static string Options_Language_Name {
get {
return ResourceManager.GetString("Options_Language_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Miscellaneous.
/// </summary>
internal static string Options_Miscellaneous_Tab {
get {
return ResourceManager.GetString("Options_Miscellaneous_Tab", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reduce the spacing between messages..
/// </summary>

View File

@ -407,4 +407,34 @@
<data name="Options_HideWhenUiHidden_Description" xml:space="preserve">
<value>Hide {0} when the game UI is hidden.</value>
</data>
<data name="Options_KeybindMode_Name" xml:space="preserve">
<value>Keybind mode</value>
</data>
<data name="Options_KeybindMode_Description" xml:space="preserve">
<value>The way in which {0} should handle keybinds.</value>
</data>
<data name="Options_Miscellaneous_Tab" xml:space="preserve">
<value>Miscellaneous</value>
</data>
<data name="LanguageOverride_None" xml:space="preserve">
<value>Use Dalamud's default language</value>
</data>
<data name="KeybindMode_Flexible_Name" xml:space="preserve">
<value>Flexible</value>
</data>
<data name="KeybindMode_Strict_Name" xml:space="preserve">
<value>Strict</value>
</data>
<data name="KeybindMode_Flexible_Tooltip" xml:space="preserve">
<value>Process keybinds with modifiers even if other modifiers are pressed.</value>
</data>
<data name="KeybindMode_Strict_Tooltip" xml:space="preserve">
<value>Only process keybinds with modifiers if no other modifiers are pressed.</value>
</data>
<data name="Options_Language_Name" xml:space="preserve">
<value>Language</value>
</data>
<data name="Options_Language_Description" xml:space="preserve">
<value>The language to display {0} in.</value>
</data>
</root>

View File

@ -398,12 +398,12 @@
<value>Сторона помощи по команде</value>
</data>
<data name="Options_CommandHelpSide_Description" xml:space="preserve">
<value>Сторона {0} с которой отображается помощь по командам.</value>
<value>Сторона {0}, на которой отображается помощь по командам.</value>
</data>
<data name="Options_HideWhenUiHidden_Name" xml:space="preserve">
<value>Скрывать, когда игровой интерфейс скрыт</value>
</data>
<data name="Options_HideWhenUiHidden_Description" xml:space="preserve">
<value>Скрыть {0}, когда игровой интерфейс скрыт.</value>
<value>Скрыть {0}, когда скрыт игровой интерфейс.</value>
</data>
</root>

View File

@ -132,6 +132,7 @@ internal sealed class Settings : IUiComponent {
var fontSizeChanged = Math.Abs(this.Mutable.FontSize - this.Ui.Plugin.Config.FontSize) > 0.001
|| Math.Abs(this.Mutable.JapaneseFontSize - this.Ui.Plugin.Config.JapaneseFontSize) > 0.001
|| Math.Abs(this.Mutable.SymbolsFontSize - this.Ui.Plugin.Config.SymbolsFontSize) > 0.001;
var langChanged = this.Mutable.LanguageOverride != this.Ui.Plugin.Config.LanguageOverride;
config.UpdateFrom(this.Mutable);
@ -145,6 +146,10 @@ internal sealed class Settings : IUiComponent {
this.Ui.Plugin.Interface.UiBuilder.RebuildFonts();
}
if (langChanged) {
this.Ui.Plugin.LanguageChanged(this.Ui.Plugin.Interface.UiLanguage);
}
if (!this.Mutable.HideChat && hideChatChanged) {
GameFunctions.GameFunctions.SetChatInteractable(true);
}

View File

@ -14,6 +14,16 @@ internal sealed class Miscellaneous : ISettingsTab {
}
public void Draw() {
if (ImGui.BeginCombo(Language.Options_Language_Name, this.Mutable.LanguageOverride.Name())) {
foreach (var language in Enum.GetValues<LanguageOverride>()) {
if (ImGui.Selectable(language.Name())) {
this.Mutable.LanguageOverride = language;
}
}
ImGui.EndCombo();
}
ImGuiUtil.HelpText(string.Format(Language.Options_Language_Description, Plugin.PluginName));
ImGui.Spacing();