diff --git a/Orchestrion/Audio/BGMManager.cs b/Orchestrion/Audio/BGMManager.cs index 43f5932..12084e6 100644 --- a/Orchestrion/Audio/BGMManager.cs +++ b/Orchestrion/Audio/BGMManager.cs @@ -4,7 +4,7 @@ using Orchestrion.BGMSystem; using Orchestrion.Ipc; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.Audio; diff --git a/Orchestrion/Audio/PlaylistManager.cs b/Orchestrion/Audio/PlaylistManager.cs index d7ef7cc..39e73de 100644 --- a/Orchestrion/Audio/PlaylistManager.cs +++ b/Orchestrion/Audio/PlaylistManager.cs @@ -2,7 +2,7 @@ using Dalamud.Logging; using Dalamud.Plugin.Services; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.Audio; diff --git a/Orchestrion/Icons.cs b/Orchestrion/Icons.cs deleted file mode 100644 index 4b6c349..0000000 --- a/Orchestrion/Icons.cs +++ /dev/null @@ -1,16 +0,0 @@ -// namespace Orchestrion; -// -// public static class Icons -// { -// public const string Previous = "\uE045"; -// public const string Stop = "\uE047"; -// public const string Play = "\uE037"; -// public const string Next = "\uE044"; -// public const string Repeat = "\uE040"; -// public const string RepeatOne = "\uE041"; -// public const string Shuffle = "\uE043"; -// public const string Trash = "\uE872"; -// public const string More = "\uE5D4"; -// -// // public const string Next = "\uE044"; -// } \ No newline at end of file diff --git a/Orchestrion/Ipc/OrchestrionIpcManager.cs b/Orchestrion/Ipc/OrchestrionIpcManager.cs index c84063a..c861087 100644 --- a/Orchestrion/Ipc/OrchestrionIpcManager.cs +++ b/Orchestrion/Ipc/OrchestrionIpcManager.cs @@ -4,7 +4,7 @@ using Dalamud.Plugin.Ipc; using Orchestrion.Audio; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.Ipc; diff --git a/Orchestrion/OrchestrionPlugin.cs b/Orchestrion/OrchestrionPlugin.cs index 3b382ac..57f778c 100644 --- a/Orchestrion/OrchestrionPlugin.cs +++ b/Orchestrion/OrchestrionPlugin.cs @@ -10,8 +10,6 @@ using Dalamud.Interface.GameFonts; using Dalamud.Interface.Utility; using Dalamud.Interface.Windowing; -using Dalamud.IoC; -using Dalamud.Logging; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; @@ -81,7 +79,7 @@ public OrchestrionPlugin(DalamudPluginInterface pi) DalamudApi.PluginInterface.LanguageChanged += LanguageChanged; } - private void LanguageChanged(string code) + public static void LanguageChanged(string code) { var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"Orchestrion.Loc.{code}.json") @@ -112,6 +110,7 @@ private void OrchestrionUpdate(IFramework ignored) { PerformEcho(); CheckDtr(); + UpdateSettings(); } private void PerformEcho() @@ -131,6 +130,23 @@ private void CheckDtr() { _dtrEntry.Shown = Configuration.Instance.ShowSongInNative; } + + private void UpdateSettings() + { + var dalamudChatType = DalamudApi.PluginInterface.GeneralChatType; + if (Configuration.Instance.ChatChannelMatchDalamud && Configuration.Instance.ChatType != dalamudChatType) + { + Configuration.Instance.ChatType = dalamudChatType; + Configuration.Instance.Save(); + } + + var dalamudLang = DalamudApi.PluginInterface.UiLanguage; + if (Configuration.Instance.UserInterfaceLanguageMatchDalamud && Configuration.Instance.UserInterfaceLanguageCode != dalamudLang) + { + Configuration.Instance.UserInterfaceLanguageCode = dalamudLang; + Configuration.Instance.Save(); + } + } private void ClientStateOnLogout() { @@ -377,15 +393,9 @@ private void UpdateDtr(int songId, bool playedByOrch = false) { if (_dtrEntry == null) return; if (!SongList.Instance.TryGetSong(songId, out var song)) return; - var songName = Configuration.Instance.UseClientLangInServerInfo - ? song.Strings[Util.ClientLangCode()].Name - : song.Name; - var locations = Configuration.Instance.UseClientLangInServerInfo - ? song.Strings[Util.ClientLangCode()].Locations - : song.Locations; - var info = Configuration.Instance.UseClientLangInServerInfo - ? song.Strings[Util.ClientLangCode()].AdditionalInfo - : song.AdditionalInfo; + var songName = song.Strings[Configuration.Instance.ServerInfoLanguageCode].Name; + var locations = song.Strings[Configuration.Instance.ServerInfoLanguageCode].Locations; + var info = song.Strings[Configuration.Instance.ServerInfoLanguageCode].AdditionalInfo; if (string.IsNullOrEmpty(songName)) return; var suffix = ""; @@ -417,26 +427,14 @@ private void UpdateDtr(int songId, bool playedByOrch = false) private void UpdateChat(int songId, bool playedByOrch = false) { if (!Configuration.Instance.ShowSongInChat) return; - - var songName = GetClientSongName(songId); + if (!SongList.Instance.TryGetSong(songId, out var song)) return; + var songName = song.Strings[Configuration.Instance.ChatLanguageCode].Name; // the actual echoing is done during framework update if (!string.IsNullOrEmpty(songName)) _songEchoMsg = BuildChatMessageFormatted(Loc.Localize("NowPlayingEcho", "Now playing {0}."), songName, playedByOrch); } - private string GetClientSongName(int songId) - { - if (!SongList.Instance.TryGetSong(songId, out var song)) - return null; - - var songName = Configuration.Instance.UseClientLangInServerInfo - ? song.Strings[Util.ClientLangCode()].Name - : song.Name; - - return songName; - } - private unsafe bool IsLoadingScreen() { var titleCard = (AtkUnitBase*)DalamudApi.GameGui.GetAddonByName("_LocationTitle"); diff --git a/Orchestrion/Persistence/Configuration.cs b/Orchestrion/Persistence/Configuration.cs index 8962aba..9c225af 100644 --- a/Orchestrion/Persistence/Configuration.cs +++ b/Orchestrion/Persistence/Configuration.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; using System.Linq; using Dalamud.Configuration; +using Dalamud.Game.Text; using Newtonsoft.Json; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.Persistence; @@ -21,9 +22,17 @@ public class Configuration : IPluginConfiguration public bool ShowMiniPlayer { get; set; } = false; public bool MiniPlayerLock { get; set; } = false; public float MiniPlayerOpacity { get; set; } = 1.0f; + + public bool ChatChannelMatchDalamud { get; set; } = true; public bool ShowAltLangTitles { get; set; } = false; - public bool UseClientLangInServerInfo { get; set; } = true; - public bool UseClientLangInChat { get; set; } = true; + public bool UserInterfaceLanguageMatchDalamud { get; set; } = true; + public string UserInterfaceLanguageCode { get; set; } = DalamudApi.PluginInterface.UiLanguage; + public string AltTitleLanguageCode { get; set; } = "ja"; + public string ServerInfoLanguageCode { get; set; } = "en"; + public string ChatLanguageCode { get; set; } = "en"; + public XivChatType ChatType { get; set; } = DalamudApi.PluginInterface.GeneralChatType; + + public string LastSelectedPlaylist { get; set; } = "Favorites"; public Dictionary SongReplacements { get; private set; } = new(); @@ -32,10 +41,7 @@ public class Configuration : IPluginConfiguration public Dictionary Playlists { get; set; } = new(); - private Configuration() - { - - } + private Configuration() { } [JsonIgnore] private static Configuration _instance; diff --git a/Orchestrion/Persistence/SongList.cs b/Orchestrion/Persistence/SongList.cs index 9e717b9..2e650c4 100644 --- a/Orchestrion/Persistence/SongList.cs +++ b/Orchestrion/Persistence/SongList.cs @@ -2,9 +2,8 @@ using System.IO; using System.Linq; using System.Net.Http; -using Dalamud.Logging; using Lumina.Excel.GeneratedSheets; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.Persistence; @@ -31,6 +30,7 @@ private SongList() LoadLangSheet(GetRemoteSheet("ja"), "ja"); LoadLangSheet(GetRemoteSheet("de"), "de"); LoadLangSheet(GetRemoteSheet("fr"), "fr"); + LoadLangSheet(GetRemoteSheet("zh"), "zh"); } catch (Exception e) { @@ -40,9 +40,10 @@ private SongList() LoadLangSheet(GetLocalSheet("ja"), "ja"); LoadLangSheet(GetLocalSheet("de"), "de"); LoadLangSheet(GetLocalSheet("fr"), "fr"); + LoadLangSheet(GetLocalSheet("zh"), "zh"); } } - + private string GetRemoteSheet(string code) { return _client.GetStringAsync(string.Format(SheetPath, code)).Result; @@ -156,13 +157,14 @@ public bool TryGetSongByName(string name, out int songId) songId = 0; foreach (var song in _songs.Values) { - if (string.Equals(song.Strings["en"].Name, name, StringComparison.InvariantCultureIgnoreCase) - || string.Equals(song.Strings["en"].AlternateName, name, StringComparison.InvariantCultureIgnoreCase) - || string.Equals(song.Strings["ja"].Name, name, StringComparison.InvariantCultureIgnoreCase) - || string.Equals(song.Strings["ja"].AlternateName, name, StringComparison.InvariantCultureIgnoreCase)) + foreach (var lang in Util.AvailableTitleLanguages) { - songId = song.Id; - return true; + if (string.Equals(song.Strings[lang].Name, name, StringComparison.InvariantCultureIgnoreCase) + || string.Equals(song.Strings[lang].AlternateName, name, StringComparison.InvariantCultureIgnoreCase)) + { + songId = song.Id; + return true; + } } } diff --git a/Orchestrion/Struct/IndexableSongList.cs b/Orchestrion/Types/IndexableSongList.cs similarity index 95% rename from Orchestrion/Struct/IndexableSongList.cs rename to Orchestrion/Types/IndexableSongList.cs index a2e5524..c094dce 100644 --- a/Orchestrion/Struct/IndexableSongList.cs +++ b/Orchestrion/Types/IndexableSongList.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; -namespace Orchestrion.Struct; +namespace Orchestrion.Types; public class IndexableSongList { diff --git a/Orchestrion/Struct/RenderableSongEntry.cs b/Orchestrion/Types/RenderableSongEntry.cs similarity index 91% rename from Orchestrion/Struct/RenderableSongEntry.cs rename to Orchestrion/Types/RenderableSongEntry.cs index 0ff8cfd..7353672 100644 --- a/Orchestrion/Struct/RenderableSongEntry.cs +++ b/Orchestrion/Types/RenderableSongEntry.cs @@ -1,4 +1,4 @@ -namespace Orchestrion.Struct; +namespace Orchestrion.Types; public struct RenderableSongEntry { diff --git a/Orchestrion/Struct/Song.cs b/Orchestrion/Types/Song.cs similarity index 97% rename from Orchestrion/Struct/Song.cs rename to Orchestrion/Types/Song.cs index 5e1de54..9a46199 100644 --- a/Orchestrion/Struct/Song.cs +++ b/Orchestrion/Types/Song.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Orchestrion.Struct; +namespace Orchestrion.Types; public struct SongStrings { diff --git a/Orchestrion/Struct/SongReplacementEntry.cs b/Orchestrion/Types/SongReplacementEntry.cs similarity index 90% rename from Orchestrion/Struct/SongReplacementEntry.cs rename to Orchestrion/Types/SongReplacementEntry.cs index 8e9a037..e4559ba 100644 --- a/Orchestrion/Struct/SongReplacementEntry.cs +++ b/Orchestrion/Types/SongReplacementEntry.cs @@ -1,4 +1,4 @@ -namespace Orchestrion.Struct; +namespace Orchestrion.Types; public struct SongReplacementEntry { diff --git a/Orchestrion/UI/Components/BgmTooltip.cs b/Orchestrion/UI/Components/BgmTooltip.cs index c870f77..759ad8b 100644 --- a/Orchestrion/UI/Components/BgmTooltip.cs +++ b/Orchestrion/UI/Components/BgmTooltip.cs @@ -4,7 +4,7 @@ using Dalamud.Interface.Utility; using ImGuiNET; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.UI.Components; @@ -30,7 +30,7 @@ public static void DrawBgmTooltip(Song bgm) if (Configuration.Instance.ShowAltLangTitles) { - var code = Util.AltLang(); + var code = Configuration.Instance.AltTitleLanguageCode; var altLangTitle = bgm.Strings[code].Name; if (bgm.Name != altLangTitle && !string.IsNullOrEmpty(altLangTitle)) { @@ -50,7 +50,7 @@ public static void DrawBgmTooltip(Song bgm) if (Configuration.Instance.ShowAltLangTitles) { - var code = Util.AltLang(); + var code = Configuration.Instance.AltTitleLanguageCode; var altLangAltTitle = bgm.Strings[code].AlternateName; if (bgm.AlternateName != altLangAltTitle && !string.IsNullOrEmpty(altLangAltTitle)) { @@ -71,7 +71,7 @@ public static void DrawBgmTooltip(Song bgm) if (Configuration.Instance.ShowAltLangTitles) { - var code = Util.AltLang(); + var code = Configuration.Instance.AltTitleLanguageCode; var altLangSpecialModeName = bgm.Strings[code].SpecialModeName; if (bgm.SpecialModeName != altLangSpecialModeName) { diff --git a/Orchestrion/UI/Components/RenderableSongList.cs b/Orchestrion/UI/Components/RenderableSongList.cs index b5e4baf..e5f4220 100644 --- a/Orchestrion/UI/Components/RenderableSongList.cs +++ b/Orchestrion/UI/Components/RenderableSongList.cs @@ -6,7 +6,7 @@ using Dalamud.Logging; using ImGuiNET; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; using Orchestrion.UI.Windows; namespace Orchestrion.UI.Components; diff --git a/Orchestrion/UI/Components/SongListRenderStrategy.cs b/Orchestrion/UI/Components/SongListRenderStrategy.cs index 9ecb4b7..5548b5c 100644 --- a/Orchestrion/UI/Components/SongListRenderStrategy.cs +++ b/Orchestrion/UI/Components/SongListRenderStrategy.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; using Orchestrion.Audio; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion.UI.Components; diff --git a/Orchestrion/UI/Windows/MainWindow/MainWindow.History.cs b/Orchestrion/UI/Windows/MainWindow/MainWindow.History.cs index a4c553d..f0ef380 100644 --- a/Orchestrion/UI/Windows/MainWindow/MainWindow.History.cs +++ b/Orchestrion/UI/Windows/MainWindow/MainWindow.History.cs @@ -3,7 +3,7 @@ using Dalamud.Logging; using ImGuiNET; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; using Orchestrion.UI.Components; namespace Orchestrion.UI.Windows.MainWindow; diff --git a/Orchestrion/UI/Windows/MainWindow/MainWindow.Playlist.cs b/Orchestrion/UI/Windows/MainWindow/MainWindow.Playlist.cs index 98b751b..a380a61 100644 --- a/Orchestrion/UI/Windows/MainWindow/MainWindow.Playlist.cs +++ b/Orchestrion/UI/Windows/MainWindow/MainWindow.Playlist.cs @@ -10,7 +10,7 @@ using ImGuiNET; using Orchestrion.Audio; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; using Orchestrion.UI.Components; namespace Orchestrion.UI.Windows.MainWindow; @@ -121,6 +121,8 @@ private void DrawPlaylistPane() ImGuiHelpers.ScaledVector2(0f, drawHeight) )) { + Configuration.Instance.LastSelectedPlaylist = pName; + Configuration.Instance.Save(); RefreshPlaylist(playlist); if (ImGui.IsMouseDoubleClicked(ImGuiMouseButton.Left) && playlist.Songs.Count > 0) diff --git a/Orchestrion/UI/Windows/MainWindow/MainWindow.Replacement.cs b/Orchestrion/UI/Windows/MainWindow/MainWindow.Replacement.cs index e5ee3da..43a3061 100644 --- a/Orchestrion/UI/Windows/MainWindow/MainWindow.Replacement.cs +++ b/Orchestrion/UI/Windows/MainWindow/MainWindow.Replacement.cs @@ -3,7 +3,7 @@ using CheapLoc; using ImGuiNET; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; using Orchestrion.UI.Components; namespace Orchestrion.UI.Windows.MainWindow; @@ -25,15 +25,18 @@ private void DrawReplacementList() { foreach (var replacement in Configuration.Instance.SongReplacements.Values) { + if (!SongList.Instance.TryGetSong(replacement.TargetSongId, out var targetSong)) continue; + if (!SongList.Instance.TryGetSong(replacement.ReplacementId, out var replacementSong)) continue; + if (!Util.SearchMatches(_searchText, targetSong) && !Util.SearchMatches(_searchText, replacementSong)) continue; + ImGui.Spacing(); - SongList.Instance.TryGetSong(replacement.TargetSongId, out var target); - var targetText = $"{replacement.TargetSongId} - {target.Name}"; - var replText = replacement.ReplacementId == SongReplacementEntry.NoChangeId ? MainWindow._noChange : $"{replacement.ReplacementId} - {SongList.Instance.GetSong(replacement.ReplacementId).Name}"; + var targetText = $"{replacement.TargetSongId} - {targetSong.Name}"; + var replText = replacement.ReplacementId == SongReplacementEntry.NoChangeId ? _noChange : $"{replacement.ReplacementId} - {replacementSong.Name}"; ImGui.TextWrapped($"{targetText}"); if (ImGui.IsItemHovered()) - BgmTooltip.DrawBgmTooltip(target); + BgmTooltip.DrawBgmTooltip(targetSong); ImGui.Text(Loc.Localize("ReplaceWith", "will be replaced with")); ImGui.TextWrapped($"{replText}"); diff --git a/Orchestrion/UI/Windows/MainWindow/MainWindow.Root.cs b/Orchestrion/UI/Windows/MainWindow/MainWindow.Root.cs index 5b562f3..9a62841 100644 --- a/Orchestrion/UI/Windows/MainWindow/MainWindow.Root.cs +++ b/Orchestrion/UI/Windows/MainWindow/MainWindow.Root.cs @@ -10,7 +10,7 @@ using ImGuiNET; using Orchestrion.Audio; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; using Orchestrion.UI.Components; namespace Orchestrion.UI.Windows.MainWindow; @@ -42,6 +42,7 @@ private enum TabType public MainWindow(OrchestrionPlugin orch) : base(BaseName, ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse) { _orch = orch; + _selectedPlaylist = Configuration.Instance.Playlists.Values.FirstOrDefault(p => p.Name == Configuration.Instance.LastSelectedPlaylist); _mainSongList = new RenderableSongList( SongList.Instance.GetSongs().Select(s => new RenderableSongEntry(s.Key)).ToList(), diff --git a/Orchestrion/UI/Windows/SettingsWindow.cs b/Orchestrion/UI/Windows/SettingsWindow.cs index 0dd2341..3bcfa25 100644 --- a/Orchestrion/UI/Windows/SettingsWindow.cs +++ b/Orchestrion/UI/Windows/SettingsWindow.cs @@ -1,6 +1,10 @@ -using CheapLoc; +using System.Collections.Generic; +using System.Linq; +using CheapLoc; +using Dalamud.Game.Text; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; +using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Windowing; using ImGuiNET; using Orchestrion.BGMSystem; @@ -20,17 +24,49 @@ public override void PreDraw() Size = ImGuiHelpers.ScaledVector2(720, 520); } - private static void Checkbox(string text, Func get, Action set) + private static void Checkbox(string text, Func get, Action set, Action onChange = null) { var value = get(); + var backup = value; if (ImGui.Checkbox($"##orch_{text}", ref value)) { set(value); Configuration.Instance.Save(); } + if (value != backup) + onChange?.Invoke(value); ImGui.SameLine(); ImGui.TextWrapped(text); } + + private static void DropDown(string text, + Func get, + Action set, + Func isSelected, + List items, + Func displayFunc = null, + Action onChange = null) + { + var value = get(); + ImGui.SetNextItemWidth(100f * ImGuiHelpers.GlobalScale); + using var combo = ImRaii.Combo(text, value); + if (!combo.Success) + { + // ImGui.PopItemWidth(); + return; + } + foreach (var item in items) { + var display = displayFunc != null ? displayFunc(item) : item; + if (ImGui.Selectable(display, isSelected(item))) + { + set(item); + Configuration.Instance.Save(); + } + } + if (get() != value) + onChange?.Invoke(true); + // ImGui.PopItemWidth(); + } public override void Draw() { @@ -81,25 +117,92 @@ public override void Draw() ImGui.PopStyleColor(); } + Checkbox(Loc.Localize("UseDalamudChannelSetting", + "Use the chat channel selected in Dalamud's settings for Orchestrion's chat messages (default)"), + () => Configuration.Instance.ChatChannelMatchDalamud, + b => Configuration.Instance.ChatChannelMatchDalamud = b, + b => + { + if (!b) return; + Configuration.Instance.ChatType = DalamudApi.PluginInterface.GeneralChatType; + Configuration.Instance.Save(); + }); + + ImGui.BeginDisabled(Configuration.Instance.ChatChannelMatchDalamud); + ImGui.Indent(30f * ImGuiHelpers.GlobalScale); + DropDown(Loc.Localize("ChatChannelSetting", "Chat channel used for Orchestrion messages"), + () => Configuration.Instance.ChatType.ToString(), + s => Configuration.Instance.ChatType = Enum.Parse(s), + s => s == Configuration.Instance.ChatType.ToString(), + Enum.GetValues().Select(c => c.ToString()).ToList()); + ImGui.Indent(-1 * 30f * ImGuiHelpers.GlobalScale); + ImGui.EndDisabled(); + ImGui.PushFont(OrchestrionPlugin.LargeFont); ImGui.Text(Loc.Localize("LocSettings", "Localization Settings")); ImGui.PopFont(); + + Checkbox(Loc.Localize("UseDalamudLanguageSetting", + "Use the language selected in Dalamud's settings for the Orchestrion Plugin's UI"), + () => Configuration.Instance.UserInterfaceLanguageMatchDalamud, + b => Configuration.Instance.UserInterfaceLanguageMatchDalamud = b, + b => + { + if (!b) return; + Configuration.Instance.UserInterfaceLanguageCode = DalamudApi.PluginInterface.UiLanguage; + Configuration.Instance.Save(); + OrchestrionPlugin.LanguageChanged(Configuration.Instance.UserInterfaceLanguageCode); + }); + ImGui.BeginDisabled(Configuration.Instance.UserInterfaceLanguageMatchDalamud); + ImGui.Indent(30f * ImGuiHelpers.GlobalScale); + DropDown(Loc.Localize("UILanguageSetting", + "Language used for the Orchestrion Plugin's UI"), + () => Util.LangCodeToLanguage(Configuration.Instance.UserInterfaceLanguageCode), + s => Configuration.Instance.UserInterfaceLanguageCode = s, + s => s == Configuration.Instance.UserInterfaceLanguageCode, + Util.AvailableLanguages, + Util.LangCodeToLanguage, + _ => + { + OrchestrionPlugin.LanguageChanged(Configuration.Instance.UserInterfaceLanguageCode); + }); + ImGui.Indent(-1 * 30f * ImGuiHelpers.GlobalScale); + ImGui.EndDisabled(); + Checkbox(Loc.Localize("ShowAltLangTitles", - "Show alternate language song titles in tooltips"), + "Show alternate language song titles in tooltips"), () => Configuration.Instance.ShowAltLangTitles, b => Configuration.Instance.ShowAltLangTitles = b); - - Checkbox(Loc.Localize("UseClientLangInServerInfo", - "Use client language, not Dalamud language, for song titles in the \"server info\" UI element in-game"), - () => Configuration.Instance.UseClientLangInServerInfo, - b => Configuration.Instance.UseClientLangInServerInfo = b); - - Checkbox(Loc.Localize("UseClientLangInChat", - "Use client language, not Dalamud language, for song titles in Orchestrion chat messages in-game"), - () => Configuration.Instance.UseClientLangInChat, - b => Configuration.Instance.UseClientLangInChat = b); - + + ImGui.BeginDisabled(!Configuration.Instance.ShowAltLangTitles); + ImGui.Indent(30f * ImGuiHelpers.GlobalScale); + DropDown(Loc.Localize("AltLangLanguageSetting", + "Alternate language for song titles in tooltips"), + () => Util.LangCodeToLanguage(Configuration.Instance.AltTitleLanguageCode), + s => Configuration.Instance.AltTitleLanguageCode = s, + s => s == Configuration.Instance.AltTitleLanguageCode, + Util.AvailableTitleLanguages, + Util.LangCodeToLanguage); + ImGui.Indent(-1 * 30f * ImGuiHelpers.GlobalScale); + ImGui.EndDisabled(); + + DropDown(Loc.Localize("ServerInfoLanguageSetting", + "Language used for song titles in the \"server info\" UI element in-game"), + () => Util.LangCodeToLanguage(Configuration.Instance.ServerInfoLanguageCode), + s => Configuration.Instance.ServerInfoLanguageCode = s, + s => s == Configuration.Instance.ServerInfoLanguageCode, + Util.AvailableTitleLanguages, + Util.LangCodeToLanguage); + + DropDown(Loc.Localize("ChatMessageLanguageSetting", + "Language used for song titles in Orchestrion chat messages in-game"), + () => Util.LangCodeToLanguage(Configuration.Instance.ChatLanguageCode), + s => Configuration.Instance.ChatLanguageCode = s, + s => s == Configuration.Instance.ChatLanguageCode, + Util.AvailableTitleLanguages, + Util.LangCodeToLanguage); + ImGui.PushFont(OrchestrionPlugin.LargeFont); ImGui.Text(Loc.Localize("MiniPlayerSettings", "Mini Player Settings")); ImGui.PopFont(); diff --git a/Orchestrion/Util.cs b/Orchestrion/Util.cs index 651f493..994abea 100644 --- a/Orchestrion/Util.cs +++ b/Orchestrion/Util.cs @@ -1,14 +1,24 @@ -using System.Numerics; +using System.Collections.Generic; +using System.Globalization; +using System.Numerics; using Dalamud; using Dalamud.Interface; using ImGuiNET; using Orchestrion.Persistence; -using Orchestrion.Struct; +using Orchestrion.Types; namespace Orchestrion; public static class Util { + public static List AvailableLanguages => new() { "en", "ja", "de", "fr", "it", "zh" }; + public static List AvailableTitleLanguages => new() { "en", "ja", "zh" }; + + public static string LangCodeToLanguage(string code) + { + return CultureInfo.GetCultureInfo(code).NativeName; + } + public static Vector2 GetIconSize(FontAwesomeIcon icon) { ImGui.PushFont(UiBuilder.IconFont); @@ -29,16 +39,13 @@ public static bool SearchMatches(string searchText, Song song) var lang = Lang(); var matchesSearch = false; - - // En title check - matchesSearch |= song.Strings["en"].Name.ToLower().Contains(searchText.ToLower()); - matchesSearch |= song.Strings["en"].AlternateName.ToLower().Contains(searchText.ToLower()); - matchesSearch |= song.Strings["en"].SpecialModeName.ToLower().Contains(searchText.ToLower()); - - // Ja title check - matchesSearch |= song.Strings["ja"].Name.ToLower().Contains(searchText.ToLower()); - matchesSearch |= song.Strings["ja"].AlternateName.ToLower().Contains(searchText.ToLower()); - matchesSearch |= song.Strings["ja"].SpecialModeName.ToLower().Contains(searchText.ToLower()); + + foreach (var titleLang in AvailableTitleLanguages) + { + matchesSearch |= song.Strings[titleLang].Name.ToLower().Contains(searchText.ToLower()); + matchesSearch |= song.Strings[titleLang].AlternateName.ToLower().Contains(searchText.ToLower()); + matchesSearch |= song.Strings[titleLang].SpecialModeName.ToLower().Contains(searchText.ToLower()); + } // Id check matchesSearch |= song.Id.ToString().Contains(searchText); @@ -56,26 +63,4 @@ public static string Lang() { return DalamudApi.PluginInterface.UiLanguage; } - - public static string AltLang() - { - return Lang() switch - { - "en" => "ja", - "ja" => "en", - _ => "en", - }; - } - - public static string ClientLangCode() - { - return DalamudApi.ClientState.ClientLanguage switch - { - ClientLanguage.Japanese => "ja", - ClientLanguage.English => "en", - ClientLanguage.German => "de", - ClientLanguage.French => "fr", - _ => throw new ArgumentOutOfRangeException() - }; - } } \ No newline at end of file