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