diff --git a/.github/forge-posts/v1.5.6.md b/.github/forge-posts/v1.5.6.md
new file mode 100644
index 0000000..d16315c
--- /dev/null
+++ b/.github/forge-posts/v1.5.6.md
@@ -0,0 +1,11 @@
+---
+subtitle: "Settings Overhaul + Filter & Notification Polish"
+versionsnatur: "Settings-Overhaul-Release"
+---
+- **Settings komplett neu strukturiert** — die zehn alten Tabs sind auf sieben zusammengefasst (Allgemein, Aussehen, Chat, Fenster, Kanäle, Daten & Privatsphäre, Über). Jeder Tab gliedert sich jetzt in Sektionen, die beim Reingehen eingeklappt sind. Controls innerhalb einer Sektion sind nach Typ gruppiert. Tabs-Tab im Per-Tab-Panel ebenfalls in Sub-Sektionen aufgeteilt.
+- **Absender-Namen anpassbar** — neue Optionen in Chat → Nachrichten für das Namensformat (Voll / Vorname / Initialen) und das Welt-Suffix (Nie / Andere Welten / Immer).
+- **Pre-Send-Warnung für Plugin-Symbole** — beim Senden einer Nachricht mit Symbolen, die nur HellionChat-User sehen, kommt eine Warnung. Verhindert leere Kästchen bei anderen.
+- **Getrennte Fenster-Deckkraft** — Aktiv vs. Inaktiv. Aktiv wie bisher; Inaktiv über einen zweiten Slider unter Aussehen → Fenster-Stil.
+- **Lautstärke für eigene Notification-Sounds** — Slider in Allgemein → Sound, im Kanäle-Tab pro Tab nochmal angezeigt. Wirkt nur auf die drei mitgelieferten Custom-Sounds, die 16 Game-Sounds bleiben unverändert.
+- **Regex-Filter pro Tab gestrichen** — kurz dabei, dann verworfen: der eingebaute FFXIV-Blackword-Filter deckt das ab.
+- **Lokalisierung erweitert** — neue Section-Titel und v1.5.6-Controls in allen 24 Sprachen, maschinell übersetzt. Native-Review läuft weiter über den Hellion Forge Discord.
diff --git a/HellionChat/Configuration.cs b/HellionChat/Configuration.cs
index af49a91..2777af9 100755
--- a/HellionChat/Configuration.cs
+++ b/HellionChat/Configuration.cs
@@ -1,4 +1,5 @@
using System.Collections;
+using System.Linq;
using Dalamud;
using Dalamud.Bindings.ImGui;
using Dalamud.Configuration;
@@ -34,7 +35,7 @@ public class ConfigKeyBind
[Serializable]
public class Configuration : IPluginConfiguration
{
- private const int LatestVersion = 18;
+ private const int LatestVersion = 19;
public int Version { get; set; } = LatestVersion;
@@ -44,6 +45,10 @@ public class Configuration : IPluginConfiguration
// Global window opacity, applied across all themes.
public float WindowOpacity = 0.85f;
+ // UI-12: background opacity of the main chat window while unfocused.
+ // WindowOpacity above stays the focused value.
+ public float WindowOpacityInactive = 0.65f;
+
// Reserved for future UI toggles; pre-declared to avoid a migration later.
public bool ReduceMotion;
@@ -133,6 +138,10 @@ public class Configuration : IPluginConfiguration
public bool SeenPopOutHeaderHint;
public bool AutoTellTabsOpenAsPopout;
+ // UI-7: how sender names are rendered in the chat log.
+ public WorldSuffixMode WorldSuffixMode = WorldSuffixMode.OtherWorldOnly;
+ public NameFormMode NameFormMode = NameFormMode.Full;
+
public int GetRetentionDays(ChatType type)
{
if (RetentionPerChannelDays.TryGetValue(type, out var userOverride))
@@ -187,9 +196,14 @@ public class Configuration : IPluginConfiguration
public bool CollapseKeepUniqueLinks;
public bool SymbolPickerEnabled = true;
public bool PlaySounds = true;
+ // AUDIO-1: playback volume (0-1) for the three bundled custom sounds.
+ public float CustomSoundVolume = 0.5f;
// Toast when a tell the user sent could not be delivered.
public bool NotifyFailedTell = true;
+
+ // UI-11: warn before sending a message that carries plugin-only glyphs.
+ public bool NotifyPluginDisclosure = true;
public bool KeepInputFocus = true;
public int MaxLinesToRender = 2_500; // 1-10000
public bool Use24HourClock = true;
@@ -285,7 +299,9 @@ public class Configuration : IPluginConfiguration
CollapseKeepUniqueLinks = other.CollapseKeepUniqueLinks;
SymbolPickerEnabled = other.SymbolPickerEnabled;
PlaySounds = other.PlaySounds;
+ CustomSoundVolume = other.CustomSoundVolume;
NotifyFailedTell = other.NotifyFailedTell;
+ NotifyPluginDisclosure = other.NotifyPluginDisclosure;
KeepInputFocus = other.KeepInputFocus;
MaxLinesToRender = other.MaxLinesToRender;
Use24HourClock = other.Use24HourClock;
@@ -357,6 +373,7 @@ public class Configuration : IPluginConfiguration
// v1.1.0 theme engine fields
Theme = other.Theme;
WindowOpacity = other.WindowOpacity;
+ WindowOpacityInactive = other.WindowOpacityInactive;
ReduceMotion = other.ReduceMotion;
UseCompactDensity = other.UseCompactDensity;
@@ -371,6 +388,9 @@ public class Configuration : IPluginConfiguration
PopOutInputEnabled = other.PopOutInputEnabled;
SeenPopOutHeaderHint = other.SeenPopOutHeaderHint;
AutoTellTabsOpenAsPopout = other.AutoTellTabsOpenAsPopout;
+
+ WorldSuffixMode = other.WorldSuffixMode;
+ NameFormMode = other.NameFormMode;
}
}
diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj
index 4aede89..208b462 100644
--- a/HellionChat/HellionChat.csproj
+++ b/HellionChat/HellionChat.csproj
@@ -1,7 +1,7 @@
- 1.5.5
+ 1.5.6
enable
enable
diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml
index d2d8834..28f9e9b 100755
--- a/HellionChat/HellionChat.yaml
+++ b/HellionChat/HellionChat.yaml
@@ -35,6 +35,20 @@ tags:
- Replacement
- Privacy
changelog: |-
+ **v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)**
+
+ - Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.
+ - New sender-name display options under Chat → Messages: separate world-suffix and name-format modes (Full name / First name only / Initials × Never / Other worlds only / Always).
+ - Plugin-only symbols now show a pre-send warning so other players do not get empty boxes (Chat → Messages → "Warn before sending plugin-only symbols").
+ - Separate window opacity for focused vs. inactive chat window (Appearance → Window style → "Inactive window opacity"). The slider above sets the focused value.
+ - Custom notification sound volume slider (General → Sound, and mirrored in Channels → per-tab → Notification). Affects only the three bundled custom sounds; the 16 game sounds are unaffected.
+ - The per-tab regex filter that briefly shipped earlier in this cycle has been removed — FFXIV's built-in blackword filter covers the same need.
+ - All 24 locale files updated for the new section labels and the v1.5.6 control labels (machine translation; native review continues via the Hellion Forge Discord).
+
+ Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
+
+ ---
+
**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**
A backlog-sync cycle: inherited tab-feature items plus a new fox
@@ -163,54 +177,4 @@ changelog: |-
---
- **v1.5.2 — First-Run Wizard Rework (2026-05-18)**
-
- UX patch. The first-run wizard becomes a four-step flow with a
- new Roleplay privacy profile and a power-settings step that
- surfaces previously-hidden defaults. Existing v1.5.1 users see
- the new wizard once on first v1.5.2 boot.
-
- What changes user-visible:
-
- - Wizard navigation: Welcome → Privacy profile → Power settings
- → Done. Forge-Bronze pagination dots, dedicated stage for the
- power settings so they are no longer buried in Settings.
- - Fourth privacy profile "Roleplay": Privacy-First plus Say and
- both emote types, with a 30-day window for Say and a 90-day
- window for emotes. Shout, Yell and Novice Network stay out.
- - Privacy picker becomes a 2x2 grid. Casual stays the
- recommended option with a ★ marker.
- - Power-settings step covers Load Previous Session, Filter
- Include Previous Sessions, Auto-Tell-Tabs History Preload,
- Compact Density, Prettier Timestamps and a built-in theme
- picker. All six map to existing Configuration fields — no new
- settings introduced.
- - Staged commit: the wizard only writes to Config on the Finish
- step. Decide-later or X-close at any point leaves the existing
- config untouched.
- - Inline test hint on the done step: "type /tell
- into chat" surfaces the auto-tell-tab spawn mechanism.
- - Window starts at 720x480 (was 900x560) and can shrink to
- 600x400; Step 1 keeps the fox banner in a folded TreeNode so
- the onboarding copy stays primary.
- - Existing users get the new wizard surfaced once on first boot
- after the update via the new WizardLastShownVersion config
- field. Future cycles bump the constant only when the wizard
- itself changes shape.
-
- Under the hood:
-
- - WizardStateSmokeStep added to /xlperf alongside the FontManager
- and ThemeSwitch self-tests.
- - Twelve new pure-helper xUnit Facts in the Build Suite cover
- all four privacy profile sets and their retention overrides.
-
- Migration v17 stays (no schema bump). The Configuration grows
- one optional string field (WizardLastShownVersion) which
- defaults to empty for legacy users.
-
- Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
-
- ---
-
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
diff --git a/HellionChat/Integrations/CustomAudioPlayer.cs b/HellionChat/Integrations/CustomAudioPlayer.cs
index 320b5fd..157347d 100644
--- a/HellionChat/Integrations/CustomAudioPlayer.cs
+++ b/HellionChat/Integrations/CustomAudioPlayer.cs
@@ -9,8 +9,9 @@ namespace HellionChat.Integrations;
// WaveOutEvent/WinMM is the correct backend for FFXIV on Wine: it works
// without Media Foundation (which Wine does not support for MP3/AAC).
//
-// Volume is fixed at 0.8. No per-user slider in this iteration so we can
-// ship quickly and gather feedback before adding UX complexity.
+// Playback volume comes from Configuration.CustomSoundVolume via the Play
+// parameter, clamped to [0,1]. The 16 game sounds are unaffected — they go
+// through UIGlobals.PlaySoundEffect, which the plugin cannot scale.
internal sealed class CustomAudioPlayer : IDisposable
{
// Sound bytes are read once at construction so each Play() wraps a fresh
@@ -55,7 +56,7 @@ internal sealed class CustomAudioPlayer : IDisposable
// customIndex is 1, 2, or 3, matching the sound file suffix.
// Stops any currently playing sound before starting the new one.
// NAudio playback runs on its own thread; this method returns immediately.
- public void Play(int customIndex)
+ public void Play(int customIndex, float volume)
{
if (customIndex < 1 || customIndex > 3)
{
@@ -90,7 +91,10 @@ internal sealed class CustomAudioPlayer : IDisposable
// must be set after Init, otherwise waveOutSetVolume fails with
// InvalidHandle.
_outputDevice.Init(_reader);
- _outputDevice.Volume = 0.8f;
+ // AUDIO-1: volume comes from Configuration.CustomSoundVolume.
+ // Clamp here too — a hand-edited config could carry an
+ // out-of-range value, and WaveOutEvent.Volume rejects those.
+ _outputDevice.Volume = Math.Clamp(volume, 0f, 1f);
_outputDevice.Play();
}
catch (Exception ex)
diff --git a/HellionChat/MessageManager.cs b/HellionChat/MessageManager.cs
index df91241..965d556 100644
--- a/HellionChat/MessageManager.cs
+++ b/HellionChat/MessageManager.cs
@@ -380,7 +380,7 @@ internal class MessageManager : IAsyncDisposable
{
// Custom bundled sounds (ids 17-19) go through NAudio WaveOutEvent.
// NAudio manages its own playback thread, so no framework marshalling needed.
- Plugin.CustomAudioPlayer.Play((int)soundId - 16);
+ Plugin.CustomAudioPlayer.Play((int)soundId - 16, Plugin.Config.CustomSoundVolume);
}
// soundId == 0 (hand-edited config) falls through: plays nothing.
}
diff --git a/HellionChat/NameDisplayModes.cs b/HellionChat/NameDisplayModes.cs
new file mode 100644
index 0000000..cbdc140
--- /dev/null
+++ b/HellionChat/NameDisplayModes.cs
@@ -0,0 +1,40 @@
+using HellionChat.Resources;
+
+namespace HellionChat;
+
+// UI-7: how a sender's name is rendered in the chat log. Kept in its own file
+// (no Dalamud usings) so the SenderNameFormatter pure-helper test stays
+// AppDomain-isolated (feedback_dalamud_test_isolation).
+
+public enum WorldSuffixMode
+{
+ Never,
+ OtherWorldOnly,
+ Always,
+}
+
+public enum NameFormMode
+{
+ Full,
+ FirstNameOnly,
+ Initials,
+}
+
+public static class NameDisplayModeExt
+{
+ public static string Name(this WorldSuffixMode mode) => mode switch
+ {
+ WorldSuffixMode.Never => HellionStrings.NameDisplay_WorldSuffix_Never,
+ WorldSuffixMode.OtherWorldOnly => HellionStrings.NameDisplay_WorldSuffix_OtherWorldOnly,
+ WorldSuffixMode.Always => HellionStrings.NameDisplay_WorldSuffix_Always,
+ _ => mode.ToString(),
+ };
+
+ public static string Name(this NameFormMode mode) => mode switch
+ {
+ NameFormMode.Full => HellionStrings.NameDisplay_NameForm_Full,
+ NameFormMode.FirstNameOnly => HellionStrings.NameDisplay_NameForm_FirstNameOnly,
+ NameFormMode.Initials => HellionStrings.NameDisplay_NameForm_Initials,
+ _ => mode.ToString(),
+ };
+}
diff --git a/HellionChat/Plugin.cs b/HellionChat/Plugin.cs
index cbb1679..5c090a4 100755
--- a/HellionChat/Plugin.cs
+++ b/HellionChat/Plugin.cs
@@ -200,11 +200,11 @@ public sealed class Plugin : IAsyncDalamudPlugin
// do not touch either static, so the brief null-window is safe.
// Schema gate: v1.4.x+ requires config v16+. Users on older schemas
- // must install v1.4.2 first to run the migration chain. v18 adds the
- // per-tab EnableNotificationSound + NotificationSoundId fields and the
- // top-level NotifyFailedTell flag, all additive with defaults, so
- // v16/v17 configs load cleanly and get their Version stamp bumped
- // after the gate.
+ // must install v1.4.2 first to run the migration chain. v19 adds the
+ // top-level CustomSoundVolume, WindowOpacityInactive, WorldSuffixMode
+ // and NameFormMode fields — all additive with defaults, so v16-v18
+ // configs load cleanly and get their Version stamp bumped after the
+ // gate.
if (Config.Version < 16)
{
throw new InvalidOperationException(
@@ -212,7 +212,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
+ "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.10."
);
}
- Config.Version = 18;
+ Config.Version = 19;
// Unpinned TempTabs are session-only and dropped on every load. Pinned
// TempTabs survive reload — Jin's tester feedback (v1.4.7).
@@ -955,7 +955,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
// this same draw thread, so it cannot be null here.
// v1.5.3 fix: also push RegularFont when the bundled Inter Light is
// selected. Without this, UseHellionFont=true silently fell back to
- // the FFXIV Axis font because FontsAndColours forces FontsEnabled
+ // the FFXIV Axis font because the Appearance tab forces FontsEnabled
// off in that branch, and the bundled font never made it into draw.
var useRegularFont = Config.FontsEnabled || Config.UseHellionFont;
using ((useRegularFont ? FontManager.RegularFont! : FontManager.Axis).Push())
diff --git a/HellionChat/Resources/HellionStrings.Designer.cs b/HellionChat/Resources/HellionStrings.Designer.cs
index 2a5f0a2..3ffdf0d 100644
--- a/HellionChat/Resources/HellionStrings.Designer.cs
+++ b/HellionChat/Resources/HellionStrings.Designer.cs
@@ -41,11 +41,9 @@ internal class HellionStrings
private static string Get(string key)
=> ResourceManager.GetString(key, resourceCulture) ?? key;
- internal static string Privacy_Tab_Title => Get(nameof(Privacy_Tab_Title));
internal static string Privacy_FilterEnabled_Name => Get(nameof(Privacy_FilterEnabled_Name));
internal static string Privacy_FilterEnabled_Description => Get(nameof(Privacy_FilterEnabled_Description));
internal static string Privacy_FilterEnabled_StorageOnly_Help => Get(nameof(Privacy_FilterEnabled_StorageOnly_Help));
- internal static string Privacy_Filter_Tree_Heading => Get(nameof(Privacy_Filter_Tree_Heading));
internal static string Privacy_Whitelist_Help => Get(nameof(Privacy_Whitelist_Help));
internal static string Privacy_Preset_PrivacyFirst => Get(nameof(Privacy_Preset_PrivacyFirst));
internal static string Privacy_Preset_ClearAll => Get(nameof(Privacy_Preset_ClearAll));
@@ -260,8 +258,6 @@ internal class HellionStrings
internal static string Settings_Card_Chat_Subtext => Get(nameof(Settings_Card_Chat_Subtext));
internal static string Settings_Card_Tabs_Title => Get(nameof(Settings_Card_Tabs_Title));
internal static string Settings_Card_Tabs_Subtext => Get(nameof(Settings_Card_Tabs_Subtext));
- internal static string Settings_Card_Privacy_Title => Get(nameof(Settings_Card_Privacy_Title));
- internal static string Settings_Card_Privacy_Subtext => Get(nameof(Settings_Card_Privacy_Subtext));
internal static string Settings_Card_Database_Title => Get(nameof(Settings_Card_Database_Title));
internal static string Settings_Card_Database_Subtext => Get(nameof(Settings_Card_Database_Subtext));
internal static string Settings_Card_Information_Title => Get(nameof(Settings_Card_Information_Title));
@@ -278,11 +274,6 @@ internal class HellionStrings
internal static string Settings_Themes_ApplyChatColors_Apply => Get(nameof(Settings_Themes_ApplyChatColors_Apply));
internal static string Settings_Themes_ApplyChatColors_Keep => Get(nameof(Settings_Themes_ApplyChatColors_Keep));
- // Hellion Chat — General-Tab section headings
- internal static string Settings_General_Input_Heading => Get(nameof(Settings_General_Input_Heading));
- internal static string Settings_General_Audio_Heading => Get(nameof(Settings_General_Audio_Heading));
- internal static string Settings_General_Performance_Heading => Get(nameof(Settings_General_Performance_Heading));
- internal static string Settings_General_Language_Heading => Get(nameof(Settings_General_Language_Heading));
internal static string Settings_Language_FFXIVCoverage_Warning => Get(nameof(Settings_Language_FFXIVCoverage_Warning));
// Hellion Chat — Appearance-Tab section headings
@@ -291,17 +282,8 @@ internal class HellionStrings
internal static string Settings_Appearance_Colours_Heading => Get(nameof(Settings_Appearance_Colours_Heading));
internal static string Settings_Appearance_Timestamps_Heading => Get(nameof(Settings_Appearance_Timestamps_Heading));
- // Hellion Chat — Window-Tab section headings
- internal static string Settings_Window_Hide_Heading => Get(nameof(Settings_Window_Hide_Heading));
- internal static string Settings_Window_InactivityHide_Heading => Get(nameof(Settings_Window_InactivityHide_Heading));
+ // Hellion Chat — Window-Tab section headings (pre-cycle legacy, kept for reference)
internal static string Settings_Window_Frame_Heading => Get(nameof(Settings_Window_Frame_Heading));
- internal static string Settings_Window_Tooltips_Heading => Get(nameof(Settings_Window_Tooltips_Heading));
-
- // Hellion Chat — Chat-Tab section headings
- internal static string Settings_Chat_AutoTellTabs_Heading => Get(nameof(Settings_Chat_AutoTellTabs_Heading));
- internal static string Settings_Chat_Behaviour_Heading => Get(nameof(Settings_Chat_Behaviour_Heading));
- internal static string Settings_Chat_Preview_Heading => Get(nameof(Settings_Chat_Preview_Heading));
- internal static string Settings_Chat_Emotes_Heading => Get(nameof(Settings_Chat_Emotes_Heading));
// Hellion Chat — Chat-Tab SymbolPicker
internal static string Settings_Chat_SymbolPicker_Enable_Name => Get(nameof(Settings_Chat_SymbolPicker_Enable_Name));
@@ -312,11 +294,6 @@ internal class HellionStrings
internal static string Settings_Database_Viewer_Heading => Get(nameof(Settings_Database_Viewer_Heading));
internal static string Settings_Database_Stats_Heading => Get(nameof(Settings_Database_Stats_Heading));
- // Hellion Chat — Information-Tab section headings
- internal static string Settings_Information_VersionInfo_Heading => Get(nameof(Settings_Information_VersionInfo_Heading));
- internal static string Settings_Information_About_Heading => Get(nameof(Settings_Information_About_Heading));
- internal static string Settings_Information_Changelog_Heading => Get(nameof(Settings_Information_Changelog_Heading));
-
// Hellion Chat — Default tab presets (channel-themed)
internal static string Tabs_Presets_System => Get(nameof(Tabs_Presets_System));
internal static string Tabs_Presets_FreeCompany => Get(nameof(Tabs_Presets_FreeCompany));
@@ -374,14 +351,8 @@ internal class HellionStrings
internal static string Appearance_UseCompactDensity_Description => Get(nameof(Appearance_UseCompactDensity_Description));
// Hellion Chat — v1.2.1 Settings Cleanup: new card titles + subtexts
- internal static string Settings_Card_ThemeAndLayout_Title => Get(nameof(Settings_Card_ThemeAndLayout_Title));
- internal static string Settings_Card_ThemeAndLayout_Subtext => Get(nameof(Settings_Card_ThemeAndLayout_Subtext));
- internal static string Settings_Card_FontsAndColours_Title => Get(nameof(Settings_Card_FontsAndColours_Title));
- internal static string Settings_Card_FontsAndColours_Subtext => Get(nameof(Settings_Card_FontsAndColours_Subtext));
internal static string Settings_Card_DataManagement_Title => Get(nameof(Settings_Card_DataManagement_Title));
internal static string Settings_Card_DataManagement_Subtext => Get(nameof(Settings_Card_DataManagement_Subtext));
- internal static string Settings_Card_Integrations_Title => Get(nameof(Settings_Card_Integrations_Title));
- internal static string Settings_Card_Integrations_Subtext => Get(nameof(Settings_Card_Integrations_Subtext));
// Hellion Chat — v1.2.1 Theme & Layout tab section headings + WindowOpacity slider
internal static string Settings_ThemeAndLayout_Theme_Heading => Get(nameof(Settings_ThemeAndLayout_Theme_Heading));
@@ -390,26 +361,21 @@ internal class HellionStrings
internal static string Settings_ThemeAndLayout_WindowOpacity_Name => Get(nameof(Settings_ThemeAndLayout_WindowOpacity_Name));
internal static string Settings_ThemeAndLayout_WindowOpacity_Description => Get(nameof(Settings_ThemeAndLayout_WindowOpacity_Description));
- // Hellion Chat — v1.2.1 Fonts & Colours tab section headings
- internal static string Settings_FontsAndColours_Fonts_Heading => Get(nameof(Settings_FontsAndColours_Fonts_Heading));
- internal static string Settings_FontsAndColours_Colours_Heading => Get(nameof(Settings_FontsAndColours_Colours_Heading));
-
// Hellion Chat — v1.2.1 Data Management tab section headings
- internal static string Settings_DataManagement_Storage_Heading => Get(nameof(Settings_DataManagement_Storage_Heading));
- internal static string Settings_DataManagement_Retention_Heading => Get(nameof(Settings_DataManagement_Retention_Heading));
- internal static string Settings_DataManagement_Cleanup_Heading => Get(nameof(Settings_DataManagement_Cleanup_Heading));
- internal static string Settings_DataManagement_Export_Heading => Get(nameof(Settings_DataManagement_Export_Heading));
- internal static string Settings_DataManagement_DbViewer_Heading => Get(nameof(Settings_DataManagement_DbViewer_Heading));
internal static string Settings_DataManagement_Advanced_Heading => Get(nameof(Settings_DataManagement_Advanced_Heading));
- // Hellion Chat — v1.2.1 Window-tab Behaviour heading (replaces Frame heading)
- internal static string Settings_Window_Frame_Behaviour_Heading => Get(nameof(Settings_Window_Frame_Behaviour_Heading));
+ // v1.5.6: Data & Privacy tab section titles (R6)
+ internal static string Settings_Section_PrivacyFilter => Get(nameof(Settings_Section_PrivacyFilter));
+ internal static string Settings_Section_Storage => Get(nameof(Settings_Section_Storage));
+ internal static string Settings_Section_Retention => Get(nameof(Settings_Section_Retention));
+ internal static string Settings_Section_Cleanup => Get(nameof(Settings_Section_Cleanup));
+ internal static string Settings_Section_Export => Get(nameof(Settings_Section_Export));
+ internal static string Settings_Section_Database => Get(nameof(Settings_Section_Database));
// Hellion Chat — v1.2.1 Migration v15 → v16 toast
internal static string Migration_v16_OverrideStyle_Toast => Get(nameof(Migration_v16_OverrideStyle_Toast));
- // Hellion Chat — v1.3.0 Integrations tab (Honorific + Coming-Soon roadmap)
- internal static string Settings_Tab_Integrations => Get(nameof(Settings_Tab_Integrations));
+ // Hellion Chat — v1.3.0 Integrations (Honorific + Coming-Soon roadmap) — now in About tab
internal static string Settings_Integrations_Intro => Get(nameof(Settings_Integrations_Intro));
internal static string Settings_Integrations_Honorific_SectionHeader => Get(nameof(Settings_Integrations_Honorific_SectionHeader));
internal static string Settings_Integrations_Honorific_Status_Detected => Get(nameof(Settings_Integrations_Honorific_Status_Detected));
@@ -469,4 +435,72 @@ internal class HellionStrings
internal static string ChatLog_ScrollToBottom_Tooltip => Get(nameof(ChatLog_ScrollToBottom_Tooltip));
internal static string ChatLog_Insert_MapFlag => Get(nameof(ChatLog_Insert_MapFlag));
internal static string ChatLog_Insert_ItemLink => Get(nameof(ChatLog_Insert_ItemLink));
+
+ // v1.5.6: plugin-disclosure warning
+ internal static string Settings_Chat_NotifyPluginDisclosure_Name => Get(nameof(Settings_Chat_NotifyPluginDisclosure_Name));
+ internal static string Settings_Chat_NotifyPluginDisclosure_Description => Get(nameof(Settings_Chat_NotifyPluginDisclosure_Description));
+ internal static string ChatInput_PluginDisclosure_Warning => Get(nameof(ChatInput_PluginDisclosure_Warning));
+
+ // v1.5.6: world suffix + name format display options
+ internal static string Settings_Chat_WorldSuffix_Name => Get(nameof(Settings_Chat_WorldSuffix_Name));
+ internal static string Settings_Chat_WorldSuffix_Description => Get(nameof(Settings_Chat_WorldSuffix_Description));
+ internal static string Settings_Chat_NameForm_Name => Get(nameof(Settings_Chat_NameForm_Name));
+ internal static string Settings_Chat_NameForm_Description => Get(nameof(Settings_Chat_NameForm_Description));
+ internal static string NameDisplay_WorldSuffix_Never => Get(nameof(NameDisplay_WorldSuffix_Never));
+ internal static string NameDisplay_WorldSuffix_OtherWorldOnly => Get(nameof(NameDisplay_WorldSuffix_OtherWorldOnly));
+ internal static string NameDisplay_WorldSuffix_Always => Get(nameof(NameDisplay_WorldSuffix_Always));
+ internal static string NameDisplay_NameForm_Full => Get(nameof(NameDisplay_NameForm_Full));
+ internal static string NameDisplay_NameForm_FirstNameOnly => Get(nameof(NameDisplay_NameForm_FirstNameOnly));
+ internal static string NameDisplay_NameForm_Initials => Get(nameof(NameDisplay_NameForm_Initials));
+
+ // v1.5.6: inactive window opacity
+ internal static string Settings_ThemeAndLayout_WindowOpacityInactive_Name => Get(nameof(Settings_ThemeAndLayout_WindowOpacityInactive_Name));
+ internal static string Settings_ThemeAndLayout_WindowOpacityInactive_Description => Get(nameof(Settings_ThemeAndLayout_WindowOpacityInactive_Description));
+
+ // v1.5.6: custom sound volume
+ internal static string Settings_General_CustomSoundVolume_Name => Get(nameof(Settings_General_CustomSoundVolume_Name));
+ internal static string Settings_General_CustomSoundVolume_Description => Get(nameof(Settings_General_CustomSoundVolume_Description));
+
+ // v1.5.6: General tab collapsible section titles (R6)
+ internal static string Settings_Section_Input => Get(nameof(Settings_Section_Input));
+ internal static string Settings_Section_Sound => Get(nameof(Settings_Section_Sound));
+ internal static string Settings_Section_Language => Get(nameof(Settings_Section_Language));
+ internal static string Settings_Section_Performance => Get(nameof(Settings_Section_Performance));
+ internal static string Settings_Section_Sound_TabsHint => Get(nameof(Settings_Section_Sound_TabsHint));
+
+ // v1.5.6: Chat tab collapsible section titles (R6)
+ internal static string Settings_Section_Messages => Get(nameof(Settings_Section_Messages));
+ internal static string Settings_Section_InputPreview => Get(nameof(Settings_Section_InputPreview));
+ internal static string Settings_Section_AutoTellTabs => Get(nameof(Settings_Section_AutoTellTabs));
+ internal static string Settings_Section_Emotes => Get(nameof(Settings_Section_Emotes));
+ internal static string Settings_Section_LinksTooltips => Get(nameof(Settings_Section_LinksTooltips));
+ internal static string Settings_Section_NoviceNetwork => Get(nameof(Settings_Section_NoviceNetwork));
+
+ // v1.5.6: Appearance tab collapsible section titles (R6)
+ internal static string Settings_Section_Theme => Get(nameof(Settings_Section_Theme));
+ internal static string Settings_Section_Fonts => Get(nameof(Settings_Section_Fonts));
+ internal static string Settings_Section_Colours => Get(nameof(Settings_Section_Colours));
+ internal static string Settings_Section_WindowStyle => Get(nameof(Settings_Section_WindowStyle));
+ internal static string Settings_Section_Timestamps => Get(nameof(Settings_Section_Timestamps));
+ internal static string Settings_Section_Animations => Get(nameof(Settings_Section_Animations));
+
+ // v1.5.6: Window tab collapsible section titles (R6)
+ internal static string Settings_Section_Hide => Get(nameof(Settings_Section_Hide));
+ internal static string Settings_Section_InactivityHide => Get(nameof(Settings_Section_InactivityHide));
+ internal static string Settings_Section_Frame => Get(nameof(Settings_Section_Frame));
+
+ // v1.5.6: Tabs tab per-tab-item sub-section titles (R6)
+ internal static string Settings_Section_Tab_Channels => Get(nameof(Settings_Section_Tab_Channels));
+ internal static string Settings_Section_Tab_Display => Get(nameof(Settings_Section_Tab_Display));
+ internal static string Settings_Section_Tab_Notification => Get(nameof(Settings_Section_Tab_Notification));
+ internal static string Settings_Section_Tab_Input => Get(nameof(Settings_Section_Tab_Input));
+ internal static string Settings_Section_Tab_PopOut => Get(nameof(Settings_Section_Tab_PopOut));
+ internal static string Settings_Section_Tab_Volume_AllTabsHint => Get(nameof(Settings_Section_Tab_Volume_AllTabsHint));
+
+ // v1.5.6: About tab collapsible section titles (R6)
+ internal static string Settings_Section_Extensions => Get(nameof(Settings_Section_Extensions));
+ internal static string Settings_Section_PluginInfo => Get(nameof(Settings_Section_PluginInfo));
+ internal static string Settings_Section_Project => Get(nameof(Settings_Section_Project));
+ internal static string Settings_Section_Translators => Get(nameof(Settings_Section_Translators));
+ internal static string Settings_Section_Changelog => Get(nameof(Settings_Section_Changelog));
}
diff --git a/HellionChat/Resources/HellionStrings.ca.resx b/HellionChat/Resources/HellionStrings.ca.resx
index aa9c399..a09c7de 100644
--- a/HellionChat/Resources/HellionStrings.ca.resx
+++ b/HellionChat/Resources/HellionStrings.ca.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privadesa
-
Activa el filtre de privadesa
@@ -24,9 +21,6 @@
El filtre només controla el que s'escriu a la base de dades local. Al registre del xat seguiràs veient cada missatge en directe; els canals exclosos simplement ja no es guarden. Si també vols treure canals de la visualització, utilitza els filtres normals de pestanyes de xat del joc.
-
- Filtre de privadesa i llista blanca
-
Tria quins canals es guarden a la base de dades local. Per defecte segueix la minimització de dades: només les teves pròpies converses. Utilitza els botons de sota per aplicar una configuració predefinida.
@@ -597,18 +591,6 @@
-
- Entrada
-
-
- Àudio & notificacions
-
-
- Rendiment
-
-
- Idioma & ajudes d'entrada
-
@@ -625,32 +607,11 @@
-
- Ocultació
-
-
- Ocultació per inactivitat
-
Marc de la finestra
-
- Informació emergent
-
-
- Auto-Tell-Tabs
-
-
- Comportament dels missatges
-
-
- Previsualització
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Informació de versió
-
-
- Quant a HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Crea i configura pestanyes de xat personalitzades.
-
- Privadesa
-
-
- Filtre de privadesa per canal i el que es pot emmagatzemar.
-
Base de dades
@@ -824,10 +770,10 @@
Emmagatzematge, migració, neteja de dades antigues
- Informació
+ Quant a
- Versió, missió, llicència i changelog.
+ Extensions, versió, informació del projecte, traductors i changelog.
Themes
@@ -868,29 +814,11 @@
Canvia el disseny dels missatges del valor per defecte de files amb targetes a files d'una sola línia `[HH:mm] Remitent: Text`.
-
- Theme & Layout
-
-
- Theme, marc de la finestra i estil de les marques de temps.
-
-
- Fonts & Colors
-
-
- Font, mida de la font i colors del xat per canal.
-
- Gestió de dades
+ Dades i privadesa
- Retenció, neteja, exportació i estadístiques de la base de dades.
-
-
- Integracions
-
-
- Altres plugins de Dalamud amb els quals funciona HellionChat. Integracions pròximes en previsualització.
+ Filtre de privadesa, retenció, neteja, exportació i estadístiques de la base de dades.
Theme
@@ -907,39 +835,12 @@
Quant de transparent és el fons de la finestra. Valors més baixos deixen veure més el joc. Consell: el menú per finestra de Dalamud (hamburguesa a la barra de títol) ofereix substitucions per finestra per a opacitat, desenfocament de fons, clic transparent i fixació; aquestes tenen prioritat sobre aquest control lliscant per a la finestra corresponent.
-
- Fonts
-
-
- Colors del xat
-
-
- Emmagatzematge
-
-
- Retenció
-
-
- Cleanup
-
-
- Export
-
-
- Visualitzador de la base de dades
-
Avançat (Maj+clic per obrir)
-
- Comportament
-
Hellion Chat 1.2.1 ha reorganitzat el menú de configuració i ha eliminat l'antiga opció "Substitueix l'estil" (substituïda pel sistema de themes des de la versió 1.1.0). La resta de la configuració no ha canviat. La transparència de la finestra s'ha migrat a "Theme & Layout". Una còpia de seguretat de la configuració anterior es troba a pluginConfigs/HellionChat.json.pre-v16-backup al costat del HellionChat.json actiu.
-
- Integracions
-
Les integracions de plugins permeten que HellionChat funcioni conjuntament amb altres plugins de Dalamud instal·lats. Cada integració detecta automàticament el seu objectiu i es desactiva silenciosament quan el plugin objectiu no és present.
@@ -1054,4 +955,195 @@
Desactiva la transició de temes, les animacions en passar el cursor per la barra lateral i les targetes, i la pulsació de pestanyes no llegides. Els canvis de tema i els estats de cursor s'apliquen a l'instant.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Entrada
+
+
+ So
+
+
+ Idioma
+
+
+ Rendiment
+
+
+ El so que es reprodueix per pestanya s'estableix a la pestanya Canals.
+
+
+ Tema
+
+
+ Tipus de lletra
+
+
+ Colors
+
+
+ Estil de finestra
+
+
+ Marques de temps
+
+
+ Animacions
+
+
+ Missatges
+
+
+ Entrada i previsualització
+
+
+ Pestanyes de tell automàtic
+
+
+ Emotes
+
+
+ Enllaços i consells
+
+
+ Xarxa de novells
+
+
+ Ocultar
+
+
+ Ocultar quan estigui inactiu
+
+
+ Marc
+
+
+ Canals
+
+
+ Visualització
+
+
+ Notificació
+
+
+ Entrada
+
+
+ Finestra emergent
+
+
+ Aquest volum s'aplica a totes les pestanyes.
+
+
+ Filtre de privacitat
+
+
+ Emmagatzematge
+
+
+ Retenció
+
+
+ Neteja
+
+
+ Exportar
+
+
+ Base de dades
+
+
+ Extensions
+
+
+ Informació del connector
+
+
+ El projecte
+
+
+ Traductors
+
+
+ Registre de canvis
+
+
+ Notifica si el tell falla
+
+
+ Mostra una notificació emergent quan un tell que has enviat no s'ha pogut lliurar (destinatari fora de línia, en una instància o bloquejant-te).
+
+
+ Avisa abans d'enviar símbols exclusius del connector
+
+
+ Mostra un avís quan un missatge que estàs a punt d'enviar conté símbols que només es mostren correctament per als jugadors que utilitzen HellionChat o un connector similar.
+
+
+ Sufix del món
+
+
+ Quan afegir el món d'origen al nom del remitent al registre de xat.
+
+
+ Format del nom
+
+
+ Com es mostren els noms dels remitents al registre de xat. El nom complet és el valor per defecte.
+
+
+ Mai
+
+
+ Només altres móns
+
+
+ Sempre
+
+
+ Nom complet
+
+
+ Només el nom
+
+
+ Inicials
+
+
+ Volum de so personalitzat
+
+
+ Volum de reproducció dels tres sons de notificació personalitzats inclosos. No afecta els 16 sons del joc.
+
+
+ Opacitat de la finestra inactiva
+
+
+ Opacitat del fons de la finestra de xat principal mentre no està enfocada. El control lliscant anterior estableix el valor quan està enfocada. Una substitució per finestra al menú de fixació de Dalamud té prioritat sobre tots dos.
+
+
+ So de notificació
+
+
+ Reprodueix un so quan arriba un missatge a aquesta pestanya mentre estàs mirant una altra. Respecta el commutador de so global.
+
+
+ So
+
+
+ Previsualitza el so seleccionat
+
+
+ So de Hellion
+
+
+ No s'ha pogut lliurar el tell.
+
+
+ No s'ha pogut lliurar el tell a {0}.
+
+
+ Aquest missatge conté símbols exclusius del connector que altres jugadors poden veure com a quadres buits. Prem Retorn de nou per enviar-lo igualment.
+
diff --git a/HellionChat/Resources/HellionStrings.cs.resx b/HellionChat/Resources/HellionStrings.cs.resx
index d4bee19..662019c 100644
--- a/HellionChat/Resources/HellionStrings.cs.resx
+++ b/HellionChat/Resources/HellionStrings.cs.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Soukromí
-
Zapnout filtr soukromí
@@ -24,9 +21,6 @@
Filtr ovlivňuje jen to, co se zapíše do lokální databáze. V chatu se pořád zobrazují všechny zprávy živě, vyloučené kanály se prostě přestanou ukládat. Chceš-li kanály odstranit i z viditelného zobrazení, použij normální filtry chat-záložek ve hře.
-
- Filtr soukromí a whitelist
-
Vyber, které kanály se ukládají do lokální databáze. Výchozí nastavení sleduje minimalizaci dat: pouze tvoje vlastní konverzace. Pomocí tlačítek níže použij předvolbu.
@@ -597,18 +591,6 @@
-
- Vstup
-
-
- Zvuk & oznámení
-
-
- Výkon
-
-
- Jazyk & pomůcky vstupu
-
@@ -625,32 +607,11 @@
-
- Skrývání
-
-
- Skrývání při nečinnosti
-
Rám okna
-
- Nápovědy
-
-
- Auto-Tell-Tabs
-
-
- Chování zpráv
-
-
- Náhled
-
-
- Emoty
-
@@ -672,15 +633,6 @@
-
- Informace o verzi
-
-
- O HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Vytvárej a konfiguruj vlastní chat záložky.
-
- Soukromí
-
-
- Filtr soukromí podle kanálu a co smí být uloženo.
-
Databáze
@@ -824,10 +770,10 @@
Úložiště, migrace, staré čištění
- Informace
+ O pluginu
- Verze, záměr, licence a changelog.
+ Rozšíření, verze, informace o projektu, překladatelé a changelog.
Themes
@@ -868,29 +814,11 @@
Přepne rozvržení zpráv z výchozího karet zpět na jednořádkové `[HH:mm] Odesílatel: Text`.
-
- Theme & Layout
-
-
- Theme, rám okna a styl časových razítek.
-
-
- Fonts & Colours
-
-
- Písmo, velikost písma a barvy chatu podle kanálu.
-
- Správa dat
+ Data a soukromí
- Uchovávání, čištění, export a statistiky databáze.
-
-
- Integrace
-
-
- Ostatní Dalamud pluginy, se kterými HellionChat spolupracuje. Připravované integrace v náhledu.
+ Filtr soukromí, uchovávání, čištění, export a statistiky databáze.
Theme
@@ -907,39 +835,12 @@
Jak průhledné je pozadí okna. Nižší hodnoty nechávají více hry prosvítat. Tip: nabídka Dalamud pro každé okno (hamburger v záhlaví) nabízí přepsání průhlednosti, rozostření pozadí, kliknutí skrz a připnutí pro konkrétní okno: ta mají přednost před tímto posuvníkem pro dané okno.
-
- Písma
-
-
- Barvy chatu
-
-
- Úložiště
-
-
- Uchovávání
-
-
- Čištění
-
-
- Export
-
-
- Prohlížeč databáze
-
Pokročilé (Shift+klik pro otevření)
-
- Chování
-
Hellion Chat 1.2.1 přeorganizoval nabídku nastavení a odstranil starou možnost „Override style" (nahrazenou systémem themes od verze 1.1.0). Zbývající nastavení zůstávají nezměněna. Průhlednost okna byla přesunuta do „Theme & Layout". Záloha předchozí konfigurace se nachází v pluginConfigs/HellionChat.json.pre-v16-backup vedle aktivního HellionChat.json.
-
- Integrace
-
Integrace pluginů umožňují HellionChat spolupracovat s ostatními nainstalovanými Dalamud pluginy. Každá integrace automaticky detekuje svůj cíl a tiše se deaktivuje, když cílový plugin chybí.
@@ -1053,4 +954,195 @@
Vypne prolínání motivů, animace najetí myší na postranní panel a karty a pulzování nepřečtených karet. Změny motivu a stavy najetí myší se použijí okamžitě.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Vstup
+
+
+ Zvuk
+
+
+ Jazyk
+
+
+ Výkon
+
+
+ Zvuk přehrávaný na každé kartě se nastavuje na kartě Kanály.
+
+
+ Motiv
+
+
+ Písma
+
+
+ Barvy
+
+
+ Styl okna
+
+
+ Časová razítka
+
+
+ Animace
+
+
+ Zprávy
+
+
+ Vstup a náhled
+
+
+ Automatické karty pro tell
+
+
+ Emoty
+
+
+ Odkazy a popisky
+
+
+ Síť nováčků
+
+
+ Skrýt
+
+
+ Skrýt při nečinnosti
+
+
+ Rám
+
+
+ Kanály
+
+
+ Zobrazení
+
+
+ Oznámení
+
+
+ Vstup
+
+
+ Vyskakovací okno
+
+
+ Tato hlasitost se vztahuje na všechny karty.
+
+
+ Filtr soukromí
+
+
+ Úložiště
+
+
+ Uchovávání
+
+
+ Čištění
+
+
+ Export
+
+
+ Databáze
+
+
+ Rozšíření
+
+
+ Informace o pluginu
+
+
+ Projekt
+
+
+ Překladatelé
+
+
+ Protokol změn
+
+
+ Upozornit na neúspěšný tell
+
+
+ Zobrazí upozornění, když tell, který jsi odeslal, nebylo možné doručit (příjemce je offline, v instanci nebo tě blokuje).
+
+
+ Varovat před odesláním symbolů pouze pro plugin
+
+
+ Zobrazí varování, když zpráva, kterou se chystá�� odeslat, obsahuje symboly, které se správně zobrazují pouze hráčům s HellionChat nebo podobným pluginem.
+
+
+ Přípona světa
+
+
+ Kdy přidat domovský svět k jménu odesílatele v chatu.
+
+
+ Formát jména
+
+
+ Jak se zobrazují jména odesílatelů v chatovém záznamu. Výchozí je plné jméno.
+
+
+ Nikdy
+
+
+ Pouze jiné světy
+
+
+ Vždy
+
+
+ Celé jméno
+
+
+ Pouze křestní jméno
+
+
+ Iniciály
+
+
+ Hlasitost vlastního zvuku
+
+
+ Hlasitost přehrávání tří přiložených vlastních zvuků oznámení. Neovlivňuje 16 herních zvuků.
+
+
+ Průhlednost neaktivního okna
+
+
+ Průhlednost pozadí hlavního chatovacího okna, když není aktivní. Posuvník výše nastavuje hodnotu pro aktivní okno. Individuální nastavení v nabídce připnutí Dalamud má přednost před oběma.
+
+
+ Zvuk oznámení
+
+
+ Přehraje zvuk, když přijde zpráva na tuto kartu, zatímco se díváš na jinou kartu. Respektuje globální přepínač zvuku.
+
+
+ Zvuk
+
+
+ Zobrazit náhled vybraného zvuku
+
+
+ Hellion zvuk
+
+
+ Tell nebylo možné doručit.
+
+
+ Tell pro {0} nebylo možné doručit.
+
+
+ Tato zpráva obsahuje symboly pouze pro plugin, které ostatní hráči mohou vidět jako prázdné čtverce. Stiskni Enter znovu pro odeslání.
+
diff --git a/HellionChat/Resources/HellionStrings.da.resx b/HellionChat/Resources/HellionStrings.da.resx
index 1a06a22..77d4cdd 100644
--- a/HellionChat/Resources/HellionStrings.da.resx
+++ b/HellionChat/Resources/HellionStrings.da.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privatliv
-
Aktivér privatlivsfilter
@@ -24,9 +21,6 @@
Filteret styrer kun, hvad der skrives til den lokale database. Chat-loggen viser stadig alle beskeder i realtid. Ekskluderede kanaler gemmes blot ikke længere. Hvis du også vil fjerne kanaler fra den synlige visning, skal du bruge spillets normale chat-tab-filtre.
-
- Privatlivsfilter og hvidliste
-
Vælg hvilke kanaler der gemmes til den lokale database. Standard følger dataminimering: kun dine egne samtaler. Brug knapperne nedenfor til at anvende en forudindstilling.
@@ -597,18 +591,6 @@
-
- Input
-
-
- Lyd & notifikationer
-
-
- Ydeevne
-
-
- Sprog & inputhjælp
-
@@ -625,32 +607,11 @@
-
- Skjul
-
-
- Skjul ved inaktivitet
-
Vinduesramme
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Beskedadfærd
-
-
- Forhåndsvisning
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Versionsinfo
-
-
- Om HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Opret og konfigurér brugerdefinerede chat-tabs.
-
- Privatliv
-
-
- Privatlivsfilter pr. kanal og hvad der må gemmes.
-
Database
@@ -824,10 +770,10 @@
Lagring, migration, gammel oprydning
- Information
+ Om
- Version, formål, licens og changelog.
+ Udvidelser, version, projektoplysninger, oversættere og changelog.
Themes
@@ -868,29 +814,11 @@
Skifter beskedlayoutet fra standard kortrækker tilbage til enkeltlinje `[HH:mm] Afsender: Tekst`-rækker.
-
- Theme & Layout
-
-
- Theme, vinduesramme og tidsstempelstil.
-
-
- Skrifttyper & Farver
-
-
- Skrifttype, skriftstørrelse og chatfarver pr. kanal.
-
- Datastyring
+ Data og privatliv
- Opbevaring, oprydning, eksport og databasestatistik.
-
-
- Integrationer
-
-
- Andre Dalamud-plugins som HellionChat arbejder sammen med. Kommende integrationer i forhåndsvisning.
+ Privatlivsfilter, opbevaring, oprydning, eksport og databasestatistik.
Theme
@@ -907,39 +835,12 @@
Hvor gennemsigtigt vinduesbaggrunden er. Lavere værdier lader mere af spillet skinne igennem. Tip: Dalamud's per-vindue-menu (hamburger i titellinjen) tilbyder per-vindue-tilsidesættelser for opacitet, baggrundssløring, klik-igennem og fastgørelse: de har forrang over denne skyderknap for det pågældende vindue.
-
- Skrifttyper
-
-
- Chatfarver
-
-
- Lagring
-
-
- Opbevaring
-
-
- Oprydning
-
-
- Eksport
-
-
- Databasefremviser
-
Avanceret (Shift+klik for at åbne)
-
- Adfærd
-
Hellion Chat 1.2.1 har omorganiseret indstillingsmenuen og fjernet den gamle "Tilsidesæt stil"-indstilling (erstattet af theme-systemet fra 1.1.0). Dine øvrige indstillinger er uændret. Vinduesgennemsigtighed er migreret til "Theme & Layout". En sikkerhedskopi af den forrige konfiguration ligger ved siden af den aktive HellionChat.json som pluginConfigs/HellionChat.json.pre-v16-backup.
-
- Integrationer
-
Plugin-integrationer lader HellionChat arbejde sammen med andre installerede Dalamud-plugins. Hver integration registrerer automatisk sit mål og deaktiverer sig stille, når målplugin'et mangler.
@@ -1053,4 +954,195 @@
Deaktiverer temaovergangen, hover-animationer for sidepanel og kort samt pulseringen af ulæste faner. Temaskift og hover-tilstande anvendes i stedet med det samme.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Input
+
+
+ Lyd
+
+
+ Sprog
+
+
+ Ydeevne
+
+
+ Hvilket lyd der afspilles pr. fane indstilles under fanen Kanaler.
+
+
+ Tema
+
+
+ Skrifttyper
+
+
+ Farver
+
+
+ Vinduesstil
+
+
+ Tidsstempler
+
+
+ Animationer
+
+
+ Beskeder
+
+
+ Input og forhåndsvisning
+
+
+ Auto-tell-faner
+
+
+ Emotes
+
+
+ Links og værktøjstip
+
+
+ Begyndernetværk
+
+
+ Skjul
+
+
+ Skjul ved inaktivitet
+
+
+ Ramme
+
+
+ Kanaler
+
+
+ Visning
+
+
+ Notifikation
+
+
+ Input
+
+
+ Popud-vindue
+
+
+ Denne lydstyrke gælder for alle faner.
+
+
+ Privatlivsfilter
+
+
+ Lager
+
+
+ Opbevaring
+
+
+ Oprydning
+
+
+ Eksport
+
+
+ Database
+
+
+ Udvidelser
+
+
+ Plugin-info
+
+
+ Projektet
+
+
+ Oversættere
+
+
+ Ændringslog
+
+
+ Giv besked ved fejlet tell
+
+
+ Vis en toast-meddelelse, når et tell du sendte ikke kunne leveres (modtageren er offline, i en instans eller blokerer dig).
+
+
+ Advar inden afsendelse af plugin-kun symboler
+
+
+ Vis en advarsel, når en besked du er ved at sende indeholder symboler, der kun vises korrekt for spillere med HellionChat eller et lignende plugin.
+
+
+ Verdenssuffix
+
+
+ Hvornår hjemverdenens navn tilføjes til afsenderens navn i chatkloggen.
+
+
+ Navneformat
+
+
+ Hvordan afsendernavne vises i chatloggen. Fuldt navn er standarden.
+
+
+ Aldrig
+
+
+ Kun andre verdener
+
+
+ Altid
+
+
+ Fuldt navn
+
+
+ Kun fornavn
+
+
+ Initialer
+
+
+ Brugerdefineret lydstyrke
+
+
+ Afspilningsstyrke for de tre medfølgende brugerdefinerede notifikationslyde. Påvirker ikke de 16 spilhyde.
+
+
+ Inaktiv vinduesopacitet
+
+
+ Baggrundsopacitet for det primære chatvindue, mens det ikke er i fokus. Skyderen ovenfor angiver værdien i fokus. En tilsidesættelse per vindue i Dalamud-fastgøringsmenuen har forrang frem for begge.
+
+
+ Notifikationslyd
+
+
+ Afspil en lyd, når en besked ankommer til denne fane, mens du kigger på en anden fane. Respekterer den globale lydkontakt.
+
+
+ Lyd
+
+
+ Forhåndsvis den valgte lyd
+
+
+ Hellion-lyd
+
+
+ Et tell kunne ikke leveres.
+
+
+ Tell til {0} kunne ikke leveres.
+
+
+ Denne besked indeholder plugin-kun symboler, som andre spillere muligvis ser som tomme bokse. Tryk Enter igen for at sende alligevel.
+
diff --git a/HellionChat/Resources/HellionStrings.de.resx b/HellionChat/Resources/HellionStrings.de.resx
index 10fd942..33ae151 100644
--- a/HellionChat/Resources/HellionStrings.de.resx
+++ b/HellionChat/Resources/HellionStrings.de.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Datenschutz
-
Datenschutz-Filter aktivieren
@@ -24,9 +21,6 @@
Der Filter steuert nur, was in die lokale Datenbank geschrieben wird. Im Chat-Log siehst du weiterhin jede Nachricht live, ausgeschlossene Kanäle werden nur nicht mehr gespeichert. Wenn du Kanäle auch aus der sichtbaren Anzeige entfernen willst, nutze die normalen Chat-Tab-Filter im Spiel.
-
- Privacy-Filter und Whitelist
-
Wähle aus, welche Kanäle in die lokale Datenbank gespeichert werden. Standard nach Datensparsamkeit: nur deine eigenen Konversationen. Über die Buttons unten kannst du eine Voreinstellung anwenden.
@@ -597,18 +591,6 @@
-
- Eingabe
-
-
- Audio & Benachrichtigungen
-
-
- Performance
-
-
- Sprache & Eingabe-Hilfen
-
@@ -625,32 +607,11 @@
-
- Verstecken
-
-
- Inaktivitäts-Verstecken
-
Fenster-Rahmen
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Nachrichten-Verhalten
-
-
- Vorschau
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Versionsinfo
-
-
- Über HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Eigene Chat-Tabs anlegen und konfigurieren.
-
- Datenschutz
-
-
- Privacy-Filter pro Channel und was gespeichert werden darf.
-
Datenbank
@@ -824,10 +770,10 @@
Speicher, Migration, alte Bereinigung
- Information
+ Über
- Version, Mission, Lizenz und Changelog.
+ Erweiterungen, Version, Projektinformationen, Übersetzer und Changelog.
Themes
@@ -868,29 +814,11 @@
Schaltet das Message-Layout vom Card-Row-Default zurück auf einzeilige `[HH:mm] Sender: Text` Zeilen.
-
- Theme & Layout
-
-
- Theme, Fenster-Rahmen und Zeitstempel-Style.
-
-
- Schriften & Farben
-
-
- Schriftart, Schriftgröße und Chat-Farben pro Channel.
-
- Daten-Verwaltung
+ Daten & Privatsphäre
- Aufbewahrung, Aufräumen, Export und Datenbank-Statistiken.
-
-
- Integrationen
-
-
- Andere Dalamud-Plugins, mit denen HellionChat zusammenarbeitet. Kommende Integrationen in der Vorschau.
+ Privatsphäre-Filter, Aufbewahrung, Aufräumen, Export und Datenbank-Statistiken.
Theme
@@ -907,39 +835,12 @@
Wie durchsichtig der Fensterhintergrund ist. Niedrigere Werte lassen mehr vom Spiel durchscheinen. Tipp: Dalamud's Per-Window-Menü (Hamburger in der Titelleiste) bietet pro Fenster eigene Overrides für Deckkraft, Hintergrund-Blur, Durchklick und Anpinnen: die haben Vorrang über diesen Slider für das jeweilige Fenster.
-
- Schriftarten
-
-
- Chat-Farben
-
-
- Speicherung
-
-
- Aufbewahrung
-
-
- Cleanup
-
-
- Export
-
-
- Datenbank-Viewer
-
Erweitert (Shift+Klick zum Öffnen)
-
- Verhalten
-
Hellion Chat 1.2.1 hat das Settings-Menü neu sortiert und die alte „Stilüberschreiben"-Option entfernt (überholt durch das Theme-System aus 1.1.0). Deine restlichen Einstellungen bleiben unverändert. Die Fenster-Transparenz ist nach „Theme & Layout" migriert. Ein Backup der vorherigen Config liegt unter pluginConfigs/HellionChat.json.pre-v16-backup neben der aktiven HellionChat.json.
-
- Integrationen
-
Plugin-Integrationen lassen HellionChat mit anderen installierten Dalamud-Plugins zusammenarbeiten. Jede Integration erkennt ihr Ziel automatisch und deaktiviert sich still, wenn das Ziel-Plugin fehlt.
@@ -1048,4 +949,195 @@
Deaktiviert die Theme-Überblendung, die Hover-Animationen von Seitenleiste und Karten sowie das Pulsieren ungelesener Tabs. Theme-Wechsel und Hover-Zustände greifen dann sofort.
+
+
+
+ Eingabe
+
+
+ Audio
+
+
+ Sprache
+
+
+ Performance
+
+
+ Welcher Sound pro Tab abgespielt wird, wird im Kanäle-Tab eingestellt.
+
+
+ Theme
+
+
+ Schriftarten
+
+
+ Farben
+
+
+ Fenster-Stil
+
+
+ Zeitstempel
+
+
+ Animationen
+
+
+ Nachrichten
+
+
+ Eingabe & Vorschau
+
+
+ Auto-Tell-Tabs
+
+
+ Emotes
+
+
+ Links & Tooltips
+
+
+ Anfänger-Netzwerk
+
+
+ Ausblenden
+
+
+ Bei Inaktivität ausblenden
+
+
+ Rahmen
+
+
+ Kanäle
+
+
+ Anzeige
+
+
+ Benachrichtigung
+
+
+ Eingabe
+
+
+ Pop-Out-Fenster
+
+
+ Diese Lautstärke gilt für alle Tabs.
+
+
+ Datenschutz-Filter
+
+
+ Speicherung
+
+
+ Aufbewahrung
+
+
+ Aufräumen
+
+
+ Export
+
+
+ Datenbank
+
+
+ Erweiterungen
+
+
+ Plugin-Info
+
+
+ Das Projekt
+
+
+ Übersetzer
+
+
+ Änderungsprotokoll
+
+
+ Benachrichtigung bei fehlgeschlagenem Tell
+
+
+ Zeigt eine Toast-Meldung an, wenn ein von dir gesendeter Tell nicht zugestellt werden konnte (Empfänger offline, in einer Instanz oder hat dich blockiert).
+
+
+ Warnung vor dem Senden plugin-exklusiver Symbole
+
+
+ Zeigt eine Warnung an, wenn eine Nachricht plugin-exklusive Symbole enthält, die für Spieler ohne HellionChat oder ein ähnliches Plugin als leere Kästchen erscheinen.
+
+
+ Welt-Suffix
+
+
+ Wann der Heimatwelt-Name an den Absendernamen im Chat-Protokoll angehängt wird.
+
+
+ Namensformat
+
+
+ Wie Absendernamen im Chat-Protokoll angezeigt werden. Der vollständige Name ist der Standard.
+
+
+ Nie
+
+
+ Nur andere Welten
+
+
+ Immer
+
+
+ Vollständiger Name
+
+
+ Nur Vorname
+
+
+ Initialen
+
+
+ Eigene Lautstärke
+
+
+ Wiedergabelautstärke für die drei mitgelieferten eigenen Benachrichtigungstöne. Beeinflusst nicht die 16 Spielsounds.
+
+
+ Inaktive Fenster-Deckkraft
+
+
+ Hintergrund-Deckkraft des Haupt-Chat-Fensters, wenn es nicht im Fokus ist. Der Regler darüber legt den Wert im Fokus fest. Eine fensterbasierte Überschreibung im Dalamud-Pinning-Menü hat Vorrang vor beiden Werten.
+
+
+ Benachrichtigungston
+
+
+ Spielt einen Ton ab, wenn eine Nachricht in diesem Tab eintrifft, während du einen anderen Tab anschaust. Respektiert den globalen Sound-Schalter.
+
+
+ Sound
+
+
+ Vorschau des ausgewählten Sounds
+
+
+ Hellion-Sound
+
+
+ Ein Tell konnte nicht zugestellt werden.
+
+
+ Tell an {0} konnte nicht zugestellt werden.
+
+
+ Diese Nachricht enthält plugin-exklusive Symbole, die andere Spieler als leere Kästchen sehen könnten. Drücke Enter erneut, um sie trotzdem zu senden.
+
diff --git a/HellionChat/Resources/HellionStrings.el.resx b/HellionChat/Resources/HellionStrings.el.resx
index 73dda04..5713c5d 100644
--- a/HellionChat/Resources/HellionStrings.el.resx
+++ b/HellionChat/Resources/HellionStrings.el.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Απόρρητο
-
Ενεργοποίηση φίλτρου απορρήτου
@@ -24,9 +21,6 @@
Το φίλτρο ελέγχει μόνο τι αποθηκεύεται στη βάση δεδομένων. Το chat log εξακολουθεί να εμφανίζει κάθε μήνυμα ζωντανά. Τα εξαιρεμένα κανάλια απλώς δεν αποθηκεύονται πλέον. Αν θέλεις να αφαιρέσεις κανάλια και από την ορατή εμφάνιση, χρησιμοποίησε τα κανονικά φίλτρα καρτελών chat στο παιχνίδι.
-
- Φίλτρο απορρήτου και whitelist
-
Επίλεξε ποια κανάλια αποθηκεύονται στη βάση δεδομένων. Η προεπιλογή ακολουθεί την αρχή ελαχιστοποίησης δεδομένων: μόνο οι δικές σου συνομιλίες. Χρησιμοποίησε τα παρακάτω κουμπιά για να εφαρμόσεις κάποια προρύθμιση.
@@ -597,18 +591,6 @@
-
- Εισαγωγή
-
-
- Ήχος & ειδοποιήσεις
-
-
- Απόδοση
-
-
- Γλώσσα & βοηθήματα εισαγωγής
-
@@ -625,32 +607,11 @@
-
- Απόκρυψη
-
-
- Απόκρυψη λόγω αδράνειας
-
Πλαίσιο παραθύρου
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Συμπεριφορά μηνύματος
-
-
- Προεπισκόπηση
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Πληροφορίες έκδοσης
-
-
- Σχετικά με το HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Δημιουργία και ρύθμιση προσαρμοσμένων καρτελών chat.
-
- Απόρρητο
-
-
- Φίλτρο απορρήτου ανά κανάλι και τι επιτρέπεται να αποθηκεύεται.
-
Βάση δεδομένων
@@ -824,10 +770,10 @@
Αποθήκευση, μετεγκατάσταση, παλαιό cleanup
- Πληροφορίες
+ Σχετικά
- Έκδοση, αποστολή, άδεια και changelog.
+ Επεκτάσεις, έκδοση, πληροφορίες έργου, μεταφραστές και changelog.
Themes
@@ -868,29 +814,11 @@
Εναλλάσσει τη διάταξη μηνυμάτων από την προεπιλογή card-row πίσω στις μονόγραμμες σειρές `[HH:mm] Sender: Text`.
-
- Theme & Layout
-
-
- Theme, πλαίσιο παραθύρου και στυλ χρονοσφραγίδας.
-
-
- Γραμματοσειρές & Χρώματα
-
-
- Γραμματοσειρά, μέγεθος και χρώματα chat ανά κανάλι.
-
- Διαχείριση δεδομένων
+ Δεδομένα και απόρρητο
- Διατήρηση, cleanup, εξαγωγή και στατιστικά βάσης δεδομένων.
-
-
- Ενσωματώσεις
-
-
- Άλλα Dalamud plugins με τα οποία συνεργάζεται το HellionChat. Επερχόμενες ενσωματώσεις σε προεπισκόπηση.
+ Φίλτρο απορρήτου, διατήρηση, cleanup, εξαγωγή και στατιστικά βάσης δεδομένων.
Theme
@@ -907,39 +835,12 @@
Πόσο διαφανές είναι το φόντο του παραθύρου. Χαμηλότερες τιμές αφήνουν περισσότερο από το παιχνίδι να φαίνεται. Συμβουλή: το μενού Dalamud ανά παράθυρο (hamburger στη γραμμή τίτλου) προσφέρει ατομικές παρακάμψεις για αδιαφάνεια, θόλωση φόντου, click-through και καρφίτσωμα. Αυτές έχουν προτεραιότητα έναντι αυτού του slider για το αντίστοιχο παράθυρο.
-
- Γραμματοσειρές
-
-
- Χρώματα chat
-
-
- Αποθήκευση
-
-
- Διατήρηση
-
-
- Cleanup
-
-
- Εξαγωγή
-
-
- Viewer βάσης δεδομένων
-
Για προχωρημένους (Shift+κλικ για άνοιγμα)
-
- Συμπεριφορά
-
Το Hellion Chat 1.2.1 αναδιοργάνωσε το μενού ρυθμίσεων και αφαίρεσε την παλιά επιλογή "Override style" (αντικαταστάθηκε από το σύστημα themes από την έκδοση 1.1.0). Οι υπόλοιπες ρυθμίσεις σου παραμένουν αναλλοίωτες. Η διαφάνεια παραθύρου έχει μεταφερθεί στο "Theme & Layout". Αντίγραφο ασφαλείας της προηγούμενης διαμόρφωσης βρίσκεται στο pluginConfigs/HellionChat.json.pre-v16-backup δίπλα στο ενεργό HellionChat.json.
-
- Ενσωματώσεις
-
Οι ενσωματώσεις plugin επιτρέπουν στο HellionChat να συνεργάζεται με άλλα εγκατεστημένα Dalamud plugins. Κάθε ενσωμάτωση ανιχνεύει αυτόματα τον στόχο της και απενεργοποιείται σιωπηλά όταν το plugin-στόχος λείπει.
@@ -1053,4 +954,195 @@
Απενεργοποιεί τη σταδιακή εναλλαγή θεμάτων, τα εφέ αιώρησης στην πλαϊνή μπάρα και τις κάρτες, και την παλμική ένδειξη μη αναγνωσμένων καρτελών. Οι αλλαγές θέματος και οι καταστάσεις αιώρησης εφαρμόζονται άμεσα.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Εισαγωγή
+
+
+ Ήχος
+
+
+ Γλώσσα
+
+
+ Απόδοση
+
+
+ Ο ήχος που αναπαράγεται ανά καρτέλα ορίζεται στην καρτέλα Κανάλια.
+
+
+ Θέμα
+
+
+ Γραμματοσειρές
+
+
+ Χρώματα
+
+
+ Στυλ παραθύρου
+
+
+ Χρονοσημάνσεις
+
+
+ Κινούμενα σχέδια
+
+
+ Μηνύματα
+
+
+ Εισαγωγή & προεπισκόπηση
+
+
+ Αυτόματες καρτέλες tell
+
+
+ Εκφράσεις
+
+
+ Σύνδεσμοι & επεξηγήσεις
+
+
+ Δίκτυο αρχαρίων
+
+
+ Απόκρυψη
+
+
+ Απόκρυψη κατά την αδράνεια
+
+
+ Πλαίσιο
+
+
+ Κανάλια
+
+
+ Εμφάνιση
+
+
+ Ειδοποίηση
+
+
+ Εισαγωγή
+
+
+ Αναδυόμενο παράθυρο
+
+
+ Αυτή η ένταση ισχύει για όλες τις καρτέλες.
+
+
+ Φίλτρο απορρήτου
+
+
+ Αποθήκευση
+
+
+ Διατήρηση
+
+
+ Εκκαθάριση
+
+
+ Εξαγωγή
+
+
+ Βάση δεδομένων
+
+
+ Επεκτάσεις
+
+
+ Πληροφορίες πρόσθετου
+
+
+ Το Έργο
+
+
+ Μεταφραστές
+
+
+ Αρχείο αλλαγών
+
+
+ Ειδοποίηση για αποτυχημένο tell
+
+
+ Εμφανίζει ειδοποίηση όταν ένα tell που έστειλες δεν μπόρεσε να παραδοθεί (ο παραλήπτης είναι εκτός σύνδεσης, σε instance ή σε έχει αποκλείσει).
+
+
+ Προειδοποίηση πριν αποστολή συμβόλων plugin
+
+
+ Εμφανίζει προειδοποίηση όταν έν�� μήνυμα που πρόκειται να στείλεις περιέχει σύμβολα που εμφανίζονται σωστά μόνο για παίκτες με HellionChat ή παρόμοιο plugin.
+
+
+ Επίθημα κόσμου
+
+
+ Πότε να προστεθεί ο αρχικός κόσμος στο όνομα του αποστολέα στο αρχείο καταγραφής chat.
+
+
+ Μορφή ονόματος
+
+
+ Πώς ε��φανίζονται τα ονόματα αποστολέων στο αρχείο καταγραφής chat. Το πλήρες όνομα είναι η προεπιλογή.
+
+
+ Ποτέ
+
+
+ Μόνο άλλοι κόσμοι
+
+
+ Πάντα
+
+
+ Πλήρες όνομα
+
+
+ Μόνο μικρό όνομα
+
+
+ Αρχικά
+
+
+ Προσαρμοσμένη ένταση ήχου
+
+
+ Ένταση αναπαραγωγής για τους τρεις ενσωματωμένους προσαρμοσμένους ήχους ειδοποίησης. Δεν επηρεάζει τους 16 ήχους παιχνιδιού.
+
+
+ Αδιαφάνεια ανενεργού παραθύρου
+
+
+ Αδιαφάνεια φόντου του κύριου παραθύρου chat όταν δεν είναι εστιασμένο. Το ρυθμιστικό από πάνω ορίζει την τιμή για εστιασμένο παράθυρο. Η παράκαμψη ανά παράθυρο στο μενού καρφιτσώματος του Dalamud έχει προτεραιότητα.
+
+
+ Ήχος ειδοποίησης
+
+
+ Αναπαράγει ήχο όταν φτάνει μήνυμα σε αυτή την καρτέλα ενώ κοιτάς άλλη καρτέλα. Σέβεται τον καθολικό διακόπτη ήχου.
+
+
+ Ήχος
+
+
+ Προεπισκόπηση επιλεγμένου ήχου
+
+
+ Ήχος Hellion
+
+
+ Ένα tell δεν μπόρεσε να παραδοθεί.
+
+
+ Το tell προς {0} δεν μπόρεσε να παραδοθεί.
+
+
+ Αυτό το μήνυμα περιέχει σύμβολα plugin που άλλοι παίκτες μπορεί να βλέπουν ως κενά κουτιά. Πιέστε Enter ξανά για αποστολή.
+
diff --git a/HellionChat/Resources/HellionStrings.es.resx b/HellionChat/Resources/HellionStrings.es.resx
index 6cc79b6..9804890 100644
--- a/HellionChat/Resources/HellionStrings.es.resx
+++ b/HellionChat/Resources/HellionStrings.es.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacidad
-
Activar filtro de privacidad
@@ -24,9 +21,6 @@
El filtro solo controla qué se escribe en la base de datos local. El registro de chat sigue mostrando cada mensaje en tiempo real; los canales excluidos simplemente dejan de almacenarse. Si también quieres quitar canales de la vista, usa los filtros de pestañas de chat normales del juego.
-
- Filtro de privacidad y lista blanca
-
Elige qué canales se guardan en la base de datos local. El valor predeterminado sigue la minimización de datos: solo tus propias conversaciones. Usa los botones de abajo para aplicar una configuración predefinida.
@@ -597,18 +591,6 @@
-
- Entrada
-
-
- Audio & notificaciones
-
-
- Rendimiento
-
-
- Idioma & ayudas de entrada
-
@@ -625,32 +607,11 @@
-
- Ocultar
-
-
- Ocultar por inactividad
-
Marco de ventana
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Comportamiento de mensajes
-
-
- Vista previa
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Información de versión
-
-
- Acerca de HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Crea y configura pestañas de chat personalizadas.
-
- Privacidad
-
-
- Filtro de privacidad por canal y qué puede almacenarse.
-
Base de datos
@@ -824,10 +770,10 @@
Almacenamiento, migración, limpieza de datos antiguos
- Información
+ Acerca de
- Versión, misión, licencia y changelog.
+ Extensiones, versión, información del proyecto, traductores y changelog.
Themes
@@ -868,29 +814,11 @@
Cambia el diseño de mensajes del valor predeterminado de filas en tarjeta a filas de una sola línea `[HH:mm] Remitente: Texto`.
-
- Theme & Layout
-
-
- Theme, marco de ventana y estilo de marcas de tiempo.
-
-
- Fuentes & Colores
-
-
- Fuente, tamaño de fuente y colores de chat por canal.
-
- Gestión de datos
+ Datos y privacidad
- Retención, limpieza, exportación y estadísticas de base de datos.
-
-
- Integraciones
-
-
- Otros plugins de Dalamud con los que trabaja HellionChat. Próximas integraciones en vista previa.
+ Filtro de privacidad, retención, limpieza, exportación y estadísticas de base de datos.
Theme
@@ -907,39 +835,12 @@
Qué tan transparente es el fondo de la ventana. Valores más bajos dejan ver más del juego. Consejo: el menú por ventana de Dalamud (hamburguesa en la barra de título) ofrece ajustes individuales de opacidad, desenfoque de fondo, clic sin selección y fijado para cada ventana; esos tienen prioridad sobre este deslizador para la ventana correspondiente.
-
- Fuentes
-
-
- Colores del chat
-
-
- Almacenamiento
-
-
- Retención
-
-
- Limpieza
-
-
- Exportar
-
-
- Visor de base de datos
-
Avanzado (Mayús+clic para abrir)
-
- Comportamiento
-
Hellion Chat 1.2.1 ha reorganizado el menú de ajustes y eliminado la antigua opción "Anular estilo" (reemplazada por el sistema de themes de la versión 1.1.0). El resto de tus ajustes no ha cambiado. La transparencia de ventana se ha migrado a "Theme & Layout". Una copia de seguridad de la configuración anterior se encuentra en pluginConfigs/HellionChat.json.pre-v16-backup junto al HellionChat.json activo.
-
- Integraciones
-
Las integraciones de plugins permiten que HellionChat trabaje junto con otros plugins de Dalamud instalados. Cada integración detecta automáticamente su objetivo y se desactiva silenciosamente cuando el plugin objetivo no está presente.
@@ -1054,4 +955,195 @@
Desactiva la transición de temas, las animaciones al pasar el cursor por la barra lateral y las tarjetas, y el parpadeo de pestañas no leídas. Los cambios de tema y los estados del cursor se aplican al instante.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Entrada
+
+
+ Sonido
+
+
+ Idioma
+
+
+ Rendimiento
+
+
+ El sonido que se reproduce por pestaña se configura en la pestaña Canales.
+
+
+ Tema
+
+
+ Fuentes
+
+
+ Colores
+
+
+ Estilo de ventana
+
+
+ Marcas de tiempo
+
+
+ Animaciones
+
+
+ Mensajes
+
+
+ Entrada y vista previa
+
+
+ Pestañas de tell automático
+
+
+ Emotes
+
+
+ Enlaces y sugerencias
+
+
+ Red de novatos
+
+
+ Ocultar
+
+
+ Ocultar cuando esté inactivo
+
+
+ Marco
+
+
+ Canales
+
+
+ Visualización
+
+
+ Notificación
+
+
+ Entrada
+
+
+ Ventana emergente
+
+
+ Este volumen se aplica a todas las pestañas.
+
+
+ Filtro de privacidad
+
+
+ Almacenamiento
+
+
+ Retención
+
+
+ Limpieza
+
+
+ Exportar
+
+
+ Base de datos
+
+
+ Extensiones
+
+
+ Información del plugin
+
+
+ El proyecto
+
+
+ Traductores
+
+
+ Registro de cambios
+
+
+ Notificar si el tell falla
+
+
+ Muestra una notificación emergente cuando un tell que enviaste no pudo ser entregado (destinatario desconectado, en una instancia o bloqueándote).
+
+
+ Advertir antes de enviar símbolos exclusivos del plugin
+
+
+ Muestra una advertencia cuando un mensaje que estás a punto de enviar contiene símbolos que solo se muestran correctamente para jugadores con HellionChat o un plugin similar.
+
+
+ Sufijo de mundo
+
+
+ Cuándo añadir el mundo de origen al nombre del remitente en el registro de chat.
+
+
+ Formato de nombre
+
+
+ Cómo se muestran los nombres de los remitentes en el registro de chat. El nombre completo es el predeterminado.
+
+
+ Nunca
+
+
+ Solo otros mundos
+
+
+ Siempre
+
+
+ Nombre completo
+
+
+ Solo nombre
+
+
+ Iniciales
+
+
+ Volumen de sonido personalizado
+
+
+ Volumen de reproducción de los tres sonidos de notificación personalizados incluidos. No afecta los 16 sonidos del juego.
+
+
+ Opacidad de ventana inactiva
+
+
+ Opacidad del fondo de la ventana de chat principal mientras no está enfocada. El control deslizante superior establece el valor enfocado. Una anulación por ventana en el menú de anclaje de Dalamud tiene prioridad sobre ambos.
+
+
+ Sonido de notificación
+
+
+ Reproduce un sonido cuando llega un mensaje a esta pestaña mientras ves otra pestaña. Respeta el interruptor de sonido global.
+
+
+ Sonido
+
+
+ Vista previa del sonido seleccionado
+
+
+ Sonido Hellion
+
+
+ No se pudo entregar el tell.
+
+
+ No se pudo entregar el tell a {0}.
+
+
+ Este mensaje contiene símbolos exclusivos del plugin que otros jugadores pueden ver como cuadros vacíos. Presiona Intro de nuevo para enviarlo de todas formas.
+
diff --git a/HellionChat/Resources/HellionStrings.fi.resx b/HellionChat/Resources/HellionStrings.fi.resx
index 953a867..d188844 100644
--- a/HellionChat/Resources/HellionStrings.fi.resx
+++ b/HellionChat/Resources/HellionStrings.fi.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Tietosuoja
-
Ota tietosuojasuodatin käyttöön
@@ -24,9 +21,6 @@
Suodatin hallitsee vain sitä, mitä kirjoitetaan paikalliseen tietokantaan. Chatin loki näyttää edelleen jokaisen viestin reaaliajassa; poissuljetut kanavat yksinkertaisesti lopettavat tallentumisen. Jos haluat myös poistaa kanavia näkyvästä näytöstä, käytä pelin normaaleja chat-välilehtisuodattimia.
-
- Tietosuojasuodatin ja sallittujen lista
-
Valitse, mitkä kanavat tallennetaan paikalliseen tietokantaan. Oletuksena tietojen minimointi: vain omat keskustelusi. Käytä alla olevia painikkeita esiasetuksen valitsemiseksi.
@@ -597,18 +591,6 @@
-
- Syöte
-
-
- Ääni & ilmoitukset
-
-
- Suorituskyky
-
-
- Kieli & syöteapuvälineet
-
@@ -625,32 +607,11 @@
-
- Piilottaminen
-
-
- Piilottaminen käyttämättömyyden vuoksi
-
Ikkunakehys
-
- Työkaluvihjeet
-
-
- Auto-Tell-Tabs
-
-
- Viestien toiminta
-
-
- Esikatselu
-
-
- Emotet
-
@@ -672,15 +633,6 @@
-
- Versiotiedot
-
-
- Tietoja HellionChatista
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Luo ja määritä mukautettuja chat-välilehtiä.
-
- Tietosuoja
-
-
- Tietosuojasuodatin kanavittain ja mitä saa tallentaa.
-
Tietokanta
@@ -827,7 +773,7 @@
Tietoja
- Versio, missio, lisenssi ja changelog.
+ Laajennukset, versio, projektin tiedot, kääntäjät ja changelog.
Teemat
@@ -868,29 +814,11 @@
Vaihtaa viestinasettelun korttirivioletuksesta takaisin yksirivisiin `[HH:mm] Lähettäjä: Teksti` -riveihin.
-
- Teema & asettelu
-
-
- Teema, ikkunakehys ja aikaleimien tyyli.
-
-
- Fontit & värit
-
-
- Fontti, fonttikoko ja chat-värit kanavittain.
-
- Tiedonhallinta
+ Tiedot ja yksityisyys
- Säilytys, siivous, vienti ja tietokantatilastot.
-
-
- Integraatiot
-
-
- Muut Dalamud-lisäosat, joiden kanssa HellionChat toimii yhteistyössä. Tulevat integraatiot esikatselussa.
+ Yksityisyyssuodatin, säilytys, siivous, vienti ja tietokantatilastot.
Teema
@@ -907,39 +835,12 @@
Kuinka läpinäkyvä ikkunan tausta on. Pienemmät arvot näyttävät enemmän peliä läpi. Vinkki: Dalamud-ikkunakohtainen valikko (hampurilaisvalikko otsikkopalkissa) tarjoaa ikkunakohtaiset ohitukset läpinäkyvyydelle, taustan sumenteelle, läpinapsautukselle ja kiinnittämiselle: ne ohittavat tämän liukusäätimen kyseisessä ikkunassa.
-
- Fontit
-
-
- Chat-värit
-
-
- Tallennus
-
-
- Säilytys
-
-
- Siivous
-
-
- Vienti
-
-
- Tietokantaselain
-
Lisäasetukset (Shift+napsauta avataksesi)
-
- Toiminta
-
Hellion Chat 1.2.1 on uudelleenjärjestänyt asetusvalikon ja poistanut vanhan "Ohita tyyli" -vaihtoehdon (korvattu versiossa 1.1.0 esitellyllä teemajärjestelmällä). Muut asetuksesi pysyvät muuttumattomina. Ikkunan läpinäkyvyys on siirretty kohtaan "Teema & asettelu". Varmuuskopio aiemmasta asetustiedostosta löytyy nimellä pluginConfigs/HellionChat.json.pre-v16-backup aktiivisen HellionChat.json-tiedoston vierestä.
-
- Integraatiot
-
Lisäosaintegraatiot mahdollistavat HellionChatin yhteistyön muiden asennettujen Dalamud-lisäosien kanssa. Jokainen integraatio tunnistaa kohteensa automaattisesti ja poistaa itsensä hiljaisesti käytöstä, kun kohdalisäosa puuttuu.
@@ -1053,4 +954,195 @@
Poistaa käytöstä teeman ristihäivytyksen, sivupalkin ja korttien osoitinanimaatiot sekä lukemattomien välilehtien sykkeen. Teeman vaihdot ja osoitintilat tulevat voimaan välittömästi.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Syöte
+
+
+ Ääni
+
+
+ Kieli
+
+
+ Suorituskyky
+
+
+ Kullakin välilehdellä toistettava ääni määritetään Kanavat-välilehdellä.
+
+
+ Teema
+
+
+ Fontit
+
+
+ Värit
+
+
+ Ikkunatyyli
+
+
+ Aikaleimat
+
+
+ Animaatiot
+
+
+ Viestit
+
+
+ Syöte ja esikatselu
+
+
+ Automaattiset tell-välilehdet
+
+
+ Emotet
+
+
+ Linkit ja työkaluvihjeet
+
+
+ Aloittelijaverkosto
+
+
+ Piilota
+
+
+ Piilota käyttämättömänä
+
+
+ Kehys
+
+
+ Kanavat
+
+
+ Näyttö
+
+
+ Ilmoitus
+
+
+ Syöte
+
+
+ Ponnahdusikkuna
+
+
+ Tämä äänenvoimakkuus koskee kaikkia välilehtiä.
+
+
+ Yksityisyyssuodatin
+
+
+ Tallennus
+
+
+ Säilytys
+
+
+ Siivous
+
+
+ Vie
+
+
+ Tietokanta
+
+
+ Laajennukset
+
+
+ Laajennuksen tiedot
+
+
+ Projekti
+
+
+ Kääntäjät
+
+
+ Muutosloki
+
+
+ Ilmoita epäonnistuneesta tellista
+
+
+ Näyttää ilmoituksen, kun lähettämäsi tell ei voitu toimittaa (vastaanottaja offline, instanssissa tai on estänyt sinut).
+
+
+ Varoita ennen plugin-symbolien lähettämistä
+
+
+ Näyttää varoituksen, kun lähetettävä viesti sisältää symboleja, jotka näkyvät oikein vain HellionChat- tai vastaavaa plugin-käyttäville pelaajille.
+
+
+ Maailman jälkiliite
+
+
+ Milloin kotimailman nimi lisätään lähettäjän nimeen chat-lokissa.
+
+
+ Nimimuoto
+
+
+ Miten lähettäjien nimet näytetään chat-lokissa. Koko nimi on oletusasetus.
+
+
+ Ei koskaan
+
+
+ Vain muut maailmat
+
+
+ Aina
+
+
+ Koko nimi
+
+
+ Vain etunimi
+
+
+ Nimikirjaimet
+
+
+ Mukautettu äänenvoimakkuus
+
+
+ Kolmen mukana toimitetun mukautetun ilmoitusäänen toistovoimakkuus. Ei vaikuta 16 pelisoundiin.
+
+
+ Passiivisen ikkunan läpinäkyvyys
+
+
+ Päächat-ikkunan taustan läpinäkyvyys, kun se ei ole aktiivinen. Yläpuolinen liukusäädin asettaa aktiivisen arvon. Dalamud-kiinnitysvalikon ikkunakohtainen ohitus ohittaa molemmat.
+
+
+ Ilmoitusääni
+
+
+ Toistaa äänen, kun välilehteen saapuu viesti, kun katsot toista välilehteä. Noudattaa globaalia äänivaihtajaa.
+
+
+ Ääni
+
+
+ Esikatsele valittua ääntä
+
+
+ Hellion-ääni
+
+
+ Telliä ei voitu toimittaa.
+
+
+ Telliä kohteelle {0} ei voitu toimittaa.
+
+
+ Tämä viesti sisältää plugin-symboleja, jotka muut pelaajat saattavat nähdä tyhjinä ruutuina. Paina Enter uudelleen lähettääksesi joka tapauksessa.
+
diff --git a/HellionChat/Resources/HellionStrings.fr.resx b/HellionChat/Resources/HellionStrings.fr.resx
index e1231cb..2dfe333 100644
--- a/HellionChat/Resources/HellionStrings.fr.resx
+++ b/HellionChat/Resources/HellionStrings.fr.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Confidentialité
-
Activer le filtre de confidentialité
@@ -24,9 +21,6 @@
Le filtre contrôle uniquement ce qui est enregistré dans la base de données locale. Le journal de chat affiche toujours tous les messages en direct ; les canaux exclus ne sont simplement plus enregistrés. Si vous souhaitez également masquer des canaux de l'affichage visible, utilisez les filtres d'onglet de chat habituels du jeu.
-
- Filtre de confidentialité et liste blanche
-
Choisissez quels canaux sont enregistrés dans la base de données locale. Le réglage par défaut suit la minimisation des données : uniquement vos propres conversations. Utilisez les boutons ci-dessous pour appliquer un préréglage.
@@ -597,18 +591,6 @@
-
- Saisie
-
-
- Audio et notifications
-
-
- Performance
-
-
- Langue et aides à la saisie
-
@@ -625,32 +607,11 @@
-
- Masquage
-
-
- Masquage en cas d'inactivité
-
Cadre de la fenêtre
-
- Infobulles
-
-
- Onglets de tell automatiques
-
-
- Comportement des messages
-
-
- Aperçu
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Informations de version
-
-
- À propos de HellionChat
-
-
- Journal des modifications
-
@@ -811,12 +763,6 @@
Créez et configurez des onglets de chat personnalisés.
-
- Confidentialité
-
-
- Filtre de confidentialité par canal et ce qui peut être enregistré.
-
Base de données
@@ -824,10 +770,10 @@
Stockage, migration, nettoyage des données historiques
- Informations
+ À propos
- Version, mission, licence et journal des modifications.
+ Extensions, version, informations du projet, traducteurs et journal des modifications.
Thèmes
@@ -868,29 +814,11 @@
Bascule la mise en page des messages de l'affichage par défaut en carte vers les lignes simples `[HH:mm] Expéditeur : Texte`.
-
- Thème et mise en page
-
-
- Thème, cadre de fenêtre et style d'horodatage.
-
-
- Polices et couleurs
-
-
- Police, taille de police et couleurs de chat par canal.
-
- Gestion des données
+ Données et confidentialité
- Conservation, nettoyage, exportation et statistiques de la base de données.
-
-
- Intégrations
-
-
- Autres plugins Dalamud avec lesquels HellionChat fonctionne. Intégrations à venir en aperçu.
+ Filtre de confidentialité, conservation, nettoyage, exportation et statistiques de la base de données.
Thème
@@ -907,39 +835,12 @@
Niveau de transparence de l'arrière-plan de la fenêtre. Des valeurs basses laissent transparaître davantage le jeu. Astuce : le menu par fenêtre de Dalamud (icône hamburger dans la barre de titre) propose des réglages individuels d'opacité, de flou d'arrière-plan, de transparence aux clics et d'épinglage. Ils ont la priorité sur ce curseur pour la fenêtre concernée.
-
- Polices
-
-
- Couleurs du chat
-
-
- Stockage
-
-
- Conservation
-
-
- Nettoyage
-
-
- Exportation
-
-
- Visualiseur de base de données
-
Avancé (Maj+clic pour ouvrir)
-
- Comportement
-
Hellion Chat 1.2.1 a réorganisé le menu des paramètres et supprimé l'ancienne option « Remplacer le style » (remplacée par le système de thèmes de la 1.1.0). Vos autres paramètres restent inchangés. La transparence de la fenêtre a été migrée vers « Thème et mise en page ». Une sauvegarde de la configuration précédente est disponible dans pluginConfigs/HellionChat.json.pre-v16-backup, à côté du HellionChat.json actif.
-
- Intégrations
-
Les intégrations de plugins permettent à HellionChat de fonctionner avec d'autres plugins Dalamud installés. Chaque intégration détecte automatiquement sa cible et se désactive silencieusement lorsque le plugin cible est absent.
@@ -1054,4 +955,195 @@
Désactive le fondu enchaîné des thèmes, les animations de survol de la barre latérale et des cartes, ainsi que la pulsation des onglets non lus. Les changements de thème et les états de survol s'appliquent alors instantanément.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Saisie
+
+
+ Son
+
+
+ Langue
+
+
+ Performances
+
+
+ Le son joué par onglet se configure dans l'onglet Canaux.
+
+
+ Thème
+
+
+ Polices
+
+
+ Couleurs
+
+
+ Style de fenêtre
+
+
+ Horodatages
+
+
+ Animations
+
+
+ Messages
+
+
+ Saisie et aperçu
+
+
+ Onglets tell automatiques
+
+
+ Emotes
+
+
+ Liens et infobulles
+
+
+ Réseau des novices
+
+
+ Masquer
+
+
+ Masquer en cas d'inactivité
+
+
+ Cadre
+
+
+ Canaux
+
+
+ Affichage
+
+
+ Notification
+
+
+ Saisie
+
+
+ Fenêtre détachée
+
+
+ Ce volume s'applique à tous les onglets.
+
+
+ Filtre de confidentialité
+
+
+ Stockage
+
+
+ Rétention
+
+
+ Nettoyage
+
+
+ Exporter
+
+
+ Base de données
+
+
+ Extensions
+
+
+ Infos du plugin
+
+
+ Le projet
+
+
+ Traducteurs
+
+
+ Journal des modifications
+
+
+ Notifier en cas de Tell échoué
+
+
+ Affiche une notification lorsqu'un Tell que vous avez envoyé n'a pas pu être remis (destinataire hors ligne, dans une instance ou vous bloquant).
+
+
+ Avertir avant d'envoyer des symboles réservés au plugin
+
+
+ Affiche un avertissement lorsqu'un message que vous êtes sur le point d'envoyer contient des symboles qui ne s'affichent correctement que pour les joueurs utilisant HellionChat ou un plugin similaire.
+
+
+ Suffixe de monde
+
+
+ Quand ajouter le monde d'origine au nom de l'expéditeur dans le journal de chat.
+
+
+ Format du nom
+
+
+ Comment les noms des expéditeurs sont affichés dans le journal de chat. Le nom complet est la valeur par défaut.
+
+
+ Jamais
+
+
+ Autres mondes uniquement
+
+
+ Toujours
+
+
+ Nom complet
+
+
+ Prénom uniquement
+
+
+ Initiales
+
+
+ Volume sonore personnalisé
+
+
+ Volume de lecture des trois sons de notification personnalisés inclus. N'affecte pas les 16 sons du jeu.
+
+
+ Opacité de la fenêtre inactive
+
+
+ Opacité de l'arrière-plan de la fenêtre de chat principale lorsqu'elle n'est pas au premier plan. Le curseur ci-dessus définit la valeur en focus. Un remplacement par fenêtre dans le menu d'épinglage de Dalamud a la priorité sur les deux.
+
+
+ Son de notification
+
+
+ Joue un son lorsqu'un message arrive dans cet onglet pendant que vous regardez un autre onglet. Respecte le commutateur de son global.
+
+
+ Son
+
+
+ Aperçu du son sélectionné
+
+
+ Son Hellion
+
+
+ Un Tell n'a pas pu être remis.
+
+
+ Le Tell à {0} n'a pas pu être remis.
+
+
+ Ce message contient des symboles réservés au plugin que d'autres joueurs pourraient voir comme des cases vides. Appuyez à nouveau sur Entrée pour envoyer quand même.
+
diff --git a/HellionChat/Resources/HellionStrings.hu.resx b/HellionChat/Resources/HellionStrings.hu.resx
index 3e13183..9fdfe8b 100644
--- a/HellionChat/Resources/HellionStrings.hu.resx
+++ b/HellionChat/Resources/HellionStrings.hu.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Adatvédelem
-
Adatvédelmi szűrő bekapcsolása
@@ -24,9 +21,6 @@
A szűrő csak azt szabályozza, mi kerül a helyi adatbázisba. A chat-napló továbbra is minden üzenetet élőben mutat; a kizárt csatornák egyszerűen nem tárolódnak tovább. Ha a látható megjelenítésből is el akarod távolítani a csatornákat, használd a játék normál chat-fül szűrőit.
-
- Adatvédelmi szűrő és fehérlista
-
Válaszd ki, mely csatornák mentődjenek a helyi adatbázisba. Az alapértelmezés az adatminimalizálást követi: csak a saját beszélgetéseid. Az előre beállított profilok az alábbi gombokkal alkalmazhatók.
@@ -597,18 +591,6 @@
-
- Bevitel
-
-
- Hang & értesítések
-
-
- Teljesítmény
-
-
- Nyelv & beviteli segítségek
-
@@ -625,32 +607,11 @@
-
- Elrejtés
-
-
- Inaktivitásnál elrejtés
-
Ablakkeret
-
- Eszköztippek
-
-
- Auto-Tell-Tabs
-
-
- Üzenetviselkedés
-
-
- Előnézet
-
-
- Emote-ok
-
@@ -672,15 +633,6 @@
-
- Verzióinformáció
-
-
- A HellionChat-ről
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Egyéni chat-fülek létrehozása és konfigurálása.
-
- Adatvédelem
-
-
- Adatvédelmi szűrő csatornánként és hogy mi tárolható.
-
Adatbázis
@@ -824,10 +770,10 @@
Tárolás, migráció, régi adatok takarítása
- Információ
+ Névjegy
- Verzió, cél, licenc és changelog.
+ Bővítmények, verzió, projektinformációk, fordítók és changelog.
Témák
@@ -868,29 +814,11 @@
Az üzenetelrendezést a kártyasor-alapértelmezettről visszaváltja egyszerű `[HH:mm] Feladó: Szöveg` sorokra.
-
- Theme & Layout
-
-
- Téma, ablakkeret és időbélyeg-stílus.
-
-
- Betűtípusok & Színek
-
-
- Betűtípus, betűméret és csatornánkénti chat-színek.
-
- Adatkezelés
+ Adatok és adatvédelem
- Megőrzés, takarítás, export és adatbázis-statisztikák.
-
-
- Integrációk
-
-
- Más Dalamud-pluginek, amelyekkel a HellionChat együttműködik. Hamarosan érkező integrációk előzetesben.
+ Adatvédelmi szűrő, megőrzés, takarítás, export és adatbázis-statisztikák.
Theme
@@ -907,39 +835,12 @@
Mennyire átlátszó az ablak háttere. Alacsonyabb értékeknél több játék látszik át. Tipp: A Dalamud ablakmenüje (hamburger-ikon a fejlécen) ablakokként kínál felülbírálási lehetőséget az átlátszósághoz, háttér-homályosításhoz, átkattintáshoz és rögzítéshez: ezek felülírják ezt a csúszkát az adott ablaknál.
-
- Betűtípusok
-
-
- Chat-színek
-
-
- Tárolás
-
-
- Megőrzés
-
-
- Takarítás
-
-
- Export
-
-
- Adatbázis-néző
-
Speciális (Shift+kattintás a megnyitáshoz)
-
- Viselkedés
-
A Hellion Chat 1.2.1 átrendezte a beállítások menüt és eltávolította a régi „Stílus felülbírálása" opciót (amelyet az 1.1.0-ban bevezetett témarendszer váltott fel). A többi beállításod változatlan maradt. Az ablak átlátszósága átkerült a „Theme & Layout" menübe. Az előző konfiguráció biztonsági másolata a pluginConfigs/HellionChat.json.pre-v16-backup fájlban található az aktív HellionChat.json mellett.
-
- Integrációk
-
A plugin-integrációk lehetővé teszik, hogy a HellionChat más telepített Dalamud-pluginekkel együttműködjön. Minden integráció automatikusan felismeri a célpluginét, és csendesen letiltja magát, ha a célplugin hiányzik.
@@ -1053,4 +954,195 @@
Letiltja a témák áttűnését, az oldalsáv és a kártyák rámutatási animációit, valamint az olvasatlan lapok pulzálását. A témaváltások és a rámutatási állapotok ehelyett azonnal érvénybe lépnek.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Bevitel
+
+
+ Hang
+
+
+ Nyelv
+
+
+ Teljesítmény
+
+
+ Az egyes lapfülekhez tartozó hangot a Csatornák lapon lehet beállítani.
+
+
+ Téma
+
+
+ Betűtípusok
+
+
+ Színek
+
+
+ Ablakstílus
+
+
+ Időbélyegek
+
+
+ Animációk
+
+
+ Üzenetek
+
+
+ Bevitel és előnézet
+
+
+ Automatikus tell lapfülek
+
+
+ Emote-ok
+
+
+ Hivatkozások és súgóbubborékok
+
+
+ Kezdők hálózata
+
+
+ Elrejtés
+
+
+ Elrejtés inaktivitás esetén
+
+
+ Keret
+
+
+ Csatornák
+
+
+ Megjelenítés
+
+
+ Értesítés
+
+
+ Bevitel
+
+
+ Kiugró ablak
+
+
+ Ez a hangerő az összes lapfülre vonatkozik.
+
+
+ Adatvédelmi szűrő
+
+
+ Tárolás
+
+
+ Megőrzés
+
+
+ Tisztítás
+
+
+ Exportálás
+
+
+ Adatbázis
+
+
+ Bővítmények
+
+
+ Plugin-adatok
+
+
+ A projekt
+
+
+ Fordítók
+
+
+ Változásnapló
+
+
+ Értesítés sikertelen tell esetén
+
+
+ Értesítést jelenít meg, ha az elküldött tell nem kézbesíthető (a címzett offline, példányban van, vagy letiltott).
+
+
+ Figyelmeztetés plugin-kizárólagos szimbólumok küldése előtt
+
+
+ Figyelmeztetést jelenít meg, ha az elküldeni kívánt üzenet olyan szimbólumokat tartalmaz, amelyek csak HellionChat vagy hasonló plugint futtató játékosoknál jelennek meg helyesen.
+
+
+ Világ utótag
+
+
+ Mikor fűzze hozzá az otthoni világ nevét a küldő nevéhez a csevegőnaplóban.
+
+
+ Névadat formátuma
+
+
+ Hogyan jelenjenek meg a küldők nevei a csevegőnaplóban. Az alapértelmezett a teljes név.
+
+
+ Soha
+
+
+ Csak más világok
+
+
+ Mindig
+
+
+ Teljes név
+
+
+ Csak keresztnév
+
+
+ Monogram
+
+
+ Egyedi hangszint
+
+
+ A három beépített egyedi értesítési hang lejátszási hangereje. Nem érinti a 16 játékhangot.
+
+
+ Inaktív ablak átlátszósága
+
+
+ A fő csevegőablak háttérátlátszósága, amikor nincs fókuszban. A fenti csúszka adja meg a fókuszban lévő értéket. A Dalamud rögzítési menüjének ablakonkénti felülbírálása mindkettőnél elsőbbséget élvez.
+
+
+ Értesítési hang
+
+
+ Hangjelzést ad, ha üzenet érkezik erre a fülre, miközben másikat nézel. Tiszteletben tartja a globális hang kapcsolót.
+
+
+ Hang
+
+
+ A kiválasztott hang előnézete
+
+
+ Hellion hang
+
+
+ Egy tell nem kézbesíthető.
+
+
+ A {0} részére küldött tell nem kézbesíthető.
+
+
+ Ez az üzenet plugin-kizárólagos szimbólumokat tartalmaz, amelyeket más játékosok üres négyzetként láthatnak. Nyomd meg ismét az Entert a küldéshez.
+
diff --git a/HellionChat/Resources/HellionStrings.it.resx b/HellionChat/Resources/HellionStrings.it.resx
index 1bb8346..47c1ad3 100644
--- a/HellionChat/Resources/HellionStrings.it.resx
+++ b/HellionChat/Resources/HellionStrings.it.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacy
-
Attiva filtro privacy
@@ -24,9 +21,6 @@
Il filtro controlla solo cosa viene scritto nel database locale. Nel log della chat vedi comunque ogni messaggio in tempo reale; i canali esclusi non vengono semplicemente più salvati. Se vuoi rimuovere canali anche dalla visualizzazione, usa i normali filtri dei tab della chat nel gioco.
-
- Filtro privacy e whitelist
-
Scegli quali canali vengono salvati nel database locale. Il predefinito segue la minimizzazione dei dati: solo le tue conversazioni. Usa i pulsanti in basso per applicare un preset.
@@ -597,18 +591,6 @@
-
- Input
-
-
- Audio & notifiche
-
-
- Prestazioni
-
-
- Lingua & aiuti all'input
-
@@ -625,32 +607,11 @@
-
- Nascondi
-
-
- Nascondi per inattività
-
Cornice finestra
-
- Tooltip
-
-
- Auto-Tell-Tabs
-
-
- Comportamento messaggi
-
-
- Anteprima
-
-
- Emote
-
@@ -672,15 +633,6 @@
-
- Info versione
-
-
- Informazioni su HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Crea e configura tab della chat personalizzati.
-
- Privacy
-
-
- Filtro privacy per canale e cosa può essere salvato.
-
Database
@@ -827,7 +773,7 @@
Informazioni
- Versione, mission, licenza e changelog.
+ Estensioni, versione, informazioni sul progetto, traduttori e changelog.
Themes
@@ -868,29 +814,11 @@
Passa il layout dei messaggi dal predefinito a righe card-row a righe singole `[HH:mm] Mittente: Testo`.
-
- Theme & Layout
-
-
- Theme, cornice finestra e stile timestamp.
-
-
- Font & Colori
-
-
- Font, dimensione font e colori della chat per canale.
-
- Gestione dati
+ Dati e privacy
- Conservazione, pulizia, esportazione e statistiche database.
-
-
- Integrazioni
-
-
- Altri plugin Dalamud con cui HellionChat lavora. Integrazioni future in anteprima.
+ Filtro privacy, conservazione, pulizia, esportazione e statistiche database.
Theme
@@ -907,39 +835,12 @@
Quanto è trasparente lo sfondo della finestra. Valori più bassi lasciano trasparire più gioco. Suggerimento: il menu per finestra di Dalamud (hamburger nella barra del titolo) offre sovrascritture per finestra per opacità, sfocatura sfondo, click-through e blocco: queste hanno la precedenza su questo slider per la rispettiva finestra.
-
- Font
-
-
- Colori della chat
-
-
- Archiviazione
-
-
- Conservazione
-
-
- Pulizia
-
-
- Esporta
-
-
- Visualizzatore database
-
Avanzate (Shift+clic per aprire)
-
- Comportamento
-
Hellion Chat 1.2.1 ha riorganizzato il menu delle impostazioni e rimosso la vecchia opzione "Override style" (sostituita dal sistema theme dalla 1.1.0). Le impostazioni rimanenti sono invariate. La trasparenza della finestra è stata migrata in "Theme & Layout". Un backup della configurazione precedente si trova in pluginConfigs/HellionChat.json.pre-v16-backup accanto al file HellionChat.json attivo.
-
- Integrazioni
-
Le integrazioni con plugin consentono a HellionChat di lavorare insieme ad altri plugin Dalamud installati. Ogni integrazione rileva automaticamente il suo target e si disattiva silenziosamente quando il plugin target è assente.
@@ -1054,4 +955,195 @@
Disattiva la dissolvenza dei temi, le animazioni al passaggio del mouse su barra laterale e schede e la pulsazione delle schede non lette. I cambi di tema e gli stati al passaggio del mouse vengono applicati immediatamente.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Inserimento
+
+
+ Audio
+
+
+ Lingua
+
+
+ Prestazioni
+
+
+ Il suono riprodotto per scheda si imposta nella scheda Canali.
+
+
+ Tema
+
+
+ Caratteri
+
+
+ Colori
+
+
+ Stile finestra
+
+
+ Timestamp
+
+
+ Animazioni
+
+
+ Messaggi
+
+
+ Inserimento e anteprima
+
+
+ Schede tell automatiche
+
+
+ Emote
+
+
+ Link e tooltip
+
+
+ Rete dei novizi
+
+
+ Nascondi
+
+
+ Nascondi quando inattivo
+
+
+ Cornice
+
+
+ Canali
+
+
+ Visualizzazione
+
+
+ Notifica
+
+
+ Inserimento
+
+
+ Finestra pop-out
+
+
+ Questo volume si applica a tutte le schede.
+
+
+ Filtro privacy
+
+
+ Archiviazione
+
+
+ Conservazione
+
+
+ Pulizia
+
+
+ Esportazione
+
+
+ Database
+
+
+ Estensioni
+
+
+ Informazioni plugin
+
+
+ Il progetto
+
+
+ Traduttori
+
+
+ Registro delle modifiche
+
+
+ Notifica per tell fallito
+
+
+ Mostra una notifica quando un tell che hai inviato non può essere consegnato (destinatario offline, in un'istanza o ti ha bloccato).
+
+
+ Avvisa prima di inviare simboli esclusivi del plugin
+
+
+ Mostra un avviso quando un messaggio che stai per inviare contiene simboli che si visualizzano correttamente solo per i giocatori che usano HellionChat o un plugin simile.
+
+
+ Suffisso mondo
+
+
+ Quando aggiungere il mondo di origine al nome del mittente nel registro chat.
+
+
+ Formato del nome
+
+
+ Come vengono mostrati i nomi dei mittenti nel registro chat. Il nome completo è quello predefinito.
+
+
+ Mai
+
+
+ Solo altri mondi
+
+
+ Sempre
+
+
+ Nome completo
+
+
+ Solo nome
+
+
+ Iniziali
+
+
+ Volume suono personalizzato
+
+
+ Volume di riproduzione dei tre suoni di notifica personalizzati inclusi. Non influisce sui 16 suoni di gioco.
+
+
+ Opacità finestra inattiva
+
+
+ Opacità dello sfondo della finestra di chat principale quando non è in primo piano. Il cursore sopra imposta il valore in primo piano. Un'impostazione per finestra nel menu di blocco di Dalamud ha la precedenza su entrambi.
+
+
+ Suono di notifica
+
+
+ Riproduce un suono quando arriva un messaggio in questa scheda mentre stai guardando un'altra scheda. Rispetta l'interruttore audio globale.
+
+
+ Suono
+
+
+ Anteprima del suono selezionato
+
+
+ Suono Hellion
+
+
+ Un tell non può essere consegnato.
+
+
+ Il tell a {0} non può essere consegnato.
+
+
+ Questo messaggio contiene simboli esclusivi del plugin che altri giocatori potrebbero vedere come caselle vuote. Premi Invio di nuovo per inviare comunque.
+
diff --git a/HellionChat/Resources/HellionStrings.ja.resx b/HellionChat/Resources/HellionStrings.ja.resx
index 06527c9..ba2e208 100644
--- a/HellionChat/Resources/HellionStrings.ja.resx
+++ b/HellionChat/Resources/HellionStrings.ja.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- プライバシー
-
プライバシーフィルターを有効にする
@@ -24,9 +21,6 @@
このフィルターはローカルデータベースへの書き込みのみを制御します。チャットログにはすべてのメッセージがリアルタイムで表示され、除外されたチャンネルは保存されなくなるだけです。チャンネルを表示からも除外したい場合は、ゲーム内の通常のチャットタブフィルターをご利用ください。
-
- プライバシーフィルターとホワイトリスト
-
ローカルデータベースに保存するチャンネルを選択してください。デフォルトはデータ最小化の原則に従い、自分の会話のみを保存します。下のボタンでプリセットを適用できます。
@@ -597,18 +591,6 @@
-
- 入力
-
-
- オーディオ & 通知
-
-
- パフォーマンス
-
-
- 言語 & 入力補助
-
@@ -625,32 +607,11 @@
-
- 非表示
-
-
- 非アクティブ時の非表示
-
ウィンドウフレーム
-
- ツールチップ
-
-
- Auto-Tell-Tabs
-
-
- メッセージの動作
-
-
- プレビュー
-
-
- エモート
-
@@ -672,15 +633,6 @@
-
- バージョン情報
-
-
- HellionChat について
-
-
- Changelog
-
@@ -811,12 +763,6 @@
カスタムチャットタブの作成と設定。
-
- プライバシー
-
-
- チャンネル別のプライバシーフィルターと保存可能なデータの設定。
-
データベース
@@ -824,10 +770,10 @@
ストレージ、移行、レガシーのクリーンアップ
- 情報
+ 概要
- バージョン、ミッション、ライセンス、Changelog。
+ 拡張機能、バージョン、プロジェクト情報、翻訳者、Changelog。
テーマ
@@ -868,29 +814,11 @@
メッセージレイアウトをカード行のデフォルトから `[HH:mm] 送信者: テキスト` の1行表示に切り替えます。
-
- テーマ & レイアウト
-
-
- テーマ、ウィンドウフレーム、タイムスタンプのスタイル。
-
-
- フォント & カラー
-
-
- フォント、フォントサイズ、チャンネル別のチャットカラー。
-
- データ管理
+ データとプライバシー
- 保持期間、クリーンアップ、エクスポート、データベース統計。
-
-
- 連携
-
-
- HellionChat と連携する他の Dalamud プラグイン。今後の連携機能のプレビュー。
+ プライバシーフィルター、保持期間、クリーンアップ、エクスポート、データベース統計。
テーマ
@@ -907,39 +835,12 @@
ウィンドウの背景の透明度です。値を下げるとゲームがより多く透けて見えます。ヒント: Dalamud のウィンドウごとのメニュー(タイトルバーのハンバーガーメニュー)では、各ウィンドウの不透明度、背景ブラー、クリックスルー、ピン留めを個別に上書きできます。これらはこのスライダーより優先されます。
-
- フォント
-
-
- チャットカラー
-
-
- ストレージ
-
-
- 保持期間
-
-
- クリーンアップ
-
-
- エクスポート
-
-
- データベースビューアー
-
詳細設定(Shift+クリックで開く)
-
- 動作
-
Hellion Chat 1.2.1 で設定メニューが整理され、古い「スタイルを上書き」オプションが削除されました(1.1.0 のテーマシステムに置き換えられました)。その他の設定は変更されていません。ウィンドウの透明度は「テーマ & レイアウト」に移行されました。以前の設定のバックアップは、アクティブな HellionChat.json の隣に pluginConfigs/HellionChat.json.pre-v16-backup として保存されています。
-
- 連携
-
プラグイン連携により、HellionChat は他のインストール済み Dalamud プラグインと連携できます。各連携は対象プラグインを自動で検出し、対象プラグインがない場合は静かに無効化されます。
@@ -1054,4 +955,195 @@
テーマのクロスフェード、サイドバーとカードのホバーアニメーション、未読タブのパルスを無効にします。テーマの切り替えとホバー状態は即座に適用されます。
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ 入力
+
+
+ サウンド
+
+
+ 言語
+
+
+ パフォーマンス
+
+
+ タブごとに再生されるサウンドは「チャンネル」タブで設定します。
+
+
+ テーマ
+
+
+ フォント
+
+
+ カラー
+
+
+ ウィンドウスタイル
+
+
+ タイムスタンプ
+
+
+ アニメーション
+
+
+ メッセージ
+
+
+ 入力とプレビュー
+
+
+ オートTellタブ
+
+
+ エモート
+
+
+ リンクとツールチップ
+
+
+ ビギナーチャンネル
+
+
+ 非表示
+
+
+ 非アクティブ時に非表示
+
+
+ フレーム
+
+
+ チャンネル
+
+
+ 表示
+
+
+ 通知
+
+
+ 入力
+
+
+ ポップアウトウィンドウ
+
+
+ この音量はすべてのタブに適用されます。
+
+
+ プライバシーフィルター
+
+
+ ストレージ
+
+
+ 保持
+
+
+ クリーンアップ
+
+
+ エクスポート
+
+
+ データベース
+
+
+ 拡張機能
+
+
+ プラグイン情報
+
+
+ プロジェクト
+
+
+ 翻訳者
+
+
+ 変更履歴
+
+
+ テル失敗通知
+
+
+ 送信したテルが届かなかった場合(相手がオフライン、インスタンス内、またはブロックしている場合)にトースト通知を表示します。
+
+
+ プラグイン専用シンボル送信前に警告
+
+
+ 送信しようとしているメッセージに、HellionChatや類似プラグインを使用しているプレイヤーにのみ正しく表示されるシンボルが含まれている場合に警告を表示します。
+
+
+ ワールドサフィックス
+
+
+ チャットログの送信者名にホームワールドを付加するタイミング。
+
+
+ 名前の形式
+
+
+ チャットログでの送信者名の表示形式。デフォルトはフルネームです。
+
+
+ なし
+
+
+ 他ワールドのみ
+
+
+ 常に
+
+
+ フルネーム
+
+
+ 名のみ
+
+
+ イニシャル
+
+
+ カスタム通知音量
+
+
+ 3つの内蔵カスタム通知音の再生音量。16のゲームサウンドには影響しません。
+
+
+ 非アクティブ時の不透明度
+
+
+ フォーカスしていないときのメインチャットウィンドウの背景不透明度。上のスライダーでフォーカス時の値を設定します。Dalamudのウィンドウピン留めメニューのウィンドウごとの設定が優先されます。
+
+
+ 通知音
+
+
+ 別のタブを表示中にこのタブにメッセージが届いた際に音を再生します。グローバルサウンドトグルに従います。
+
+
+ サウンド
+
+
+ 選択したサウンドをプレビュー
+
+
+ Hellionサウンド
+
+
+ テルを届けられませんでした。
+
+
+ {0} へのテルを届けられませんでした。
+
+
+ このメッセージにはプラグイン専用のシンボルが含まれており、他のプレイヤーには空白の箱として表示される可能性があります。Enterを再度押して送信します。
+
diff --git a/HellionChat/Resources/HellionStrings.ko.resx b/HellionChat/Resources/HellionStrings.ko.resx
index c71353f..6130356 100644
--- a/HellionChat/Resources/HellionStrings.ko.resx
+++ b/HellionChat/Resources/HellionStrings.ko.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 개인정보
-
개인정보 필터 사용
@@ -24,9 +21,6 @@
필터는 로컬 데이터베이스에 기록되는 내용만 제어합니다. 채팅 로그에는 모든 메시지가 실시간으로 표시되며, 제외된 채널은 저장되지 않을 뿐입니다. 채널을 화면 표시에서도 제거하려면 게임 내 일반 채팅 탭 필터를 사용하세요.
-
- 개인정보 필터 및 화이트리스트
-
로컬 데이터베이스에 저장할 채널을 선택하세요. 기본값은 데이터 최소화 원칙을 따릅니다. 자신의 대화만 저장됩니다. 아래 버튼으로 프리셋을 적용할 수 있습니다.
@@ -597,18 +591,6 @@
-
- 입력
-
-
- 오디오 & 알림
-
-
- 성능
-
-
- 언어 & 입력 보조
-
@@ -625,32 +607,11 @@
-
- 숨기기
-
-
- 비활성 시 숨기기
-
창 프레임
-
- 툴팁
-
-
- Auto-Tell-Tabs
-
-
- 메시지 동작
-
-
- 미리보기
-
-
- 감정 표현
-
@@ -672,15 +633,6 @@
-
- 버전 정보
-
-
- HellionChat 정보
-
-
- Changelog
-
@@ -811,12 +763,6 @@
사용자 정의 채팅 탭 생성 및 설정.
-
- 개인정보
-
-
- 채널별 개인정보 필터 및 저장 허용 범위.
-
데이터베이스
@@ -824,10 +770,10 @@
저장소, 마이그레이션, 레거시 정리.
- 정보
+ 소개
- 버전, 목적, 라이선스, Changelog.
+ 확장 기능, 버전, 프로젝트 정보, 번역자, Changelog.
테마
@@ -868,29 +814,11 @@
메시지 레이아웃을 카드 행 기본값에서 단일 행 `[HH:mm] Sender: Text` 형식으로 전환합니다.
-
- 테마 & 레이아웃
-
-
- 테마, 창 프레임, 타임스탬프 스타일.
-
-
- 글꼴 & 색상
-
-
- 글꼴, 글꼴 크기, 채널별 채팅 색상.
-
- 데이터 관리
+ 데이터 및 개인 정보
- 보존, 정리, 내보내기, 데이터베이스 통계.
-
-
- 연동
-
-
- HellionChat과 함께 작동하는 다른 Dalamud 플러그인. 예정된 연동 미리보기 포함.
+ 개인 정보 필터, 보존, 정리, 내보내기, 데이터베이스 통계.
테마
@@ -907,39 +835,12 @@
창 배경의 투명도입니다. 값이 낮을수록 게임이 더 많이 비쳐 보입니다. 팁: Dalamud의 창별 메뉴 (제목 표시줄의 햄버거 메뉴)에서 해당 창에 대한 불투명도, 배경 블러, 클릭 통과, 고정 설정을 개별적으로 재정의할 수 있습니다. 이 설정들은 해당 창에 대해 이 슬라이더보다 우선합니다.
-
- 글꼴
-
-
- 채팅 색상
-
-
- 저장소
-
-
- 보존
-
-
- 정리
-
-
- 내보내기
-
-
- 데이터베이스 뷰어
-
고급 설정 (Shift+클릭으로 열기)
-
- 동작
-
Hellion Chat 1.2.1에서 설정 메뉴가 재구성되었으며 기존 "스타일 재정의" 옵션이 제거되었습니다 (1.1.0의 테마 시스템으로 대체됨). 나머지 설정은 변경되지 않았습니다. 창 투명도는 "테마 & 레이아웃"으로 이전되었습니다. 이전 설정의 백업이 활성 HellionChat.json 옆에 pluginConfigs/HellionChat.json.pre-v16-backup으로 저장되어 있습니다.
-
- 연동
-
플러그인 연동을 통해 HellionChat은 설치된 다른 Dalamud 플러그인과 함께 작동합니다. 각 연동은 대상 플러그인을 자동으로 감지하며, 대상 플러그인이 없으면 자동으로 비활성화됩니다.
@@ -1054,4 +955,195 @@
테마 크로스페이드, 사이드바 및 카드 호버 애니메이션, 읽지 않은 탭의 펄스 효과를 비활성화합니다. 테마 전환과 호버 상태가 즉시 적용됩니다.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ 입력
+
+
+ 소리
+
+
+ 언어
+
+
+ 성능
+
+
+ 탭별 재생 사운드는 채널 탭에서 설정합니다.
+
+
+ 테마
+
+
+ 글꼴
+
+
+ 색상
+
+
+ 창 스타일
+
+
+ 타임스탬프
+
+
+ 애니메이션
+
+
+ 메시지
+
+
+ 입력 및 미리 보기
+
+
+ 자동 텔 탭
+
+
+ 감정 표현
+
+
+ 링크 및 툴팁
+
+
+ 초보자 채널
+
+
+ 숨기기
+
+
+ 비활성 시 숨기기
+
+
+ 프레임
+
+
+ 채널
+
+
+ 표시
+
+
+ 알림
+
+
+ 입력
+
+
+ 팝아웃 창
+
+
+ 이 볼륨은 모든 탭에 적용됩니다.
+
+
+ 개인정보 필터
+
+
+ 저장
+
+
+ 보존
+
+
+ 정리
+
+
+ 내보내기
+
+
+ 데이터베이스
+
+
+ 확장
+
+
+ 플러그인 정보
+
+
+ 프로젝트
+
+
+ 번역자
+
+
+ 변경 사항
+
+
+ 실패한 귓속말 알림
+
+
+ 귓속말이 전달되지 않았을 때 (상대방이 오프라인, 인스턴스 내, 또는 차단한 경우) 알림을 표시합니다.
+
+
+ 플러그인 전용 기호 전송 전 경고
+
+
+ 보내려는 메시지에 HellionChat 또는 유사한 플러그인을 사용하는 플레이어에게만 올바르게 표시되는 기��가 포함된 경우 경고를 표시합니다.
+
+
+ 서버 접미사
+
+
+ 채팅 로그에서 발신자 이름에 홈 서버를 추가할 시기.
+
+
+ 이름 형식
+
+
+ 채팅 로그에서 발신자 이름이 표시되는 방식. 기본값은 전체 이름입니다.
+
+
+ 안 함
+
+
+ 다른 서버만
+
+
+ 항상
+
+
+ 전체 이름
+
+
+ 이름만
+
+
+ 이니셜
+
+
+ 사용자 지정 소리 볼륨
+
+
+ 세 가지 내장 사용자 지정 알림 소리의 재생 볼륨. 게임 16개 소��에는 영향을 미치지 않습니다.
+
+
+ 비활성 창 불투명도
+
+
+ 포커스되지 않은 상태에서 메인 채팅 창의 배경 불투명도. 위의 슬라이더는 포커스된 값을 설정합니다. Dalamud 창 고정 메뉴의 창별 재정의가 우선합니다.
+
+
+ 알림 소리
+
+
+ 다른 탭을 보는 동안 이 탭에 메시지가 도착하면 소리를 재생합니다. 전역 소리 토글을 따릅니다.
+
+
+ 소리
+
+
+ 선택한 소리 미리 듣기
+
+
+ Hellion 소리
+
+
+ 귓속말을 전달하지 못했습니다.
+
+
+ {0}에게 귓속말을 전달하지 못했습니다.
+
+
+ 이 메시지에는 다른 플레이어에게 빈 박스로 보일 수 있는 플러그인 전용 기호가 포함되어 있습니다. Enter를 다시 눌러 전송합니다.
+
diff --git a/HellionChat/Resources/HellionStrings.nb.resx b/HellionChat/Resources/HellionStrings.nb.resx
index 9103a67..066a40d 100644
--- a/HellionChat/Resources/HellionStrings.nb.resx
+++ b/HellionChat/Resources/HellionStrings.nb.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Personvern
-
Aktiver personvernfilter
@@ -24,9 +21,6 @@
Filteret styrer kun hva som skrives til den lokale databasen. Chat-loggen viser fremdeles alle meldinger live. Ekskluderte kanaler lagres simpelthen ikke lenger. Vil du også fjerne kanaler fra den synlige visningen, bruker du de vanlige chat-fane-filtrene i spillet.
-
- Personvernfilter og hviteliste
-
Velg hvilke kanaler som lagres i den lokale databasen. Standard følger dataminimering: kun dine egne samtaler. Bruk knappene nedenfor for å bruke en forhåndsinnstilling.
@@ -597,18 +591,6 @@
-
- Inndata
-
-
- Lyd & varsler
-
-
- Ytelse
-
-
- Språk & inndatahjelp
-
@@ -625,32 +607,11 @@
-
- Skjuling
-
-
- Skjuling ved inaktivitet
-
Vindusramme
-
- Verktøytips
-
-
- Auto-Tell-Tabs
-
-
- Meldingsoppførsel
-
-
- Forhåndsvisning
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Versjonsinformasjon
-
-
- Om HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Opprett og konfigurer egendefinerte chat-faner.
-
- Personvern
-
-
- Personvernfilter per kanal og hva som kan lagres.
-
Database
@@ -824,10 +770,10 @@
Lagring, migrering, eldre opprydding
- Informasjon
+ Om
- Versjon, formål, lisens og changelog.
+ Utvidelser, versjon, prosjektinformasjon, oversettere og changelog.
Themes
@@ -868,29 +814,11 @@
Bytter meldingsoppsettet fra standard kortrader tilbake til enkeltlinje `[HH:mm] Avsender: Tekst`-rader.
-
- Theme & Layout
-
-
- Theme, vindusramme og tidsstempelstil.
-
-
- Skrifttyper & farger
-
-
- Skrifttype, skriftstørrelse og chat-farger per kanal.
-
- Databehandling
+ Data og personvern
- Oppbevaring, opprydding, eksport og databasestatistikk.
-
-
- Integrasjoner
-
-
- Andre Dalamud-plugins som HellionChat samarbeider med. Kommende integrasjoner i forhåndsvisning.
+ Personvernfilter, oppbevaring, opprydding, eksport og databasestatistikk.
Theme
@@ -907,39 +835,12 @@
Hvor gjennomsiktig vindusbakgrunnen er. Lavere verdier lar mer av spillet synes gjennom. Tips: Dalamud sin per-vindu-meny (hamburgermeny i tittellinjen) tilbyr per-vindu-overstyringer for opasitet, bakgrunnsuskarphet, klikk-gjennom og festing. Disse har forrang over denne skyveknappen for det respektive vinduet.
-
- Skrifttyper
-
-
- Chat-farger
-
-
- Lagring
-
-
- Oppbevaring
-
-
- Opprydding
-
-
- Eksport
-
-
- Databasevisning
-
Avansert (Shift+klikk for å åpne)
-
- Oppførsel
-
Hellion Chat 1.2.1 har reorganisert innstillingsmenyen og fjernet det gamle "Overstyr stil"-alternativet (erstattet av theme-systemet fra 1.1.0). Øvrige innstillinger er uendret. Vindustransparens er migrert til "Theme & Layout". En sikkerhetskopi av forrige konfig ligger under pluginConfigs/HellionChat.json.pre-v16-backup ved siden av den aktive HellionChat.json.
-
- Integrasjoner
-
Plugin-integrasjoner lar HellionChat samarbeide med andre installerte Dalamud-plugins. Hver integrasjon oppdager automatisk målet sitt og deaktiverer seg stille når mål-pluginen mangler.
@@ -1053,4 +954,195 @@
Deaktiverer temaovergangen, hover-animasjoner for sidepanel og kort samt pulseringen av uleste faner. Temabytter og hover-tilstander brukes i stedet umiddelbart.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Input
+
+
+ Lyd
+
+
+ Språk
+
+
+ Ytelse
+
+
+ Lyden som spilles per fane, angis i fanen Kanaler.
+
+
+ Tema
+
+
+ Skrifter
+
+
+ Farger
+
+
+ Vindusstil
+
+
+ Tidsstempler
+
+
+ Animasjoner
+
+
+ Meldinger
+
+
+ Input og forhåndsvisning
+
+
+ Automatiske tell-faner
+
+
+ Emotes
+
+
+ Lenker og verktøytips
+
+
+ Nybegynnernettverk
+
+
+ Skjul
+
+
+ Skjul ved inaktivitet
+
+
+ Ramme
+
+
+ Kanaler
+
+
+ Visning
+
+
+ Varsling
+
+
+ Input
+
+
+ Utskilt vindu
+
+
+ Denne lydstyrken gjelder for alle faner.
+
+
+ Personvernfilter
+
+
+ Lagring
+
+
+ Oppbevaring
+
+
+ Opprydding
+
+
+ Eksport
+
+
+ Database
+
+
+ Utvidelser
+
+
+ Plugin-info
+
+
+ Prosjektet
+
+
+ Oversettere
+
+
+ Endringslogg
+
+
+ Varsle om mislykket tell
+
+
+ Viser et toast-varsel når et tell du sendte ikke kunne leveres (mottakeren er offline, i en instans eller blokkerer deg).
+
+
+ Advar før sending av plugin-eksklusiv symboler
+
+
+ Viser en advarsel når en melding du er i ferd med å sende inneholder symboler som kun vises riktig for spillere som kjører HellionChat eller et lignende plugin.
+
+
+ Verdenssuffiks
+
+
+ Når hjemverdensnavnet legges til avsendernavnet i chattloggen.
+
+
+ Navneformat
+
+
+ Hvordan avsendernavn vises i chattloggen. Fullt navn er standard.
+
+
+ Aldri
+
+
+ Kun andre verdener
+
+
+ Alltid
+
+
+ Fullt navn
+
+
+ Kun fornavn
+
+
+ Initialer
+
+
+ Egendefinert lydstyrke
+
+
+ Avspillingsstyrke for de tre medfølgende egendefinerte varselslydene. Påvirker ikke de 16 spillydene.
+
+
+ Inaktiv vinduopasitet
+
+
+ Bakgrunnsopasitet for det primære chattvinduet mens det ikke er i fokus. Glidebryteren over angir fokusert verdi. En overstyringsinnstilling per vindu i Dalamud-festmenyen har forrang fremfor begge.
+
+
+ Varsellyd
+
+
+ Spiller av en lyd når en melding ankommer denne fanen mens du ser på en annen fane. Respekterer den globale lydvekselen.
+
+
+ Lyd
+
+
+ Forhåndsvis valgt lyd
+
+
+ Hellion-lyd
+
+
+ Et tell kunne ikke leveres.
+
+
+ Tell til {0} kunne ikke leveres.
+
+
+ Denne meldingen inneholder plugin-eksklusive symboler som andre spillere kanskje ser som tomme bokser. Trykk Enter igjen for å sende likevel.
+
diff --git a/HellionChat/Resources/HellionStrings.nl.resx b/HellionChat/Resources/HellionStrings.nl.resx
index d0ce217..9c83184 100644
--- a/HellionChat/Resources/HellionStrings.nl.resx
+++ b/HellionChat/Resources/HellionStrings.nl.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacy
-
Privacyfilter inschakelen
@@ -24,9 +21,6 @@
Het filter bepaalt alleen wat er in de lokale database wordt geschreven. In het chatlogboek zie je nog steeds elk bericht live; uitgesloten kanalen worden gewoon niet meer opgeslagen. Als je kanalen ook uit de zichtbare weergave wilt verwijderen, gebruik dan de normale chat-tabfilters in het spel.
-
- Privacyfilter en whitelist
-
Kies welke kanalen worden opgeslagen in de lokale database. Standaard volgt dataminimalisatie: alleen je eigen gesprekken. Gebruik de knoppen hieronder om een voorinstelling toe te passen.
@@ -597,18 +591,6 @@
-
- Invoer
-
-
- Audio & meldingen
-
-
- Prestaties
-
-
- Taal & invoerhulpmiddelen
-
@@ -625,32 +607,11 @@
-
- Verbergen
-
-
- Verbergen bij inactiviteit
-
Vensterkader
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Berichtgedrag
-
-
- Voorbeeld
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Versie-informatie
-
-
- Over HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Aangepaste chattabbladen aanmaken en configureren.
-
- Privacy
-
-
- Privacyfilter per kanaal en wat er opgeslagen mag worden.
-
Database
@@ -824,10 +770,10 @@
Opslag, migratie, verouderde opschoning
- Informatie
+ Over
- Versie, missie, licentie en changelog.
+ Extensies, versie, projectinformatie, vertalers en changelog.
Themes
@@ -868,29 +814,11 @@
Schakelt de berichtweergave terug van de standaard kaartindeling naar enkelvoudige regels `[HH:mm] Afzender: Tekst`.
-
- Theme & Layout
-
-
- Theme, vensterkader en tijdstempelstijl.
-
-
- Lettertypen & Kleuren
-
-
- Lettertype, lettergrootte en chatkleuren per kanaal.
-
- Gegevensbeheer
+ Gegevens en privacy
- Retentie, opschoning, export en databasestatistieken.
-
-
- Integraties
-
-
- Andere Dalamud-plugins waarmee HellionChat samenwerkt. Aankomende integraties als voorbeeld.
+ Privacyfilter, retentie, opschoning, export en databasestatistieken.
Theme
@@ -907,39 +835,12 @@
Hoe transparant de vensterachtergrond is. Lagere waarden laten meer van het spel doorschijnen. Tip: het Dalamud per-venstermenu (hamburger in de titelbalk) biedt per venster eigen instellingen voor dekking, achtergrondvervaging, klikdoorloop en vastpinnen: die hebben voorrang op deze schuifregelaar voor het betreffende venster.
-
- Lettertypen
-
-
- Chatkleuren
-
-
- Opslag
-
-
- Retentie
-
-
- Opschoning
-
-
- Export
-
-
- Databaseviewer
-
Geavanceerd (Shift+klik om te openen)
-
- Gedrag
-
Hellion Chat 1.2.1 heeft het instellingenmenu opnieuw ingedeeld en de oude optie "Stijl overschrijven" verwijderd (vervangen door het themasysteem uit 1.1.0). Je overige instellingen zijn ongewijzigd. Venstertransparantie is verplaatst naar "Theme & Layout". Een back-up van de vorige configuratie staat bij pluginConfigs/HellionChat.json.pre-v16-backup naast de actieve HellionChat.json.
-
- Integraties
-
Plugin-integraties laten HellionChat samenwerken met andere geïnstalleerde Dalamud-plugins. Elke integratie detecteert automatisch zijn doelplugin en schakelt zichzelf stil uit als die ontbreekt.
@@ -1054,4 +955,195 @@
Schakelt de themaovergang, de hover-animaties van de zijbalk en kaarten, en het pulseren van ongelezen tabbladen uit. Themawissels en hover-statussen worden in plaats daarvan direct toegepast.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Invoer
+
+
+ Geluid
+
+
+ Taal
+
+
+ Prestaties
+
+
+ Welk geluid per tabblad speelt, wordt ingesteld in het tabblad Kanalen.
+
+
+ Thema
+
+
+ Lettertypen
+
+
+ Kleuren
+
+
+ Vensterstijl
+
+
+ Tijdstempels
+
+
+ Animaties
+
+
+ Berichten
+
+
+ Invoer en voorbeeld
+
+
+ Automatische tell-tabbladen
+
+
+ Emotes
+
+
+ Links en tooltips
+
+
+ Beginners netwerk
+
+
+ Verbergen
+
+
+ Verbergen bij inactiviteit
+
+
+ Kader
+
+
+ Kanalen
+
+
+ Weergave
+
+
+ Melding
+
+
+ Invoer
+
+
+ Pop-outvenster
+
+
+ Dit volume geldt voor alle tabbladen.
+
+
+ Privacyfilter
+
+
+ Opslag
+
+
+ Bewaring
+
+
+ Opruimen
+
+
+ Exporteren
+
+
+ Database
+
+
+ Extensies
+
+
+ Plugin-info
+
+
+ Het project
+
+
+ Vertalers
+
+
+ Wijzigingenlog
+
+
+ Melden bij mislukte tell
+
+
+ Toont een melding wanneer een tell die je stuurde niet kon worden bezorgd (ontvanger offline, in een instantie of blokkeert je).
+
+
+ Waarschuwen voor verzenden van plugin-exclusieve symbolen
+
+
+ Toont een waarschuwing wanneer een bericht dat je op het punt staat te verzenden symbolen bevat die alleen correct worden weergegeven voor spelers die HellionChat of een vergelijkbare plugin gebruiken.
+
+
+ Wereldachtervoegsel
+
+
+ Wanneer de thuiswereld wordt toegevoegd aan de naam van de afzender in het chatlogboek.
+
+
+ Naamformaat
+
+
+ Hoe afzendernamen worden weergegeven in het chatlogboek. De volledige naam is de standaard.
+
+
+ Nooit
+
+
+ Alleen andere werelden
+
+
+ Altijd
+
+
+ Volledige naam
+
+
+ Alleen voornaam
+
+
+ Initialen
+
+
+ Aangepast geluidsvolume
+
+
+ Afspeelvolume voor de drie meegeleverde aangepaste meldingsgeluiden. Heeft geen invloed op de 16 spelgeluiden.
+
+
+ Inactieve vensteropaciteit
+
+
+ Achtergrondopaciteit van het hoofdchatvenster terwijl het niet gefocust is. De schuifregelaar hierboven stelt de gefocuste waarde in. Een vensterspecifieke overschrijving in het Dalamud-pinningsmenu heeft voorrang boven beide.
+
+
+ Meldingsgeluid
+
+
+ Speelt een geluid af wanneer een bericht in dit tabblad aankomt terwijl je naar een ander tabblad kijkt. Respecteert de globale geluidsschakelaar.
+
+
+ Geluid
+
+
+ Voorbeeld van het geselecteerde geluid
+
+
+ Hellion-geluid
+
+
+ Een tell kon niet worden bezorgd.
+
+
+ Tell aan {0} kon niet worden bezorgd.
+
+
+ Dit bericht bevat plugin-exclusieve symbolen die andere spelers mogelijk als lege vakjes zien. Druk opnieuw op Enter om toch te verzenden.
+
diff --git a/HellionChat/Resources/HellionStrings.pl.resx b/HellionChat/Resources/HellionStrings.pl.resx
index 7c4fb71..1cc4933 100644
--- a/HellionChat/Resources/HellionStrings.pl.resx
+++ b/HellionChat/Resources/HellionStrings.pl.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Prywatność
-
Włącz filtr prywatności
@@ -24,9 +21,6 @@
Filtr kontroluje wyłącznie to, co trafia do lokalnej bazy danych. W logu czatu nadal widzisz każdą wiadomość na żywo; wykluczone kanały są po prostu przestają być zapisywane. Jeśli chcesz też usunąć kanały z widocznego widoku, użyj standardowych filtrów zakładek czatu w grze.
-
- Filtr prywatności i lista dozwolonych
-
Wybierz, które kanały są zapisywane do lokalnej bazy danych. Domyślnie stosowana jest minimalizacja danych: tylko twoje własne rozmowy. Użyj przycisków poniżej, aby zastosować gotowe ustawienie.
@@ -597,18 +591,6 @@
-
- Wprowadzanie
-
-
- Audio & powiadomienia
-
-
- Wydajność
-
-
- Język & pomoce wprowadzania
-
@@ -625,32 +607,11 @@
-
- Ukrywanie
-
-
- Ukrywanie przy braku aktywności
-
Ramka okna
-
- Podpowiedzi
-
-
- Auto-Tell-Tabs
-
-
- Zachowanie wiadomości
-
-
- Podgląd
-
-
- Emoty
-
@@ -672,15 +633,6 @@
-
- Informacje o wersji
-
-
- O HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Twórz i konfiguruj niestandardowe zakładki czatu.
-
- Prywatność
-
-
- Filtr prywatności według kanałów i co może być zapisywane.
-
Baza danych
@@ -824,10 +770,10 @@
Przechowywanie, migracja, stare czyszczenie
- Informacje
+ O wtyczce
- Wersja, misja, licencja i changelog.
+ Rozszerzenia, wersja, informacje o projekcie, tłumacze i changelog.
Motywy
@@ -868,29 +814,11 @@
Przełącza układ wiadomości z domyślnego widoku kart z powrotem na jednoliniowe wiersze `[HH:mm] Nadawca: Tekst`.
-
- Theme & Layout
-
-
- Motyw, ramka okna i styl znaczników czasu.
-
-
- Czcionki & Kolory
-
-
- Czcionka, rozmiar czcionki i kolory czatu według kanałów.
-
- Zarządzanie danymi
+ Dane i prywatność
- Przechowywanie, czyszczenie, eksport i statystyki bazy danych.
-
-
- Integracje
-
-
- Inne pluginy Dalamud, z którymi współpracuje HellionChat. Nadchodzące integracje w podglądzie.
+ Filtr prywatności, przechowywanie, czyszczenie, eksport i statystyki bazy danych.
Theme
@@ -907,39 +835,12 @@
Stopień przezroczystości tła okna. Niższe wartości pozwalają przeświecać większej części gry. Wskazówka: menu Dalamud dla każdego okna (hamburger na pasku tytułu) oferuje indywidualne ustawienia przezroczystości, rozmycia tła, klikania przez okno i przypinania dla każdego okna: mają one pierwszeństwo przed tym suwakiem dla danego okna.
-
- Czcionki
-
-
- Kolory czatu
-
-
- Przechowywanie
-
-
- Retencja
-
-
- Czyszczenie
-
-
- Eksport
-
-
- Przeglądarka bazy danych
-
Zaawansowane (Shift+kliknięcie, aby otworzyć)
-
- Zachowanie
-
Hellion Chat 1.2.1 przeorganizował menu ustawień i usunął starą opcję „Override style" (zastąpioną przez system motywów z wersji 1.1.0). Pozostałe ustawienia pozostają bez zmian. Przezroczystość okna została przeniesiona do „Theme & Layout". Kopia zapasowa poprzedniej konfiguracji znajduje się w pluginConfigs/HellionChat.json.pre-v16-backup obok aktywnego HellionChat.json.
-
- Integracje
-
Integracje z pluginami pozwalają HellionChat współpracować z innymi zainstalowanymi pluginami Dalamud. Każda integracja automatycznie wykrywa swój cel i cicho się wyłącza, gdy docelowy plugin jest niedostępny.
@@ -1053,4 +954,195 @@
Wyłącza płynne przejścia motywów, animacje najechania kursorem na pasek boczny i karty oraz pulsowanie nieprzeczytanych kart. Zmiany motywu i stany najechania są wtedy stosowane natychmiast.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Wejście
+
+
+ Dźwięk
+
+
+ Język
+
+
+ Wydajność
+
+
+ Dźwięk odtwarzany na każdej karcie ustawia się w karcie Kanały.
+
+
+ Motyw
+
+
+ Czcionki
+
+
+ Kolory
+
+
+ Styl okna
+
+
+ Znaczniki czasu
+
+
+ Animacje
+
+
+ Wiadomości
+
+
+ Wejście i podgląd
+
+
+ Automatyczne karty tell
+
+
+ Emotki
+
+
+ Linki i podpowiedzi
+
+
+ Sieć nowicjuszy
+
+
+ Ukryj
+
+
+ Ukryj przy bezczynności
+
+
+ Ramka
+
+
+ Kanały
+
+
+ Wyświetlanie
+
+
+ Powiadomienie
+
+
+ Wejście
+
+
+ Okno wyskakujące
+
+
+ Ta głośność dotyczy wszystkich kart.
+
+
+ Filtr prywatności
+
+
+ Przechowywanie
+
+
+ Przechowywanie
+
+
+ Czyszczenie
+
+
+ Eksport
+
+
+ Baza danych
+
+
+ Rozszerzenia
+
+
+ Informacje o wtyczce
+
+
+ Projekt
+
+
+ Tłumacze
+
+
+ Dziennik zmian
+
+
+ Powiadamiaj o nieudanym tell
+
+
+ Wyświetla powiadomienie, gdy wysłany przez ciebie tell nie mógł zostać dostarczony (odbiorca offline, w instancji lub cię zablokował).
+
+
+ Ostrzeżenie przed wysłaniem symboli tylko dla wtyczki
+
+
+ Wyświetla ostrzeżenie, gdy wiadomość, którą zamierzasz wysłać, zawiera symbole widoczne poprawnie tylko dla graczy korzystających z HellionChat lub podobnej wtyczki.
+
+
+ Sufiks świata
+
+
+ Kiedy dodawać nazwę macierzystego świata do nazwy nadawcy w dzienniku czatu.
+
+
+ Format nazwy
+
+
+ Jak nazwy nadawców są wyświetlane w dzienniku czatu. Pełna nazwa jest domyślna.
+
+
+ Nigdy
+
+
+ Tylko inne światy
+
+
+ Zawsze
+
+
+ Pełna nazwa
+
+
+ Tylko imię
+
+
+ Inicjały
+
+
+ Własna głośność dźwięku
+
+
+ Głośność odtwarzania trzech dołączonych własnych dźwięków powiadomień. Nie wpływa na 16 dźwięków gry.
+
+
+ Nieprzezroczystość nieaktywnego okna
+
+
+ Nieprzezroczystość tła głównego okna czatu, gdy nie jest aktywne. Suwak powyżej ustawia wartość dla aktywnego okna. Indywidualne ustawienie w menu przypinania Dalamud ma pierwszeństwo przed obydwoma.
+
+
+ Dźwięk powiadomienia
+
+
+ Odtwarza dźwięk, gdy wiadomość przybywa na tę kartę, gdy patrzysz na inną kartę. Respektuje globalny przełącznik dźwięku.
+
+
+ Dźwięk
+
+
+ Podgląd wybranego dźwięku
+
+
+ Dźwięk Hellion
+
+
+ Tell nie mógł zostać dostarczony.
+
+
+ Tell do {0} nie mógł zostać dostarczony.
+
+
+ Ta wiadomość zawiera symbole tylko dla wtyczki, które inni gracze mogą widzieć jako puste kwadraty. Naciśnij Enter ponownie, aby wysłać mimo to.
+
diff --git a/HellionChat/Resources/HellionStrings.pt-BR.resx b/HellionChat/Resources/HellionStrings.pt-BR.resx
index 9dbefd7..cd377b5 100644
--- a/HellionChat/Resources/HellionStrings.pt-BR.resx
+++ b/HellionChat/Resources/HellionStrings.pt-BR.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacidade
-
Ativar filtro de privacidade
@@ -24,9 +21,6 @@
O filtro controla apenas o que é gravado no banco de dados local. O log de bate-papo continua exibindo todas as mensagens em tempo real; canais excluídos simplesmente não são mais armazenados. Se você quiser remover canais da exibição visível também, use os filtros normais de aba de chat no jogo.
-
- Filtro de privacidade e lista de permissões
-
Escolha quais canais são salvos no banco de dados local. O padrão segue a minimização de dados: apenas suas próprias conversas. Use os botões abaixo para aplicar uma predefinição.
@@ -597,18 +591,6 @@
-
- Entrada
-
-
- Áudio & notificações
-
-
- Performance
-
-
- Idioma & auxiliares de entrada
-
@@ -625,32 +607,11 @@
-
- Ocultação
-
-
- Ocultação por inatividade
-
Moldura da janela
-
- Dicas
-
-
- Auto-Tell-Tabs
-
-
- Comportamento de mensagens
-
-
- Prévia
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Informações de versão
-
-
- Sobre HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Crie e configure abas de chat personalizadas.
-
- Privacidade
-
-
- Filtro de privacidade por canal e o que pode ser armazenado.
-
Banco de Dados
@@ -824,10 +770,10 @@
Armazenamento, migração, limpeza legada
- Informações
+ Sobre
- Versão, missão, licença e changelog.
+ Extensões, versão, informações do projeto, tradutores e changelog.
Themes
@@ -868,29 +814,11 @@
Altera o layout de mensagens do padrão de linhas em card de volta para linhas únicas `[HH:mm] Remetente: Texto`.
-
- Theme & Layout
-
-
- Tema, moldura da janela e estilo de timestamp.
-
-
- Fonts & Colours
-
-
- Fonte, tamanho da fonte e cores de chat por canal.
-
- Gerenciamento de dados
+ Dados e privacidade
- Retenção, limpeza, exportação e estatísticas do banco de dados.
-
-
- Integrações
-
-
- Outros plugins do Dalamud com os quais o HellionChat funciona. Integrações futuras em prévia.
+ Filtro de privacidade, retenção, limpeza, exportação e estatísticas do banco de dados.
Theme
@@ -907,39 +835,12 @@
O nível de transparência do fundo da janela. Valores menores deixam mais do jogo aparecer. Dica: o menu por janela do Dalamud (hambúrguer na barra de título) oferece ajustes individuais de opacidade, desfoque de fundo, clique passante e fixação: esses têm prioridade sobre este controle para a janela respectiva.
-
- Fontes
-
-
- Cores do chat
-
-
- Armazenamento
-
-
- Retenção
-
-
- Limpeza
-
-
- Exportar
-
-
- Visualizador de banco de dados
-
Avançado (Shift+clique para abrir)
-
- Comportamento
-
O Hellion Chat 1.2.1 reorganizou o menu de configurações e removeu a antiga opção "Substituir estilo" (substituída pelo sistema de temas da versão 1.1.0). Suas demais configurações permanecem inalteradas. A transparência da janela foi migrada para "Theme & Layout". Um backup da configuração anterior está em pluginConfigs/HellionChat.json.pre-v16-backup ao lado do HellionChat.json ativo.
-
- Integrações
-
As integrações de plugin permitem que o HellionChat trabalhe junto com outros plugins Dalamud instalados. Cada integração detecta automaticamente seu alvo e se desativa silenciosamente quando o plugin alvo está ausente.
@@ -1054,4 +955,195 @@
Desativa a transição de temas, as animações de foco da barra lateral e dos cartões e a pulsação de abas não lidas. As trocas de tema e os estados de foco passam a ser aplicados instantaneamente.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Entrada
+
+
+ Som
+
+
+ Idioma
+
+
+ Desempenho
+
+
+ O som reproduzido por aba é definido na aba Canais.
+
+
+ Tema
+
+
+ Fontes
+
+
+ Cores
+
+
+ Estilo da janela
+
+
+ Marcações de tempo
+
+
+ Animações
+
+
+ Mensagens
+
+
+ Entrada e visualização
+
+
+ Abas de tell automático
+
+
+ Emotes
+
+
+ Links e dicas
+
+
+ Rede de novatos
+
+
+ Ocultar
+
+
+ Ocultar quando inativo
+
+
+ Moldura
+
+
+ Canais
+
+
+ Exibição
+
+
+ Notificação
+
+
+ Entrada
+
+
+ Janela pop-out
+
+
+ Este volume se aplica a todas as abas.
+
+
+ Filtro de privacidade
+
+
+ Armazenamento
+
+
+ Retenção
+
+
+ Limpeza
+
+
+ Exportar
+
+
+ Banco de dados
+
+
+ Extensões
+
+
+ Informações do plugin
+
+
+ O projeto
+
+
+ Tradutores
+
+
+ Registro de alterações
+
+
+ Notificar ao falhar tell
+
+
+ Exibe uma notificação quando um tell que você enviou não pôde ser entregue (destinatário offline, em uma instância ou bloqueando você).
+
+
+ Avisar antes de enviar símbolos exclusivos do plugin
+
+
+ Exibe um aviso quando uma mensagem que você está prestes a enviar contém símbolos que só são exibidos corretamente para jogadores que usam HellionChat ou um plugin semelhante.
+
+
+ Sufixo de mundo
+
+
+ Quando adicionar o mundo de origem ao nome do remetente no registro de chat.
+
+
+ Formato de nome
+
+
+ Como os nomes dos remetentes são exibidos no registro de chat. O nome completo é o padrão.
+
+
+ Nunca
+
+
+ Apenas outros mundos
+
+
+ Sempre
+
+
+ Nome completo
+
+
+ Apenas primeiro nome
+
+
+ Iniciais
+
+
+ Volume de som personalizado
+
+
+ Volume de reprodução dos três sons de notificação personalizados incluídos. Não afeta os 16 sons do jogo.
+
+
+ Opacidade da janela inativa
+
+
+ Opacidade do fundo da janela de chat principal enquanto não está em foco. O controle deslizante acima define o valor em foco. Uma substituição por janela no menu de fixação do Dalamud tem prioridade sobre ambos.
+
+
+ Som de notificação
+
+
+ Reproduz um som quando uma mensagem chega nesta aba enquanto você está em outra aba. Respeita o botão global de som.
+
+
+ Som
+
+
+ Visualizar o som selecionado
+
+
+ Som Hellion
+
+
+ Um tell não pôde ser entregue.
+
+
+ Tell para {0} não pôde ser entregue.
+
+
+ Esta mensagem contém símbolos exclusivos do plugin que outros jogadores podem ver como caixas vazias. Pressione Enter novamente para enviar mesmo assim.
+
diff --git a/HellionChat/Resources/HellionStrings.pt-PT.resx b/HellionChat/Resources/HellionStrings.pt-PT.resx
index 63d291f..e260ef5 100644
--- a/HellionChat/Resources/HellionStrings.pt-PT.resx
+++ b/HellionChat/Resources/HellionStrings.pt-PT.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacidade
-
Ativar filtro de privacidade
@@ -24,9 +21,6 @@
O filtro controla apenas o que é escrito na base de dados local. O registo de chat continua a mostrar todas as mensagens em tempo real; os canais excluídos deixam simplesmente de ser armazenados. Se também quiseres remover canais da visualização, usa os filtros normais de separadores de chat no jogo.
-
- Filtro de privacidade e lista de permissões
-
Escolhe quais os canais guardados na base de dados local. A predefinição segue o princípio da minimização de dados: apenas as tuas próprias conversas. Usa os botões abaixo para aplicar uma predefinição.
@@ -597,18 +591,6 @@
-
- Entrada
-
-
- Áudio & notificações
-
-
- Desempenho
-
-
- Idioma & auxiliares de entrada
-
@@ -625,32 +607,11 @@
-
- Ocultar
-
-
- Ocultar por inatividade
-
Moldura da janela
-
- Tooltips
-
-
- Auto-Tell-Tabs
-
-
- Comportamento das mensagens
-
-
- Pré-visualização
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Informação de versão
-
-
- Sobre o HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Cria e configura separadores de chat personalizados.
-
- Privacidade
-
-
- Filtro de privacidade por canal e o que pode ser armazenado.
-
Base de dados
@@ -824,10 +770,10 @@
Armazenamento, migração, limpeza de dados antigos
- Informação
+ Sobre
- Versão, missão, licença e changelog.
+ Extensões, versão, informações do projeto, tradutores e changelog.
Themes
@@ -868,29 +814,11 @@
Muda o layout das mensagens da predefinição de linhas em cartão para linhas simples `[HH:mm] Remetente: Texto`.
-
- Theme & Layout
-
-
- Theme, moldura da janela e estilo de marcas de tempo.
-
-
- Tipos de letra & Cores
-
-
- Tipo de letra, tamanho e cores de chat por canal.
-
- Gestão de dados
+ Dados e privacidade
- Retenção, limpeza, exportação e estatísticas da base de dados.
-
-
- Integrações
-
-
- Outros plugins Dalamud com os quais o HellionChat funciona. Integrações futuras em pré-visualização.
+ Filtro de privacidade, retenção, limpeza, exportação e estatísticas da base de dados.
Theme
@@ -907,39 +835,12 @@
Quão transparente é o fundo da janela. Valores mais baixos deixam mais do jogo aparecer por detrás. Dica: o menu por janela do Dalamud (hamburger na barra de título) oferece substituições por janela para opacidade, desfoque de fundo, clique transparente e fixação: têm precedência sobre este cursor para a janela em questão.
-
- Tipos de letra
-
-
- Cores do chat
-
-
- Armazenamento
-
-
- Retenção
-
-
- Limpeza
-
-
- Exportar
-
-
- Visualizador da base de dados
-
Avançado (Shift+clique para abrir)
-
- Comportamento
-
O Hellion Chat 1.2.1 reorganizou o menu de definições e removeu a antiga opção "Substituir estilo" (substituída pelo sistema de themes a partir da versão 1.1.0). As tuas restantes definições ficam inalteradas. A transparência da janela foi migrada para "Theme & Layout". Uma cópia de segurança da configuração anterior encontra-se em pluginConfigs/HellionChat.json.pre-v16-backup junto ao ficheiro HellionChat.json ativo.
-
- Integrações
-
As integrações de plugins permitem que o HellionChat funcione em conjunto com outros plugins Dalamud instalados. Cada integração deteta automaticamente o seu alvo e desativa-se silenciosamente quando o plugin alvo está em falta.
@@ -1053,4 +954,195 @@
Desativa a transição de temas, as animações de passagem do rato sobre a barra lateral e os cartões e a pulsação de separadores não lidos. As mudanças de tema e os estados de passagem do rato passam a ser aplicados instantaneamente.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Entrada
+
+
+ Som
+
+
+ Idioma
+
+
+ Desempenho
+
+
+ O som reproduzido por separador é definido no separador Canais.
+
+
+ Tema
+
+
+ Tipos de letra
+
+
+ Cores
+
+
+ Estilo da janela
+
+
+ Marcas de tempo
+
+
+ Animações
+
+
+ Mensagens
+
+
+ Entrada e pré-visualização
+
+
+ Separadores de tell automático
+
+
+ Emotes
+
+
+ Ligações e dicas
+
+
+ Rede de novatos
+
+
+ Ocultar
+
+
+ Ocultar quando inativo
+
+
+ Moldura
+
+
+ Canais
+
+
+ Exibição
+
+
+ Notificação
+
+
+ Entrada
+
+
+ Janela destacável
+
+
+ Este volume aplica-se a todos os separadores.
+
+
+ Filtro de privacidade
+
+
+ Armazenamento
+
+
+ Retenção
+
+
+ Limpeza
+
+
+ Exportar
+
+
+ Base de dados
+
+
+ Extensões
+
+
+ Informações do plugin
+
+
+ O projeto
+
+
+ Tradutores
+
+
+ Registo de alterações
+
+
+ Notificar ao falhar tell
+
+
+ Exibe uma notificação quando um tell que enviaste não pôde ser entregue (destinatário offline, numa instância ou a bloquear-te).
+
+
+ Avisar antes de enviar símbolos exclusivos do plugin
+
+
+ Exibe um aviso quando uma mensagem que estás prestes a enviar contém símbolos que só são exibidos corretamente para jogadores que utilizam HellionChat ou um plugin semelhante.
+
+
+ Sufixo de mundo
+
+
+ Quando adicionar o mundo de origem ao nome do remetente no registo de chat.
+
+
+ Formato do nome
+
+
+ Como os nomes dos remetentes são exibidos no registo de chat. O nome completo é o padrão.
+
+
+ Nunca
+
+
+ Apenas outros mundos
+
+
+ Sempre
+
+
+ Nome completo
+
+
+ Apenas primeiro nome
+
+
+ Iniciais
+
+
+ Volume de som personalizado
+
+
+ Volume de reprodução dos três sons de notificação personalizados incluídos. Não afeta os 16 sons do jogo.
+
+
+ Opacidade da janela inativa
+
+
+ Opacidade do fundo da janela de chat principal enquanto não está em foco. O controlo deslizante acima define o valor em foco. Uma substituição por janela no menu de fixação do Dalamud tem prioridade sobre ambos.
+
+
+ Som de notificação
+
+
+ Reproduz um som quando uma mensagem chega neste separador enquanto estás noutro separador. Respeita o botão global de som.
+
+
+ Som
+
+
+ Pré-visualizar o som selecionado
+
+
+ Som Hellion
+
+
+ Um tell não pôde ser entregue.
+
+
+ Tell para {0} não pôde ser entregue.
+
+
+ Esta mensagem contém símbolos exclusivos do plugin que outros jogadores podem ver como caixas vazias. Pressiona Enter novamente para enviar mesmo assim.
+
diff --git a/HellionChat/Resources/HellionStrings.resx b/HellionChat/Resources/HellionStrings.resx
index 79a6d45..b70fed1 100644
--- a/HellionChat/Resources/HellionStrings.resx
+++ b/HellionChat/Resources/HellionStrings.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Privacy
-
Enable privacy filter
@@ -24,9 +21,6 @@
The filter only controls what is written to the local database. The chat log still shows every message live; excluded channels are simply no longer stored. If you also want to remove channels from the visible display, use the normal chat-tab filters in the game.
-
- Privacy filter and whitelist
-
Choose which channels are saved to the local database. Default follows data minimisation: only your own conversations. Use the buttons below to apply a preset.
@@ -596,20 +590,6 @@
About
-
-
- Input
-
-
- Audio & notifications
-
-
- Performance
-
-
- Language & input aids
-
-
Theme
@@ -624,34 +604,10 @@
Timestamps
-
-
- Hiding
-
-
- Inactivity hiding
-
+
Window frame
-
- Tooltips
-
-
-
-
- Auto-Tell-Tabs
-
-
- Message behaviour
-
-
- Preview
-
-
- Emotes
-
-
Show symbol-picker button next to chat input
@@ -671,17 +627,6 @@
Maintenance
-
-
- Version info
-
-
- About HellionChat
-
-
- Changelog
-
-
System
@@ -811,12 +756,6 @@
Create and configure custom chat tabs.
-
- Privacy
-
-
- Privacy filter per channel and what may be stored.
-
Database
@@ -824,10 +763,10 @@
Storage, migration, legacy cleanup
- Information
+ About
- Version, mission, licence, and changelog.
+ Extensions, version, project info, translators, and changelog.
Themes
@@ -868,29 +807,11 @@
Switches the message layout from the card-row default back to single-line `[HH:mm] Sender: Text` rows.
-
- Theme & Layout
-
-
- Theme, window frame, and timestamp style.
-
-
- Fonts & Colours
-
-
- Font, font size, and chat colours per channel.
-
- Data management
+ Data & Privacy
- Retention, cleanup, export, and database statistics.
-
-
- Integrations
-
-
- Other Dalamud plugins that HellionChat works with. Upcoming integrations in preview.
+ Privacy filter, retention, cleanup, export, and database statistics.
Theme
@@ -907,39 +828,30 @@
How transparent the window background is. Lower values let more of the game show through. Tip: Dalamud's per-window menu (hamburger in the title bar) offers per-window overrides for opacity, background blur, click-through, and pinning. Those take precedence over this slider for the respective window.
-
- Fonts
+
+ Privacy filter
-
- Chat colours
-
-
+
Storage
-
+
Retention
-
+
Cleanup
-
+
Export
-
- Database viewer
+
+ Database
Advanced (Shift+click to open)
-
- Behaviour
-
Hellion Chat 1.2.1 has reorganised the settings menu and removed the old "Override style" option (superseded by the theme system from 1.1.0). Your remaining settings are unchanged. Window transparency has been migrated to "Theme & Layout". A backup of the previous config is located at pluginConfigs/HellionChat.json.pre-v16-backup next to the active HellionChat.json.
-
- Integrations
-
Plugin integrations let HellionChat work together with other installed Dalamud plugins. Each integration automatically detects its target and silently disables itself when the target plugin is missing.
@@ -1090,4 +1002,168 @@
Insert linked item <item>
+
+
+
+ Warn before sending plugin-only symbols
+
+
+ Show a warning when a message you are about to send contains symbols that only display correctly for players running HellionChat or a similar plugin.
+
+
+ This message contains plugin-only symbols that other players may see as empty boxes. Press Enter again to send anyway.
+
+
+
+
+ World suffix
+
+
+ When to append the home world to a sender's name in the chat log.
+
+
+ Name format
+
+
+ How sender names are shown in the chat log. The full name is the default.
+
+
+ Never
+
+
+ Other worlds only
+
+
+ Always
+
+
+ Full name
+
+
+ First name only
+
+
+ Initials
+
+
+
+
+ Inactive window opacity
+
+
+ Background opacity of the main chat window while it is not focused. The slider above sets the focused value. A per-window override in Dalamud's window pinning menu still takes precedence over both.
+
+
+
+
+ Custom sound volume
+
+
+ Playback volume for the three bundled custom notification sounds. Does not affect the 16 game sounds.
+
+
+
+
+ Input
+
+
+ Sound
+
+
+ Language
+
+
+ Performance
+
+
+ Which sound plays per tab is set in the Channels tab.
+
+
+
+
+ Messages
+
+
+ Input & preview
+
+
+ Auto-tell tabs
+
+
+ Emotes
+
+
+ Links & tooltips
+
+
+ Novice network
+
+
+
+
+ Theme
+
+
+ Fonts
+
+
+ Colours
+
+
+ Window style
+
+
+ Timestamps
+
+
+ Animations
+
+
+
+
+ Hide
+
+
+ Hide when inactive
+
+
+ Frame
+
+
+
+
+ Channels
+
+
+ Display
+
+
+ Notification
+
+
+ Input
+
+
+ Pop-out window
+
+
+ This volume applies to all tabs.
+
+
+
+
+ Extensions
+
+
+ Plugin info
+
+
+ The Project
+
+
+ Translators
+
+
+ Changelog
+
diff --git a/HellionChat/Resources/HellionStrings.ro.resx b/HellionChat/Resources/HellionStrings.ro.resx
index 5334b42..4984bf4 100644
--- a/HellionChat/Resources/HellionStrings.ro.resx
+++ b/HellionChat/Resources/HellionStrings.ro.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Confidențialitate
-
Activează filtrul de confidențialitate
@@ -24,9 +21,6 @@
Filtrul controlează doar ce se scrie în baza de date locală. Jurnalul de chat afișează în continuare fiecare mesaj în timp real; canalele excluse nu mai sunt stocate, atât. Dacă vrei să elimini canale și din afișajul vizibil, folosește filtrele normale de tab din joc.
-
- Filtru de confidențialitate și listă albă
-
Alege ce canale sunt salvate în baza de date locală. Implicit urmează minimizarea datelor: doar conversațiile tale. Folosește butoanele de mai jos pentru a aplica o configurație prestabilită.
@@ -597,18 +591,6 @@
-
- Introducere text
-
-
- Audio & notificări
-
-
- Performanță
-
-
- Limbă & ajutoare de introducere
-
@@ -625,32 +607,11 @@
-
- Ascundere
-
-
- Ascundere la inactivitate
-
Cadru fereastră
-
- Tooltipuri
-
-
- Auto-Tell-Tabs
-
-
- Comportament mesaje
-
-
- Previzualizare
-
-
- Emote-uri
-
@@ -672,15 +633,6 @@
-
- Informații versiune
-
-
- Despre HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Creează și configurează tab-uri de chat personalizate.
-
- Confidențialitate
-
-
- Filtru de confidențialitate per canal și ce poate fi stocat.
-
Bază de date
@@ -824,10 +770,10 @@
Stocare, migrare, curățare veche
- Informații
+ Despre
- Versiune, misiune, licență și changelog.
+ Extensii, versiune, informații despre proiect, traducători și changelog.
Teme
@@ -868,29 +814,11 @@
Comută aspectul mesajelor din stilul implicit card-row înapoi la rânduri simple `[HH:mm] Expeditor: Text`.
-
- Temă & aspect
-
-
- Temă, cadru fereastră și stil marcaje de timp.
-
-
- Fonturi & culori
-
-
- Font, dimensiune font și culori chat per canal.
-
- Gestionarea datelor
+ Date și confidențialitate
- Retenție, curățare, export și statistici bază de date.
-
-
- Integrări
-
-
- Alte plugin-uri Dalamud cu care HellionChat colaborează. Integrări viitoare în previzualizare.
+ Filtru de confidențialitate, retenție, curățare, export și statistici bază de date.
Temă
@@ -907,39 +835,12 @@
Cât de transparent este fundalul ferestrei. Valorile mai mici lasă mai mult din joc să se vadă. Sfat: meniul per-fereastră al Dalamud (hamburger în bara de titlu) oferă suprascrieri per fereastră pentru opacitate, blur de fundal, click-through și fixare: acestea au prioritate față de acest slider pentru fereastra respectivă.
-
- Fonturi
-
-
- Culori chat
-
-
- Stocare
-
-
- Retenție
-
-
- Curățare
-
-
- Export
-
-
- Vizualizator bază de date
-
Avansat (Shift+clic pentru deschidere)
-
- Comportament
-
Hellion Chat 1.2.1 a reorganizat meniul de setări și a eliminat vechea opțiune „Override style" (înlocuită de sistemul de teme din 1.1.0). Setările tale rămase sunt nemodificate. Transparența ferestrei a fost migrată la „Temă & aspect". O copie de rezervă a configurației anterioare se află la pluginConfigs/HellionChat.json.pre-v16-backup lângă fișierul activ HellionChat.json.
-
- Integrări
-
Integrările de plugin-uri permit HellionChat să colaboreze cu alte plugin-uri Dalamud instalate. Fiecare integrare își detectează automat ținta și se dezactivează în liniște când plugin-ul țintă lipsește.
@@ -1054,4 +955,195 @@
Dezactivează tranziția temelor, animațiile la trecerea cursorului peste bara laterală și carduri și pulsația filelor necitite. Schimbările de temă și stările de cursor se aplică instantaneu.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Introducere
+
+
+ Sunet
+
+
+ Limbă
+
+
+ Performanță
+
+
+ Sunetul redat per filă se setează în fila Canale.
+
+
+ Temă
+
+
+ Fonturi
+
+
+ Culori
+
+
+ Stil fereastră
+
+
+ Marcaje de timp
+
+
+ Animații
+
+
+ Mesaje
+
+
+ Introducere și previzualizare
+
+
+ File tell automate
+
+
+ Emote-uri
+
+
+ Linkuri și sugestii
+
+
+ Rețeaua novicilor
+
+
+ Ascundere
+
+
+ Ascunde când inactiv
+
+
+ Cadru
+
+
+ Canale
+
+
+ Afișaj
+
+
+ Notificare
+
+
+ Introducere
+
+
+ Fereastră detașată
+
+
+ Acest volum se aplică tuturor filelor.
+
+
+ Filtru de confidențialitate
+
+
+ Stocare
+
+
+ Retenție
+
+
+ Curățare
+
+
+ Export
+
+
+ Bază de date
+
+
+ Extensii
+
+
+ Informații plugin
+
+
+ Proiectul
+
+
+ Traducători
+
+
+ Jurnal de modificări
+
+
+ Notifică la tell eșuat
+
+
+ Afișează o notificare când un tell trimis nu a putut fi livrat (destinatarul este offline, într-o instanță sau te-a blocat).
+
+
+ Avertizare înainte de trimiterea simbolurilor exclusiv plugin
+
+
+ Afișează un avertisment când un mesaj pe care urmează să-l trimiți conține simboluri care se afișează corect doar pentru jucătorii care folosesc HellionChat sau un plugin similar.
+
+
+ Sufix lume
+
+
+ Când să adauge lumea de origine la numele expeditorului în jurnalul de chat.
+
+
+ Format nume
+
+
+ Cum sunt afișate numele expeditorilor în jurnalul de chat. Numele complet este valoarea implicită.
+
+
+ Niciodată
+
+
+ Doar alte lumi
+
+
+ Întotdeauna
+
+
+ Nume complet
+
+
+ Doar prenume
+
+
+ Inițiale
+
+
+ Volum sunet personalizat
+
+
+ Volumul de redare pentru cele trei sunete de notificare personalizate incluse. Nu afectează cele 16 sunete din joc.
+
+
+ Opacitate fereastră inactivă
+
+
+ Opacitatea fundalului ferestrei principale de chat când nu este focalizată. Cursorul de mai sus setează valoarea focalizată. O suprascriere per fereastră din meniul de fixare Dalamud are prioritate față de ambele.
+
+
+ Sunet de notificare
+
+
+ Redă un sunet când sosește un mesaj pe această filă în timp ce te uiți la altă filă. Respectă comutatorul global de sunet.
+
+
+ Sunet
+
+
+ Previzualizare sunet selectat
+
+
+ Sunet Hellion
+
+
+ Un tell nu a putut fi livrat.
+
+
+ Tell-ul către {0} nu a putut fi livrat.
+
+
+ Acest mesaj conține simboluri exclusiv plugin pe care alți jucători le-ar putea vedea ca casete goale. Apasă Enter din nou pentru a trimite oricum.
+
diff --git a/HellionChat/Resources/HellionStrings.ru.resx b/HellionChat/Resources/HellionStrings.ru.resx
index edc1490..b8662ab 100644
--- a/HellionChat/Resources/HellionStrings.ru.resx
+++ b/HellionChat/Resources/HellionStrings.ru.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Конфиденциальность
-
Включить фильтр конфиденциальности
@@ -24,9 +21,6 @@
Фильтр управляет только тем, что записывается в локальную базу данных. В журнале чата по-прежнему отображаются все сообщения в реальном времени; исключённые каналы просто больше не сохраняются. Если вы хотите убрать каналы из видимого отображения, используйте обычные фильтры вкладок чата в игре.
-
- Фильтр конфиденциальности и белый список
-
Выберите, какие каналы сохраняются в локальную базу данных. По умолчанию применяется минимизация данных: только ваши собственные разговоры. Используйте кнопки ниже для применения пресета.
@@ -597,18 +591,6 @@
-
- Ввод
-
-
- Звук & уведомления
-
-
- Производительность
-
-
- Язык & помощь при вводе
-
@@ -625,32 +607,11 @@
-
- Скрытие
-
-
- Скрытие по бездействию
-
Рамка окна
-
- Подсказки
-
-
- Auto-Tell-Tabs
-
-
- Поведение сообщений
-
-
- Предпросмотр
-
-
- Эмоции
-
@@ -672,15 +633,6 @@
-
- Версия
-
-
- О HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Создание и настройка пользовательских вкладок чата.
-
- Конфиденциальность
-
-
- Фильтр конфиденциальности по каналу и что может сохраняться.
-
База данных
@@ -824,10 +770,10 @@
Хранение, миграция, очистка устаревшего
- Информация
+ О плагине
- Версия, миссия, лицензия и changelog.
+ Расширения, версия, информация о проекте, переводчики и changelog.
Темы
@@ -868,29 +814,11 @@
Переключает макет сообщений с карточного отображения по умолчанию обратно на однострочный формат `[HH:mm] Отправитель: Текст`.
-
- Theme & Layout
-
-
- Тема, рамка окна и стиль временны́х меток.
-
-
- Fonts & Colours
-
-
- Шрифт, размер шрифта и цвета чата по каналам.
-
- Управление данными
+ Данные и конфиденциальность
- Хранение, очистка, экспорт и статистика базы данных.
-
-
- Интеграции
-
-
- Другие плагины Dalamud, с которыми работает HellionChat. Предстоящие интеграции в предпросмотре.
+ Фильтр конфиденциальности, хранение, очистка, экспорт и статистика базы данных.
Theme
@@ -907,39 +835,12 @@
Степень прозрачности фона окна. Меньшие значения позволяют больше просвечивать игре. Совет: меню Dalamud для каждого окна (иконка «гамбургер» в заголовке окна) предлагает индивидуальные настройки прозрачности, размытия фона, сквозных кликов и закрепления — они имеют приоритет над этим слайдером для соответствующего окна.
-
- Шрифты
-
-
- Цвета чата
-
-
- Хранение
-
-
- Сроки хранения
-
-
- Очистка
-
-
- Экспорт
-
-
- Просмотр базы данных
-
Дополнительно (Shift+клик для открытия)
-
- Поведение
-
Hellion Chat 1.2.1 реорганизовал меню настроек и удалил устаревшую опцию «Override style» (заменена системой тем из версии 1.1.0). Остальные настройки не изменились. Прозрачность окна перенесена в раздел «Theme & Layout». Резервная копия предыдущей конфигурации расположена по адресу pluginConfigs/HellionChat.json.pre-v16-backup рядом с активным файлом HellionChat.json.
-
- Интеграции
-
Интеграции плагинов позволяют HellionChat работать совместно с другими установленными плагинами Dalamud. Каждая интеграция автоматически определяет целевой плагин и тихо отключается, если тот не установлен.
@@ -1054,4 +955,195 @@
Отключает плавное переключение тем, анимации наведения для боковой панели и карточек, а также пульсацию непрочитанных вкладок. Смена темы и состояния наведения применяются мгновенно.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Ввод
+
+
+ Звук
+
+
+ Язык
+
+
+ Производительность
+
+
+ Звук, воспроизводимый на каждой вкладке, задаётся на вкладке «Каналы».
+
+
+ Тема
+
+
+ Шрифты
+
+
+ Цвета
+
+
+ Стиль окна
+
+
+ Временны́е метки
+
+
+ Анимации
+
+
+ Сообщения
+
+
+ Ввод и предпросмотр
+
+
+ Авто-вкладки tell
+
+
+ Эмоции
+
+
+ Ссылки и подсказки
+
+
+ Канал новичков
+
+
+ Скрыть
+
+
+ Скрывать при бездействии
+
+
+ Рамка
+
+
+ Каналы
+
+
+ Отображение
+
+
+ Уведомление
+
+
+ Ввод
+
+
+ Всплывающее окно
+
+
+ Этот уровень громкости применяется ко всем вкладкам.
+
+
+ Фильтр конфиденциальности
+
+
+ Хранилище
+
+
+ Хранение
+
+
+ Очистка
+
+
+ Экспорт
+
+
+ База данных
+
+
+ Расширения
+
+
+ Информация о плагине
+
+
+ Проект
+
+
+ Переводчики
+
+
+ Список изменений
+
+
+ Уведомление о неудачном сообщении
+
+
+ Показывает уведомление, если отправленное сообщение не было доставлено (получатель офлайн, в инстансе или заблокировал вас).
+
+
+ Предупреждение перед отправкой символов плагина
+
+
+ Показывает предупреждение, если отправляемое сообщение содержит символы, которые корректно отображаются только у игроков с HellionChat или похожим плагином.
+
+
+ Суффикс мира
+
+
+ Когда добавлять родной мир к имени отправителя в журнале чата.
+
+
+ Формат имени
+
+
+ Как отображаются имена отправителей в журнале чата. По умолчанию — полное имя.
+
+
+ Никогда
+
+
+ Только другие миры
+
+
+ Всегда
+
+
+ Полное имя
+
+
+ Только имя
+
+
+ Инициалы
+
+
+ Громкость пользовательского звука
+
+
+ Громкость воспроизведения трёх встроенных пользовательских звуков уведомлений. Не влияет на 16 игровых звуков.
+
+
+ Прозрачность неактивного окна
+
+
+ Прозрачность фона главного окна чата, когда оно не активно. Ползунок выше задаёт значение для активного окна. Индивидуальная настройка в меню закрепления Dalamud имеет приоритет над обоими.
+
+
+ Звук уведомления
+
+
+ Воспроизводит звук при получении сообщен��я на этой вкладке, пока вы смотрите другую вкладку. Учитывает глобальный переключатель звука.
+
+
+ Звук
+
+
+ Предварительный просмотр выбранного звука
+
+
+ Звук Hellion
+
+
+ Сообщение не было доставлено.
+
+
+ Сообщение для {0} не было доставлено.
+
+
+ Это сообщение содержит символы плагина, которые другие игроки могут видеть как пустые квадраты. Нажмите Enter ещё раз, чтобы всё равно отправить.
+
diff --git a/HellionChat/Resources/HellionStrings.sv.resx b/HellionChat/Resources/HellionStrings.sv.resx
index a5ff167..e955e2e 100644
--- a/HellionChat/Resources/HellionStrings.sv.resx
+++ b/HellionChat/Resources/HellionStrings.sv.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Sekretess
-
Aktivera sekretessfilter
@@ -24,9 +21,6 @@
Filtret styr bara vad som skrivs till den lokala databasen. I chattloggen ser du fortfarande varje meddelande live. Exkluderade kanaler sparas helt enkelt inte längre. Om du även vill ta bort kanaler från den synliga visningen använder du de vanliga chattfliksfiltren i spelet.
-
- Sekretessfilter och vitlista
-
Välj vilka kanaler som sparas i den lokala databasen. Standardinställningen följer dataminimering: bara dina egna konversationer. Använd knapparna nedan för att tillämpa en förinställning.
@@ -597,18 +591,6 @@
-
- Inmatning
-
-
- Ljud & aviseringar
-
-
- Prestanda
-
-
- Språk & inmatningshjälp
-
@@ -625,32 +607,11 @@
-
- Dölj
-
-
- Dölj vid inaktivitet
-
Fönsterram
-
- Verktygstips
-
-
- Auto-Tell-Tabs
-
-
- Meddelandebeteende
-
-
- Förhandsgranskning
-
-
- Emotes
-
@@ -672,15 +633,6 @@
-
- Versionsinformation
-
-
- Om HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Skapa och konfigurera anpassade chattflikar.
-
- Sekretess
-
-
- Sekretessfilter per kanal och vad som får sparas.
-
Databas
@@ -824,10 +770,10 @@
Lagring, migrering, äldre rensning
- Information
+ Om
- Version, syfte, licens och changelog.
+ Tillägg, version, projektinformation, översättare och changelog.
Themes
@@ -868,29 +814,11 @@
Byter meddelandelayouten från kortradstandarden tillbaka till enkla `[HH:mm] Avsändare: Text`-rader.
-
- Theme & Layout
-
-
- Theme, fönsterram och tidsstämpelinställning.
-
-
- Teckensnitt & Färger
-
-
- Teckensnitt, teckenstorlek och chattfärger per kanal.
-
- Datahantering
+ Data och sekretess
- Lagring, rensning, export och databasstatistik.
-
-
- Integrationer
-
-
- Andra Dalamud-plugins som HellionChat samarbetar med. Kommande integrationer i förhandsgranskning.
+ Sekretessfilter, lagring, rensning, export och databasstatistik.
Theme
@@ -907,39 +835,12 @@
Hur genomskinlig fönsterbakgrunden är. Lägre värden låter mer av spelet synas igenom. Tips: Dalamud's per-fönster-meny (hamburgaren i namnlisten) erbjuder per-fönster-överstyrningar för opacitet, bakgrundsoskärpa, klickigenom och fästning: de har företräde framför det här reglaget för respektive fönster.
-
- Teckensnitt
-
-
- Chattfärger
-
-
- Lagring
-
-
- Lagring
-
-
- Rensning
-
-
- Export
-
-
- Databasvisare
-
Avancerat (Shift+klicka för att öppna)
-
- Beteende
-
Hellion Chat 1.2.1 har omorganiserat inställningsmenyn och tagit bort det gamla alternativet "Åsidosätt stil" (ersatt av theme-systemet från 1.1.0). Dina övriga inställningar är oförändrade. Fönstrets genomskinlighet har migrerats till "Theme & Layout". En säkerhetskopia av den tidigare konfigurationen finns vid pluginConfigs/HellionChat.json.pre-v16-backup bredvid den aktiva HellionChat.json.
-
- Integrationer
-
Plugin-integrationer låter HellionChat samarbeta med andra installerade Dalamud-plugins. Varje integration identifierar automatiskt sitt mål och inaktiverar sig tyst när målpluginen saknas.
@@ -1054,4 +955,195 @@
Inaktiverar temaövergången, hover-animationerna för sidofältet och korten samt pulseringen av olästa flikar. Temabyten och hover-tillstånd tillämpas i stället direkt.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Inmatning
+
+
+ Ljud
+
+
+ Språk
+
+
+ Prestanda
+
+
+ Vilket ljud som spelas per flik ställs in på fliken Kanaler.
+
+
+ Tema
+
+
+ Teckensnitt
+
+
+ Färger
+
+
+ Fönsterstil
+
+
+ Tidsstämplar
+
+
+ Animeringar
+
+
+ Meddelanden
+
+
+ Inmatning och förhandsgranskning
+
+
+ Automatiska tell-flikar
+
+
+ Emotes
+
+
+ Länkar och verktygstips
+
+
+ Nybörjarnätverket
+
+
+ Dölj
+
+
+ Dölj vid inaktivitet
+
+
+ Ram
+
+
+ Kanaler
+
+
+ Visning
+
+
+ Avisering
+
+
+ Inmatning
+
+
+ Utbrytningsfönster
+
+
+ Volymen gäller för alla flikar.
+
+
+ Integritetsfilter
+
+
+ Lagring
+
+
+ Lagring
+
+
+ Rensning
+
+
+ Exportera
+
+
+ Databas
+
+
+ Tillägg
+
+
+ Plugin-info
+
+
+ Projektet
+
+
+ Översättare
+
+
+ Ändringslogg
+
+
+ Avisera om misslyckat tell
+
+
+ Visar ett toast-meddelande när ett tell du skickade inte kunde levereras (mottagaren är offline, i en instans eller blockerar dig).
+
+
+ Varna innan sändning av plugin-exklusiva symboler
+
+
+ Visar en varning när ett meddelande du är på väg att skicka innehåller symboler som endast visas korrekt för spelare som kör HellionChat eller ett liknande plugin.
+
+
+ Världssuffix
+
+
+ När hemvärldensnamnet läggs till avsändarens namn i chatt-loggen.
+
+
+ Namnformat
+
+
+ Hur avsändarnamn visas i chatt-loggen. Fullständigt namn är standard.
+
+
+ Aldrig
+
+
+ Bara andra världar
+
+
+ Alltid
+
+
+ Fullständigt namn
+
+
+ Endast förnamn
+
+
+ Initialer
+
+
+ Anpassad ljudstyrka
+
+
+ Uppspelningsstyrka för de tre medföljande anpassade aviseringsljuden. Påverkar inte de 16 spelljuden.
+
+
+ Inaktivt fönsters opacitet
+
+
+ Bakgrundsopacitet för det primära chattfönstret när det inte är i fokus. Skjutreglaget ovan anger det fokuserade värdet. En fönsterspecifik åsidosättning i Dalamud-fästningsmenyn har företräde framför båda.
+
+
+ Aviseringsljud
+
+
+ Spelar ett ljud när ett meddelande anländer på den här fliken medan du tittar på en annan flik. Respekterar det globala ljudbytaren.
+
+
+ Ljud
+
+
+ Förhandsgranska valt ljud
+
+
+ Hellion-ljud
+
+
+ Ett tell kunde inte levereras.
+
+
+ Tell till {0} kunde inte levereras.
+
+
+ Det här meddelandet innehåller plugin-exklusiva symboler som andra spelare kanske ser som tomma rutor. Tryck Enter igen för att skicka ändå.
+
diff --git a/HellionChat/Resources/HellionStrings.tr.resx b/HellionChat/Resources/HellionStrings.tr.resx
index 4dd56ee..7f35352 100644
--- a/HellionChat/Resources/HellionStrings.tr.resx
+++ b/HellionChat/Resources/HellionStrings.tr.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Gizlilik
-
Gizlilik filtresini etkinleştir
@@ -24,9 +21,6 @@
Filtre yalnızca yerel veritabanına nelerin yazılacağını denetler. Sohbet logu her mesajı canlı göstermeye devam eder; dışlanan kanallar artık saklanmaz. Kanalları görünür ekrandan da kaldırmak istiyorsan oyun içindeki normal sohbet sekme filtrelerini kullan.
-
- Gizlilik filtresi ve beyaz liste
-
Yerel veritabanına hangi kanalların kaydedileceğini seç. Varsayılan veri minimizasyonunu takip eder: yalnızca kendi konuşmaların. Bir ön ayar uygulamak için aşağıdaki düğmeleri kullan.
@@ -597,18 +591,6 @@
-
- Giriş
-
-
- Ses & bildirimler
-
-
- Performans
-
-
- Dil & giriş yardımcıları
-
@@ -625,32 +607,11 @@
-
- Gizleme
-
-
- Etkin olmadığında gizle
-
Pencere çerçevesi
-
- İpuçları
-
-
- Auto-Tell-Tabs
-
-
- Mesaj davranışı
-
-
- Önizleme
-
-
- Emote'lar
-
@@ -672,15 +633,6 @@
-
- Sürüm bilgisi
-
-
- HellionChat hakkında
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Özel sohbet sekmeleri oluştur ve yapılandır.
-
- Gizlilik
-
-
- Kanal başına gizlilik filtresi ve nelerin saklanabileceği.
-
Veritabanı
@@ -824,10 +770,10 @@
Depolama, geçiş, eski temizlik
- Bilgi
+ Hakkında
- Sürüm, misyon, lisans ve changelog.
+ Eklentiler, sürüm, proje bilgileri, çevirmenler ve changelog.
Themes
@@ -868,29 +814,11 @@
Mesaj düzenini kart satırı varsayılanından tek satırlı `[HH:mm] Gönderen: Metin` satırlarına geri döndürür.
-
- Theme & Layout
-
-
- Tema, pencere çerçevesi ve zaman damgası stili.
-
-
- Fonts & Colours
-
-
- Yazı tipi, yazı tipi boyutu ve kanal başına sohbet renkleri.
-
- Veri yönetimi
+ Veri ve gizlilik
- Saklama süresi, temizlik, dışa aktarma ve veritabanı istatistikleri.
-
-
- Entegrasyonlar
-
-
- HellionChat'in birlikte çalıştığı diğer Dalamud eklentileri. Önizlemedeki yaklaşan entegrasyonlar.
+ Gizlilik filtresi, saklama süresi, temizlik, dışa aktarma ve veritabanı istatistikleri.
Theme
@@ -907,39 +835,12 @@
Pencere arka planının ne kadar şeffaf olduğu. Düşük değerler oyunun daha fazla görünmesini sağlar. İpucu: Dalamud'un pencere başına menüsü (başlık çubuğundaki hamburger menü), opaklık, arka plan bulanıklığı, tıkla ve geç ile sabitleme için pencere başına geçersiz kılmalar sunar; bunlar ilgili pencere için bu kaydırıcının önüne geçer.
-
- Yazı tipleri
-
-
- Sohbet renkleri
-
-
- Depolama
-
-
- Saklama süresi
-
-
- Temizlik
-
-
- Dışa aktarma
-
-
- Veritabanı görüntüleyici
-
Gelişmiş (açmak için Shift+tıkla)
-
- Davranış
-
Hellion Chat 1.2.1, ayarlar menüsünü yeniden düzenledi ve eski "Stili geçersiz kıl" seçeneğini kaldırdı (1.1.0'daki tema sistemi tarafından yerini aldı). Kalan ayarların değişmedi. Pencere şeffaflığı "Theme & Layout" bölümüne taşındı. Önceki yapılandırmanın yedeği, aktif HellionChat.json dosyasının yanında pluginConfigs/HellionChat.json.pre-v16-backup olarak bulunmaktadır.
-
- Entegrasyonlar
-
Eklenti entegrasyonları, HellionChat'in yüklü diğer Dalamud eklentileriyle birlikte çalışmasını sağlar. Her entegrasyon hedefini otomatik olarak algılar ve hedef eklenti eksik olduğunda sessizce devre dışı kalır.
@@ -1053,4 +954,195 @@
Tema geçişini, kenar çubuğu ve kart vurgulama animasyonlarını ve okunmamış sekme nabzını devre dışı bırakır. Tema değişiklikleri ve vurgulama durumları bunun yerine anında uygulanır.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Giriş
+
+
+ Ses
+
+
+ Dil
+
+
+ Performans
+
+
+ Her sekme için hangi sesin çalınacağı Kanallar sekmesinden ayarlanır.
+
+
+ Tema
+
+
+ Yazı Tipleri
+
+
+ Renkler
+
+
+ Pencere stili
+
+
+ Zaman damgaları
+
+
+ Animasyonlar
+
+
+ Mesajlar
+
+
+ Giriş ve önizleme
+
+
+ Otomatik tell sekmeleri
+
+
+ Emote'lar
+
+
+ Bağlantılar ve araç ipuçları
+
+
+ Acemi ağı
+
+
+ Gizle
+
+
+ Etkin değilken gizle
+
+
+ Çerçeve
+
+
+ Kanallar
+
+
+ Görüntüleme
+
+
+ Bildirim
+
+
+ Giriş
+
+
+ Ayrılan pencere
+
+
+ Bu ses düzeyi tüm sekmelere uygulanır.
+
+
+ Gizlilik filtresi
+
+
+ Depolama
+
+
+ Saklama
+
+
+ Temizlik
+
+
+ Dışa aktar
+
+
+ Veritabanı
+
+
+ Uzantılar
+
+
+ Plugin bilgisi
+
+
+ Proje
+
+
+ Çevirmenler
+
+
+ Değişiklik günlüğü
+
+
+ Başarısız tell bildirimi
+
+
+ Gönderdiğiniz bir tell teslim edilemediğinde bildirim gösterir (alıcı çevrimdışı, örnekte veya sizi engelliyor).
+
+
+ Yalnızca plugin sembolleri göndermeden önce uyar
+
+
+ Göndermek üzere olduğunuz mesaj yalnızca HellionChat veya benzeri bir plugin kullanan oyunculara doğru görüntülenen semboller içerdiğinde uyarı gösterir.
+
+
+ Dünya eki
+
+
+ Sohbet günlüğünde gönderenin adına ana dünya adının ne zaman ekleneceği.
+
+
+ Ad biçimi
+
+
+ Gönderen adlarının sohbet günlüğünde nasıl gösterileceği. Tam ad varsayılandır.
+
+
+ Asla
+
+
+ Yalnızca diğer dünyalar
+
+
+ Her zaman
+
+
+ Tam ad
+
+
+ Yalnızca ad
+
+
+ Baş harfler
+
+
+ Özel ses düzeyi
+
+
+ Üç yerleşik özel bildirim sesinin oynatma ses düzeyi. 16 oyun sesini etkilemez.
+
+
+ Etkin olmayan pencere opaklığı
+
+
+ Ana sohbet penceresinin odaklanılmadığı durumlardaki arka plan opaklığı. Üstteki kaydırıcı odaklanılmış değeri belirler. Dalamud sabitleme menüsündeki pencere başına geçersiz kılma her ikisine de öncelik tanır.
+
+
+ Bildirim sesi
+
+
+ Başka bir sekmeye bakarken bu sekmeye mesaj geldiğinde ses çalar. Genel ses düğmesine uyar.
+
+
+ Ses
+
+
+ Seçili sesi önizle
+
+
+ Hellion sesi
+
+
+ Bir tell teslim edilemedi.
+
+
+ {0} kişisine tell teslim edilemedi.
+
+
+ Bu mesaj, diğer oyuncuların boş kutu olarak görebileceği yalnızca plugin semboller içeriyor. Yine de göndermek için Enter'a tekrar basın.
+
diff --git a/HellionChat/Resources/HellionStrings.uk.resx b/HellionChat/Resources/HellionStrings.uk.resx
index 2a677e4..5b9f792 100644
--- a/HellionChat/Resources/HellionStrings.uk.resx
+++ b/HellionChat/Resources/HellionStrings.uk.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- Конфіденційність
-
Увімкнути фільтр конфіденційності
@@ -24,9 +21,6 @@
Фільтр контролює лише те, що записується до локальної бази даних. У журналі чату все одно відображаються всі повідомлення в реальному часі; виключені канали просто більше не зберігаються. Якщо Ви також хочете прибрати канали з видимого відображення, скористайтесь звичайними фільтрами вкладок чату в грі.
-
- Фільтр конфіденційності та білий список
-
Виберіть, які канали зберігаються до локальної бази даних. За замовчуванням застосовується мінімізація даних: лише Ваші власні розмови. Скористайтесь кнопками нижче, щоб застосувати шаблон.
@@ -597,18 +591,6 @@
-
- Введення
-
-
- Звук & сповіщення
-
-
- Продуктивність
-
-
- Мова & допоміжні засоби введення
-
@@ -625,32 +607,11 @@
-
- Приховування
-
-
- Приховування при бездіяльності
-
Рамка вікна
-
- Підказки
-
-
- Auto-Tell-Tabs
-
-
- Поведінка повідомлень
-
-
- Попередній перегляд
-
-
- Емоції
-
@@ -672,15 +633,6 @@
-
- Інформація про версію
-
-
- Про HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
Створення та налаштування власних вкладок чату.
-
- Конфіденційність
-
-
- Фільтр конфіденційності за каналами та що може зберігатись.
-
База даних
@@ -824,10 +770,10 @@
Зберігання, міграція, видалення застарілого
- Інформація
+ Про плагін
- Версія, місія, ліцензія та changelog.
+ Розширення, версія, інформація про проект, перекладачі та changelog.
Теми
@@ -868,29 +814,11 @@
Перемикає макет повідомлень зі стандартного вигляду карток назад на однорядкові рядки `[HH:mm] Відправник: Текст`.
-
- Тема & Макет
-
-
- Тема, рамка вікна та стиль міток часу.
-
-
- Шрифти & Кольори
-
-
- Шрифт, розмір шрифту та кольори чату за каналами.
-
- Управління даними
+ Дані та конфіденційність
- Термін зберігання, очищення, експорт та статистика бази даних.
-
-
- Інтеграції
-
-
- Інші плагіни Dalamud, з якими працює HellionChat. Майбутні інтеграції в режимі попереднього перегляду.
+ Фільтр конфіденційності, термін зберігання, очищення, експорт та статистика бази даних.
Тема
@@ -907,39 +835,12 @@
Рівень прозорості фону вікна. Нижчі значення дозволяють грі більше просвічуватись. Порада: меню Dalamud для окремих вікон (іконка «гамбургер» у заголовку) пропонує окремі параметри для непрозорості, розмиття фону, прозорості для кліків та закріплення — вони мають пріоритет над цим повзунком для відповідного вікна.
-
- Шрифти
-
-
- Кольори чату
-
-
- Зберігання
-
-
- Термін зберігання
-
-
- Очищення
-
-
- Експорт
-
-
- Переглядач бази даних
-
Додаткові параметри (Shift+клік для відкриття)
-
- Поведінка
-
Hellion Chat 1.2.1 реорганізував меню налаштувань і видалив стару опцію «Перевизначити стиль» (замінена системою тем із версії 1.1.0). Решта налаштувань залишилась без змін. Прозорість вікна перенесена до розділу «Тема & Макет». Резервна копія попередньої конфігурації знаходиться за адресою pluginConfigs/HellionChat.json.pre-v16-backup поруч із активним HellionChat.json.
-
- Інтеграції
-
Інтеграції плагінів дозволяють HellionChat взаємодіяти з іншими встановленими плагінами Dalamud. Кожна інтеграція автоматично визначає свою ціль і тихо вимикається, якщо цільовий плагін відсутній.
@@ -1053,4 +954,195 @@
Вимикає плавне перемикання тем, анімації наведення для бічної панелі та карток, а також пульсацію непрочитаних вкладок. Зміна теми та стани наведення застосовуються миттєво.
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ Введення
+
+
+ Звук
+
+
+ Мова
+
+
+ Продуктивність
+
+
+ Звук, що відтворюється для кожної вкладки, налаштовується у вкладці «Канали».
+
+
+ Тема
+
+
+ Шрифти
+
+
+ Кольори
+
+
+ Стиль вікна
+
+
+ Мітки часу
+
+
+ Анімації
+
+
+ Повідомлення
+
+
+ Введення та попередній перегляд
+
+
+ Автоматичні вкладки tell
+
+
+ Емоції
+
+
+ Посилання та підказки
+
+
+ Мережа новачків
+
+
+ Приховати
+
+
+ Приховати при бездіяльності
+
+
+ Рамка
+
+
+ Канали
+
+
+ Відображення
+
+
+ Сповіщення
+
+
+ Введення
+
+
+ Окреме вікно
+
+
+ Цей рівень гучності застосовується до всіх вкладок.
+
+
+ Фільтр конфіденційності
+
+
+ Сховище
+
+
+ Зберігання
+
+
+ Очищення
+
+
+ Експорт
+
+
+ База даних
+
+
+ Розширення
+
+
+ Інформація про плагін
+
+
+ Проект
+
+
+ Перекладачі
+
+
+ Список змін
+
+
+ Сповіщення про невдале повідомлення
+
+
+ Показує спові��ення, якщо надіслане повідомлення не було доставлено (отримувач офлайн, в інстансі або заблокував вас).
+
+
+ Попередження перед відправкою символів плагіна
+
+
+ Показує попередження, якщо повідомлення, яке ви збираєтеся надіслати, містить символи, які відображаються коректно лише у гравців з HellionChat або подібним плагіном.
+
+
+ Суф��кс світу
+
+
+ Коли додавати назву рідного світу до імені відправника в журналі чату.
+
+
+ Формат імені
+
+
+ Як відображаються імена відправників у журналі чату. За замовчуванням — повне ім'я.
+
+
+ Ніколи
+
+
+ Лише інші світи
+
+
+ Завжди
+
+
+ Повне ім'я
+
+
+ Лише ім'я
+
+
+ Ініціали
+
+
+ Гучність власного звуку
+
+
+ Гучність відтворення трьох вбудованих власних звуків сповіщень. Не впливає на 16 ігрових звуків.
+
+
+ Непрозорість неактивного вікна
+
+
+ Непр��зорість фону головного вікна чату, коли воно не активне. Повзунок вище задає значення для активного вікна. Індивідуальне налаштування в меню закріплення Dalamud має пріоритет над обома.
+
+
+ Звук сповіщення
+
+
+ Відтворює звук, коли повідомлення надходить на цю вкладку, поки ви дивитесь іншу вкладку. Враховує глобальний перемикач звуку.
+
+
+ Звук
+
+
+ Попередній перегляд обраного звуку
+
+
+ Звук Hellion
+
+
+ Повідомлення не було доставлено.
+
+
+ Повідомлення для {0} не було доставлено.
+
+
+ Це повідомлення містить символи плагіна, які інші гр��вці можуть бачити як порожні квадрати. Натисніть Enter ще раз, щоб надіслати все одно.
+
diff --git a/HellionChat/Resources/HellionStrings.zh-Hans.resx b/HellionChat/Resources/HellionStrings.zh-Hans.resx
index 998b8ee..43c194b 100644
--- a/HellionChat/Resources/HellionStrings.zh-Hans.resx
+++ b/HellionChat/Resources/HellionStrings.zh-Hans.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 隐私
-
启用隐私过滤器
@@ -24,9 +21,6 @@
过滤器仅控制写入本地数据库的内容。聊天记录中仍会实时显示所有消息,被排除的频道只是不再被保存。如需从可见显示中移除某些频道,请使用游戏内正常的聊天标签页过滤功能。
-
- 隐私过滤器与白名单
-
选择哪些频道保存到本地数据库。默认遵循数据最小化原则,仅保存你自己的对话。点击下方按钮可应用预设方案。
@@ -597,18 +591,6 @@
-
- 输入
-
-
- 音频 & 通知
-
-
- 性能
-
-
- 语言 & 输入辅助
-
@@ -625,32 +607,11 @@
-
- 隐藏
-
-
- 闲置隐藏
-
窗口边框
-
- 提示框
-
-
- Auto-Tell-Tabs
-
-
- 消息行为
-
-
- 预览
-
-
- 情感动作
-
@@ -672,15 +633,6 @@
-
- 版本信息
-
-
- 关于 HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
创建并配置自定义聊天标签页。
-
- 隐私
-
-
- 各频道的隐私过滤器及允许保存的内容。
-
数据库
@@ -824,10 +770,10 @@
存储、迁移、历史清理
- 信息
+ 关于
- 版本、理念、许可证与更新日志。
+ 扩展、版本、项目信息、译者与更新日志。
主题
@@ -868,29 +814,11 @@
将消息布局从默认的卡片行样式切换回单行 `[HH:mm] 发送者: 文本` 显示。
-
- Theme & Layout
-
-
- 主题、窗口边框与时间戳样式。
-
-
- Fonts & Colours
-
-
- 字体、字号与各频道聊天颜色。
-
- 数据管理
+ 数据与隐私
- 保留策略、清理、导出与数据库统计。
-
-
- 集成
-
-
- 与 HellionChat 协同工作的其他 Dalamud 插件。即将推出的集成预览。
+ 隐私过滤器、保留策略、清理、导出与数据库统计。
主题
@@ -907,39 +835,12 @@
窗口背景的透明程度。数值越低,游戏背景透视效果越强。提示:Dalamud 的单窗口菜单(标题栏中的汉堡菜单)为每个窗口提供不透明度、背景模糊、点击穿透和固定等独立覆盖选项,这些设置对对应窗口具有优先级。
-
- 字体
-
-
- 聊天颜色
-
-
- 存储
-
-
- 保留
-
-
- 清理
-
-
- 导出
-
-
- 数据库查看器
-
高级选项(Shift+点击展开)
-
- 行为
-
Hellion Chat 1.2.1 已重新整理设置菜单,并移除了旧版"覆盖样式"选项(已由 1.1.0 引入的主题系统取代)。其余设置保持不变。窗口透明度已迁移至"Theme & Layout"。上一版配置的备份文件位于活动 HellionChat.json 旁边,文件名为 pluginConfigs/HellionChat.json.pre-v16-backup。
-
- 集成
-
插件集成功能让 HellionChat 能与其他已安装的 Dalamud 插件协同工作。每项集成会自动检测目标插件,目标插件缺失时将静默禁用。
@@ -1054,4 +955,195 @@
禁用主题交叉淡入淡出、侧边栏和卡片的悬停动画以及未读标签页的脉冲效果。主题切换和悬停状态将立即应用。
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ 输入
+
+
+ 声音
+
+
+ 语言
+
+
+ 性能
+
+
+ 每个标签页的提示音可在“频道”标签页中设置。
+
+
+ 主题
+
+
+ 字体
+
+
+ 颜色
+
+
+ 窗口样式
+
+
+ 时间戳
+
+
+ 动画
+
+
+ 消息
+
+
+ 输入与预览
+
+
+ 自动Tell标签页
+
+
+ 表情动作
+
+
+ 链接与工具提示
+
+
+ 新人频道
+
+
+ 隐藏
+
+
+ 无操作时隐藏
+
+
+ 边框
+
+
+ 频道
+
+
+ 显示
+
+
+ 通知
+
+
+ 输入
+
+
+ 弹出窗口
+
+
+ 此音量适用于所有标签页。
+
+
+ 隐私过滤器
+
+
+ 存储
+
+
+ 保留策略
+
+
+ 清理
+
+
+ 导出
+
+
+ 数据库
+
+
+ 扩展
+
+
+ 插件信息
+
+
+ 项目
+
+
+ 译者
+
+
+ 更新日志
+
+
+ 悄悄话失败通知
+
+
+ 当发送的悄悄话无法送达时(对方离线、在副本中或屏蔽了你),显示提示通知。
+
+
+ 发送插件专用符号前警告
+
+
+ 当即将发送的消息包含仅在使用 HellionChat 或类似插件的玩家端正确显示的符号时,显示警告。
+
+
+ 服务器后缀
+
+
+ 在聊天记录中,何时在发言者名称后附加其所在服务器。
+
+
+ 名称格式
+
+
+ 聊天记录中发���者名称的显示方式。默认为全名。
+
+
+ 从不
+
+
+ 仅其他服务器
+
+
+ 始终
+
+
+ 全名
+
+
+ 仅名
+
+
+ 首字母
+
+
+ 自定义通知音量
+
+
+ 三个内置自定义通知音的播放音量。不影响游戏的 16 个内置音效。
+
+
+ 非激活窗口透明度
+
+
+ 主聊天窗口未获焦点���的背景透明度。上方滑块设置获焦时的值。Dalamud 窗口固定菜单中的单独窗口设置优先级高于二者。
+
+
+ 通知音效
+
+
+ 当你在查看其他标签页时,此标签页收到消息时播放音效。遵循全局音效开关。
+
+
+ 音效
+
+
+ 预览所选音效
+
+
+ Hellion 音效
+
+
+ 悄悄话未能送达。
+
+
+ 发送给 {0} 的悄悄话未能送达。
+
+
+ 该消息包含插件专用符号,其他玩家可能看到空白方框。再次按 Enter 键强制发送。
+
diff --git a/HellionChat/Resources/HellionStrings.zh-Hant.resx b/HellionChat/Resources/HellionStrings.zh-Hant.resx
index e0a8dff..1cf648d 100644
--- a/HellionChat/Resources/HellionStrings.zh-Hant.resx
+++ b/HellionChat/Resources/HellionStrings.zh-Hant.resx
@@ -12,9 +12,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 隱私
-
啟用隱私篩選器
@@ -24,9 +21,6 @@
篩選器只控制寫入本地資料庫的內容。聊天紀錄仍會即時顯示所有訊息,被排除的頻道只是不再儲存。如果你也想從可見畫面中移除頻道,請使用遊戲內一般聊天標籤頁的篩選器。
-
- 隱私篩選器與白名單
-
選擇要儲存到本地資料庫的頻道。預設遵循資料最小化原則:只儲存你自己的對話。使用下方按鈕套用預設值。
@@ -597,18 +591,6 @@
-
- 輸入
-
-
- 音效 & 通知
-
-
- 效能
-
-
- 語言 & 輸入輔助
-
@@ -625,32 +607,11 @@
-
- 隱藏
-
-
- 閒置隱藏
-
視窗框架
-
- 提示
-
-
- Auto-Tell-Tabs
-
-
- 訊息行為
-
-
- 預覽
-
-
- 情感動作
-
@@ -672,15 +633,6 @@
-
- 版本資訊
-
-
- 關於 HellionChat
-
-
- Changelog
-
@@ -811,12 +763,6 @@
建立和設定自訂聊天標籤頁。
-
- 隱私
-
-
- 各頻道的隱私篩選器及可儲存的內容。
-
資料庫
@@ -824,10 +770,10 @@
儲存、遷移、舊版清理
- 資訊
+ 關於
- 版本、使命、授權和 Changelog。
+ 擴充功能、版本、專案資訊、譯者和 Changelog。
佈景主題
@@ -868,29 +814,11 @@
將訊息版面從預設的卡片列切換回單行 `[HH:mm] 發送者: 文字` 的顯示方式。
-
- Theme & Layout
-
-
- 佈景主題、視窗框架和時間戳樣式。
-
-
- Fonts & Colours
-
-
- 字型、字型大小和各頻道的聊天顏色。
-
- 資料管理
+ 資料與隱私
- 保留、清理、匯出和資料庫統計資訊。
-
-
- 整合
-
-
- HellionChat 可搭配使用的其他 Dalamud 插件。即將推出的整合功能預覽。
+ 隱私過濾器、保留、清理、匯出和資料庫統計資訊。
佈景主題
@@ -907,39 +835,12 @@
視窗背景的透明程度。數值越低,遊戲畫面越能透出。提示:Dalamud 的每個視窗選單(標題列的漢堡選單)提供各視窗獨立的不透明度、背景模糊、點擊穿透和釘選覆寫設定,這些設定對各自的視窗有優先於此滑桿的效果。
-
- 字型
-
-
- 聊天頻道顏色
-
-
- 儲存
-
-
- 保留
-
-
- 清理
-
-
- 匯出
-
-
- 資料庫檢視器
-
進階(Shift+點擊開啟)
-
- 行為
-
Hellion Chat 1.2.1 已重新整理設定選單,並移除舊的「覆寫樣式」選項(已由 1.1.0 的佈景主題系統取代)。你其餘的設定保持不變。視窗透明度已遷移至「Theme & Layout」。先前設定的備份位於 pluginConfigs/HellionChat.json.pre-v16-backup,與目前使用中的 HellionChat.json 位於同一目錄。
-
- 整合
-
插件整合功能讓 HellionChat 能與其他已安裝的 Dalamud 插件協同運作。每個整合功能會自動偵測目標插件,並在目標插件不存在時靜默停用自身。
@@ -1054,4 +955,195 @@
停用佈景主題交叉淡入淡出、側邊欄與卡片的滑鼠停留動畫以及未讀分頁的脈衝效果。佈景主題切換與滑鼠停留狀態將立即套用。
AI-assisted machine translation. Pending native-speaker review.
+
+
+
+ 輸入
+
+
+ 聲音
+
+
+ 語言
+
+
+ 效能
+
+
+ 每個標籤頁的提示音可在「頻道」標籤頁中設定。
+
+
+ 主題
+
+
+ 字型
+
+
+ 顏色
+
+
+ 視窗樣式
+
+
+ 時間戳記
+
+
+ 動畫
+
+
+ 訊息
+
+
+ 輸入與預覽
+
+
+ 自動Tell標籤頁
+
+
+ 情感動作
+
+
+ 連結與工具提示
+
+
+ 新手頻道
+
+
+ 隱藏
+
+
+ 閒置時隱藏
+
+
+ 邊框
+
+
+ 頻道
+
+
+ 顯示
+
+
+ 通知
+
+
+ 輸入
+
+
+ 彈出視窗
+
+
+ 此音量適用於所有標籤頁。
+
+
+ 隱私過濾器
+
+
+ 儲存
+
+
+ 保留原則
+
+
+ 清理
+
+
+ 匯出
+
+
+ 資料庫
+
+
+ 擴充功能
+
+
+ 插件資訊
+
+
+ 專案
+
+
+ 譯者
+
+
+ 更新記錄
+
+
+ 悄悄話失敗通知
+
+
+ 當發送的悄悄話無法送達時(對方離線、在副本中或封鎖了你),顯示提示通知。
+
+
+ 發送插件專用符號前警告
+
+
+ 當即將發送的訊息包含僅在使用 HellionChat 或類似插件的玩家端正確顯示的符號時,顯示警告。
+
+
+ 伺服器後綴
+
+
+ 在聊天記錄中,何時在發言者名稱後附加其所在伺服器。
+
+
+ 名稱格式
+
+
+ 聊天記錄中發言者名稱的顯示方式。預設為全名。
+
+
+ 從不
+
+
+ 僅其他伺服器
+
+
+ 始終
+
+
+ 全名
+
+
+ 僅名
+
+
+ 首字母縮寫
+
+
+ 自訂通知音量
+
+
+ 三個內建自訂通知音的播放音量。不影響遊戲的 16 個內建音效。
+
+
+ 非啟用視窗透明度
+
+
+ 主聊天視窗未獲焦點時的背景透明度。上方滑桿設定獲焦時的值。Dalamud ���窗固定選單中的個別視窗設定優先於兩者。
+
+
+ 通知音效
+
+
+ 當你在查看其他分頁時,此分頁收到訊息時播放音效。遵循全域音效開關。
+
+
+ 音效
+
+
+ 預覽所選音效
+
+
+ Hellion 音效
+
+
+ 悄悄話未能送達。
+
+
+ 發送給 {0} 的悄悄話未能送達。
+
+
+ 該訊息包含插件專用符號,其他玩家可能看到空白方框。再次按 Enter 鍵強制發送。
+
diff --git a/HellionChat/Ui/ChatInputBar.cs b/HellionChat/Ui/ChatInputBar.cs
index 511facb..079c0ec 100644
--- a/HellionChat/Ui/ChatInputBar.cs
+++ b/HellionChat/Ui/ChatInputBar.cs
@@ -1,9 +1,11 @@
using System;
using System.Numerics;
using Dalamud.Bindings.ImGui;
+using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using HellionChat._Helpers;
using HellionChat.Code;
+using HellionChat.Resources;
using HellionChat.Util;
namespace HellionChat.Ui;
@@ -19,6 +21,11 @@ public sealed class ChatInputBar
private readonly Func _activeTabAccessor;
private readonly InputState _state = new();
+ // UI-11: the buffer for which a plugin-disclosure warning was already
+ // shown. A second Enter on the same buffer sends it anyway; editing the
+ // buffer clears the arming so the next send is re-checked.
+ private string? _disclosureArmedBuffer;
+
public ChatInputBar(Plugin plugin, ChatLogWindow host, Func activeTabAccessor)
{
_plugin = plugin;
@@ -80,11 +87,33 @@ public sealed class ChatInputBar
{
SubmitCompact(tab);
}
+
+ // UI-11: disclosure warning, visible only while an armed buffer is held
+ // unchanged. Editing the buffer clears the condition automatically.
+ if (Plugin.Config.NotifyPluginDisclosure
+ && _disclosureArmedBuffer is not null
+ && _state.Buffer == _disclosureArmedBuffer)
+ {
+ ImGui.TextColored(ImGuiColors.DalamudYellow, HellionStrings.ChatInput_PluginDisclosure_Warning);
+ }
}
// TEST-MIRROR: ../_Helpers/CompactInputSubmitter.cs
- private void SubmitCompact(Tab tab) =>
+ private void SubmitCompact(Tab tab)
+ {
+ if (Plugin.Config.NotifyPluginDisclosure
+ && _state.Buffer != _disclosureArmedBuffer
+ && PluginDisclosureScanner.ContainsPrivateUseGlyph(_state.Buffer))
+ {
+ // First send attempt on this exact buffer: arm and hold. The buffer
+ // is kept, the warning renders, the user can press Enter again.
+ _disclosureArmedBuffer = _state.Buffer;
+ return;
+ }
+
+ _disclosureArmedBuffer = null;
CompactInputSubmitter.TrySubmit(_state, tab, _host.SendChatBoxFromExternal);
+ }
// History navigation callback. Cursor math delegated to
// CompactInputHistoryNavigator; ImGui buffer splice stays here.
diff --git a/HellionChat/Ui/ChatLogWindow.cs b/HellionChat/Ui/ChatLogWindow.cs
index 072cb5f..c2ac93c 100644
--- a/HellionChat/Ui/ChatLogWindow.cs
+++ b/HellionChat/Ui/ChatLogWindow.cs
@@ -5,6 +5,7 @@ using System.Runtime.InteropServices;
using System.Text;
using Dalamud.Bindings.ImGui;
using Dalamud.Game.Addon.Lifecycle;
+using Dalamud.Interface.Colors;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Interface;
@@ -15,6 +16,7 @@ using Dalamud.Interface.Windowing;
using Dalamud.Memory;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
+using HellionChat._Helpers;
using HellionChat.Code;
using HellionChat.GameFunctions;
using HellionChat.GameFunctions.Types;
@@ -55,6 +57,11 @@ public sealed class ChatLogWindow : Window
private int ActivatePos = -1;
internal string Chat = string.Empty;
+ // UI-11: the main-window input buffer for which a plugin-disclosure
+ // warning was already shown. Mirrors _disclosureArmedBuffer in
+ // ChatInputBar — a second Enter on the same buffer sends it anyway.
+ private string? _disclosureArmedBufferMain;
+
// Input history extracted into InputHistoryService so pop-out windows share
// the same Up/Down history. Cursor stays window-local (independent navigation).
private int InputBacklogIdx = -1;
@@ -709,7 +716,15 @@ public sealed class ChatLogWindow : Window
// Window-Deckkraft eingestellt hat, hat dieses Per-Window-Override
// Vorrang über unseren Slider — wir dokumentieren das im HelpMarker.
if (LastViewport == ImGuiHelpers.MainViewport.Handle && !WasDocked)
- BgAlpha = Plugin.Config.WindowOpacity;
+ {
+ // UI-12: focus-dependent opacity. PreOpenCheck runs before Begin();
+ // Window.IsFocused holds last frame's RootAndChildWindows focus, set
+ // by Dalamud's WindowHost after Begin(). One-frame latency is
+ // accepted.
+ BgAlpha = IsFocused
+ ? Plugin.Config.WindowOpacity
+ : Plugin.Config.WindowOpacityInactive;
+ }
LastViewport = ImGui.GetWindowViewport().Handle;
WasDocked = ImGui.IsWindowDocked();
@@ -1073,6 +1088,10 @@ public sealed class ChatLogWindow : Window
{
Chat = chatCopy;
+ // UI-11: Escape cancels the input — drop any pending
+ // disclosure arming so the warning does not linger.
+ _disclosureArmedBufferMain = null;
+
if (activeTab.CurrentChannel.UseTempChannel)
{
activeTab.CurrentChannel.ResetTempChannel();
@@ -1082,17 +1101,39 @@ public sealed class ChatLogWindow : Window
if (ImGui.IsKeyDown(ImGuiKey.Enter) || ImGui.IsKeyDown(ImGuiKey.KeypadEnter))
{
- Plugin.CommandHelpWindow.IsOpen = false;
- SendChatBox(activeTab);
-
- if (activeTab.CurrentChannel.UseTempChannel)
+ if (Plugin.Config.NotifyPluginDisclosure
+ && Chat != _disclosureArmedBufferMain
+ && PluginDisclosureScanner.ContainsPrivateUseGlyph(Chat))
{
- activeTab.CurrentChannel.ResetTempChannel();
- SetChannel(activeTab.CurrentChannel.Channel);
+ // First send attempt on this exact buffer: arm and hold.
+ // The warning renders below the input.
+ _disclosureArmedBufferMain = Chat;
+ }
+ else
+ {
+ _disclosureArmedBufferMain = null;
+ Plugin.CommandHelpWindow.IsOpen = false;
+ SendChatBox(activeTab);
+
+ if (activeTab.CurrentChannel.UseTempChannel)
+ {
+ activeTab.CurrentChannel.ResetTempChannel();
+ SetChannel(activeTab.CurrentChannel.Channel);
+ }
}
}
}
+ // UI-11: disclosure warning for the main-window input, mirrors the
+ // ChatInputBar path. Visible only while the armed buffer is held
+ // unchanged; editing the buffer clears the condition.
+ if (Plugin.Config.NotifyPluginDisclosure
+ && _disclosureArmedBufferMain is not null
+ && Chat == _disclosureArmedBufferMain)
+ {
+ ImGui.TextColored(ImGuiColors.DalamudYellow, HellionStrings.ChatInput_PluginDisclosure_Warning);
+ }
+
// Process keybinds that have modifiers while the chat is focused.
if (inputActive)
{
@@ -3035,6 +3076,14 @@ public sealed class ChatLogWindow : Window
float lineWidth = 0f
)
{
+ // UI-7: render a copy with the sender name reformatted per the user's
+ // display options. Skipped in screenshot mode so the name-anonymising
+ // path in DrawChunk stays reliable (privacy wins). ForDisplay returns
+ // the list unchanged when nothing applies, so non-sender lists and the
+ // neutral default cost only a quick scan.
+ if (!ScreenshotMode)
+ chunks = SenderNameDisplay.ForDisplay(chunks);
+
using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero);
for (var i = 0; i < chunks.Count; i++)
diff --git a/HellionChat/Ui/FirstRunWizard.cs b/HellionChat/Ui/FirstRunWizard.cs
index 2247c05..568a42d 100644
--- a/HellionChat/Ui/FirstRunWizard.cs
+++ b/HellionChat/Ui/FirstRunWizard.cs
@@ -365,10 +365,10 @@ public sealed class FirstRunWizard : Window
if (ImGui.Checkbox(HellionStrings.Wizard_Step3_LoadPreviousSession_Label, ref loadPrev))
{
_state.PendingLoadPreviousSession = loadPrev;
- // Mirror the DataManagement coupling: turning load-previous on
+ // Mirror the DataAndPrivacy coupling: turning load-previous on
// also turns filter-include on (otherwise old messages bypass
// the filter chain), and turning filter-include off forces
- // load-previous off. Same idiom as Ui/SettingsTabs/DataManagement.cs:182-200.
+ // load-previous off. Same idiom as Ui/SettingsTabs/DataAndPrivacy.cs.
if (loadPrev)
_state.PendingFilterIncludePreviousSessions = true;
}
diff --git a/HellionChat/Ui/Settings.cs b/HellionChat/Ui/Settings.cs
index 00c7161..5ce19f8 100755
--- a/HellionChat/Ui/Settings.cs
+++ b/HellionChat/Ui/Settings.cs
@@ -24,6 +24,10 @@ public sealed class SettingsWindow : Dalamud.Interface.Windowing.Window
private List Tabs { get; }
private int CurrentTab;
private SettingsView View = SettingsView.Overview;
+
+ // Set when a section is freshly entered; the first Draw afterwards reads it
+ // and clears it, so each section starts collapsed every time it is opened.
+ private bool _sectionJustEntered;
private readonly SettingsOverview Overview;
internal SettingsWindow(Plugin plugin, ILoggerFactory loggerFactory)
@@ -46,15 +50,12 @@ public sealed class SettingsWindow : Dalamud.Interface.Windowing.Window
Tabs =
[
new General(Plugin, Mutable),
- new ThemeAndLayout(Plugin, Mutable, loggerFactory.CreateLogger()),
- new FontsAndColours(Plugin, Mutable, loggerFactory.CreateLogger()),
- new SettingsTabs.Window(Plugin, Mutable),
+ new Appearance(Plugin, Mutable, loggerFactory.CreateLogger()),
new Chat(Plugin, Mutable),
+ new SettingsTabs.Window(Plugin, Mutable),
new SettingsTabs.Tabs(Plugin, Mutable),
- new SettingsTabs.Privacy(Plugin, Mutable),
- new DataManagement(Plugin, Mutable, loggerFactory.CreateLogger()),
- new SettingsTabs.Integrations(Plugin, Mutable),
- new Information(Mutable),
+ new DataAndPrivacy(Plugin, Mutable, loggerFactory.CreateLogger()),
+ new About(Plugin, Mutable),
];
RespectCloseHotkey = false;
@@ -106,6 +107,7 @@ public sealed class SettingsWindow : Dalamud.Interface.Windowing.Window
{
CurrentTab = tabIndex;
View = SettingsView.Detail;
+ _sectionJustEntered = true;
}
internal void OpenOverview()
@@ -148,7 +150,10 @@ public sealed class SettingsWindow : Dalamud.Interface.Windowing.Window
using var child = ImRaii.Child("##chat2-settings-detail", new Vector2(-1, height));
if (child.Success)
- Tabs[CurrentTab].Draw(false);
+ {
+ Tabs[CurrentTab].Draw(_sectionJustEntered);
+ _sectionJustEntered = false;
+ }
}
private void DrawSaveButtons()
diff --git a/HellionChat/Ui/SettingsOverview.cs b/HellionChat/Ui/SettingsOverview.cs
index be64b06..88fda98 100644
--- a/HellionChat/Ui/SettingsOverview.cs
+++ b/HellionChat/Ui/SettingsOverview.cs
@@ -21,44 +21,29 @@ internal sealed class SettingsOverview
),
(
FontAwesomeIcon.Palette,
- HellionStrings.Settings_Card_ThemeAndLayout_Title,
- HellionStrings.Settings_Card_ThemeAndLayout_Subtext
- ),
- (
- FontAwesomeIcon.Font,
- HellionStrings.Settings_Card_FontsAndColours_Title,
- HellionStrings.Settings_Card_FontsAndColours_Subtext
- ),
- (
- FontAwesomeIcon.WindowMaximize,
- HellionStrings.Settings_Card_Window_Title,
- HellionStrings.Settings_Card_Window_Subtext
+ HellionStrings.Settings_Card_Appearance_Title,
+ HellionStrings.Settings_Card_Appearance_Subtext
),
(
FontAwesomeIcon.Comments,
HellionStrings.Settings_Card_Chat_Title,
HellionStrings.Settings_Card_Chat_Subtext
),
+ (
+ FontAwesomeIcon.WindowMaximize,
+ HellionStrings.Settings_Card_Window_Title,
+ HellionStrings.Settings_Card_Window_Subtext
+ ),
(
FontAwesomeIcon.FolderTree,
HellionStrings.Settings_Card_Tabs_Title,
HellionStrings.Settings_Card_Tabs_Subtext
),
- (
- FontAwesomeIcon.ShieldAlt,
- HellionStrings.Settings_Card_Privacy_Title,
- HellionStrings.Settings_Card_Privacy_Subtext
- ),
(
FontAwesomeIcon.Database,
HellionStrings.Settings_Card_DataManagement_Title,
HellionStrings.Settings_Card_DataManagement_Subtext
),
- (
- FontAwesomeIcon.Plug,
- HellionStrings.Settings_Card_Integrations_Title,
- HellionStrings.Settings_Card_Integrations_Subtext
- ),
(
FontAwesomeIcon.InfoCircle,
HellionStrings.Settings_Card_Information_Title,
diff --git a/HellionChat/Ui/SettingsTabs/About.cs b/HellionChat/Ui/SettingsTabs/About.cs
new file mode 100644
index 0000000..c20581a
--- /dev/null
+++ b/HellionChat/Ui/SettingsTabs/About.cs
@@ -0,0 +1,493 @@
+using System.Numerics;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface;
+using Dalamud.Interface.Colors;
+using Dalamud.Interface.Utility;
+using Dalamud.Interface.Utility.Raii;
+using HellionChat.Branding;
+using HellionChat.Integrations;
+using HellionChat.Resources;
+using HellionChat.Util;
+
+namespace HellionChat.Ui.SettingsTabs;
+
+// The About tab absorbs the former Integrations tab (now the first section)
+// and organises its remaining content into four thematic sections.
+internal sealed class About : ISettingsTab
+{
+ private Plugin Plugin { get; }
+ private Configuration Mutable { get; }
+
+ public string Name => HellionStrings.Settings_Tab_Information + "###tabs-information";
+
+ private readonly List Translators =
+ [
+ "q673135110",
+ "Akizem",
+ "d0tiKs",
+ "Moonlight_Everlit",
+ "Dark32",
+ "andreycout",
+ "Button_",
+ "Cali666",
+ "cassandra308",
+ "lokinmodar",
+ "jtabox",
+ "AkiraYorumoto",
+ "MKhayle",
+ "elena.space",
+ "imlisa",
+ "andrei5125",
+ "ShivaMaheshvara",
+ "aislinn87",
+ "nishinatsu051",
+ "lichuyuan",
+ "Risu64",
+ "yummypillow",
+ "witchymary",
+ "Yuzumi",
+ "zomsakura",
+ "Sirayuki",
+ ];
+
+ internal About(Plugin plugin, Configuration mutable)
+ {
+ Plugin = plugin;
+ Mutable = mutable;
+ Translators.Sort(
+ (a, b) =>
+ string.Compare(a.ToLowerInvariant(), b.ToLowerInvariant(), StringComparison.Ordinal)
+ );
+ }
+
+ public void Draw(bool sectionJustEntered)
+ {
+ using var wrap = ImRaii.TextWrapPos(0.0f);
+
+ DrawExtensionsSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawPluginInfoSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawProjectSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawTranslatorsSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawChangelogSection(sectionJustEntered);
+ }
+
+ // ── Extensions ──────────────────────────────────────────────────────────
+
+ private void DrawExtensionsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered)
+ ImGui.SetNextItemOpen(false);
+
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Extensions);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.TextWrapped(HellionStrings.Settings_Integrations_Intro);
+ ImGui.Spacing();
+ ImGui.Spacing();
+
+ DrawHonorificSection();
+ ImGui.Spacing();
+ ImGui.Spacing();
+
+ DrawComingSoonSection();
+ ImGui.Spacing();
+ ImGui.Spacing();
+
+ DrawGotAnIdeaSection();
+ }
+ }
+
+ private void DrawHonorificSection()
+ {
+ DrawSectionHeader(HellionStrings.Settings_Integrations_Honorific_SectionHeader);
+
+ DrawHonorificStatus();
+ ImGui.Spacing();
+
+ // Toggle works regardless of detection state: "show when available,
+ // hide otherwise". Disabling it when Honorific is missing would force
+ // the user to retoggle on every reload.
+ if (
+ ImGui.Checkbox(
+ HellionStrings.Settings_Integrations_Honorific_Toggle,
+ ref Mutable.ShowHonorificTitleInHeader
+ )
+ )
+ {
+ Plugin.SaveConfig();
+ }
+
+ using (ImRaii.PushIndent())
+ {
+ using (
+ ImRaii.PushColor(
+ ImGuiCol.Text,
+ ColourUtil.RgbaToAbgr(Plugin.ThemeRegistry.Active.Colors.TextMuted)
+ )
+ )
+ {
+ ImGui.TextWrapped(HellionStrings.Settings_Integrations_Honorific_ToggleHint);
+ }
+
+ if (
+ ImGui.Checkbox(
+ HellionStrings.Settings_Integrations_Honorific_Glow_Toggle,
+ ref Mutable.ShowHonorificGlow
+ )
+ )
+ {
+ Plugin.SaveConfig();
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Integrations_Honorific_Glow_Hint);
+ }
+
+ // Honorific has no LICENSE in its repo so we link upstream and author
+ // instead of bundling assets. Text labels because FA Brands isn't
+ // guaranteed in Dalamud's font set.
+ ImGui.Spacing();
+ if (ImGui.Button(HellionStrings.Settings_Integrations_Honorific_LinkRepo))
+ {
+ Plugin.PlatformUtil.OpenLink(IntegrationLinks.HonorificRepo);
+ }
+ ImGui.SameLine();
+ if (ImGui.Button(HellionStrings.Settings_Integrations_Honorific_LinkAuthor))
+ {
+ Plugin.PlatformUtil.OpenLink(IntegrationLinks.HonorificAuthor);
+ }
+ }
+
+ private void DrawHonorificStatus()
+ {
+ var theme = Plugin.ThemeRegistry.Active;
+ var service = Plugin.HonorificService;
+
+ if (service.IsAvailable && service.DetectedApiVersion is { } version)
+ {
+ DrawStatusGlyph('●', theme.Colors.StatusSuccess);
+ ImGui.SameLine();
+ ImGui.TextUnformatted(
+ string.Format(
+ HellionStrings.Settings_Integrations_Honorific_Status_Detected,
+ version.Major,
+ version.Minor
+ )
+ );
+ }
+ else if (service.DetectedApiVersion is { } incompatibleVersion)
+ {
+ DrawStatusGlyph('⚠', theme.Colors.StatusWarning);
+ ImGui.SameLine();
+ ImGui.TextUnformatted(
+ string.Format(
+ HellionStrings.Settings_Integrations_Honorific_Status_Incompatible,
+ HonorificService.ExpectedApiMajor,
+ incompatibleVersion.Major,
+ incompatibleVersion.Minor
+ )
+ );
+ }
+ else
+ {
+ DrawStatusGlyph('○', theme.Colors.TextMuted);
+ ImGui.SameLine();
+ ImGui.TextUnformatted(
+ HellionStrings.Settings_Integrations_Honorific_Status_NotInstalled
+ );
+ }
+ }
+
+ private static void DrawStatusGlyph(char glyph, uint rgba)
+ {
+ using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(rgba)))
+ {
+ ImGui.TextUnformatted(glyph.ToString());
+ }
+ }
+
+ private void DrawComingSoonSection()
+ {
+ DrawSectionHeader(HellionStrings.Settings_Integrations_ComingSoon_SectionHeader);
+ ImGui.TextWrapped(HellionStrings.Settings_Integrations_ComingSoon_Intro);
+ ImGui.Spacing();
+
+ // Each integration cycle removes its stub here and adds a full section above.
+ DrawComingSoonItem(
+ HellionStrings.Settings_Integrations_ComingSoon_ContextMenu_Title,
+ HellionStrings.Settings_Integrations_ComingSoon_ContextMenu_Description
+ );
+ DrawComingSoonItem(
+ HellionStrings.Settings_Integrations_ComingSoon_Notifications_Title,
+ HellionStrings.Settings_Integrations_ComingSoon_Notifications_Description
+ );
+ DrawComingSoonItem(
+ HellionStrings.Settings_Integrations_ComingSoon_RPStatus_Title,
+ HellionStrings.Settings_Integrations_ComingSoon_RPStatus_Description
+ );
+ DrawComingSoonItem(
+ HellionStrings.Settings_Integrations_ComingSoon_ExtraChat_Title,
+ HellionStrings.Settings_Integrations_ComingSoon_ExtraChat_Description
+ );
+ DrawComingSoonItem(
+ HellionStrings.Settings_Integrations_ComingSoon_QuickDM_Title,
+ HellionStrings.Settings_Integrations_ComingSoon_QuickDM_Description
+ );
+ }
+
+ private void DrawComingSoonItem(string title, string description)
+ {
+ var theme = Plugin.ThemeRegistry.Active;
+ using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.TextMuted)))
+ using (Plugin.FontManager.FontAwesome.Push())
+ {
+ ImGui.TextUnformatted(FontAwesomeIcon.Hourglass.ToIconString());
+ }
+ ImGui.SameLine();
+ ImGui.TextUnformatted(title);
+ using (ImRaii.PushIndent())
+ {
+ using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.TextMuted)))
+ {
+ ImGui.TextWrapped(description);
+ }
+ }
+ ImGui.Spacing();
+ }
+
+ private void DrawGotAnIdeaSection()
+ {
+ DrawSectionHeader(HellionStrings.Settings_Integrations_GotAnIdea_SectionHeader);
+ ImGui.TextWrapped(HellionStrings.Settings_Integrations_GotAnIdea_Body);
+ ImGui.Spacing();
+
+ if (ImGui.Button(HellionStrings.Settings_Integrations_GotAnIdea_LinkLabel))
+ {
+ Plugin.PlatformUtil.OpenLink(BrandingLinks.HellionForgeDiscordInvite);
+ }
+ }
+
+ private void DrawSectionHeader(string label)
+ {
+ var theme = Plugin.ThemeRegistry.Active;
+ using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.Primary)))
+ {
+ ImGui.TextUnformatted("── " + label + " ──");
+ }
+ }
+
+ // ── Plugin info ──────────────────────────────────────────────────────────
+
+ private void DrawPluginInfoSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered)
+ ImGui.SetNextItemOpen(false);
+
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_PluginInfo);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ DrawFoxBanner();
+ ImGuiHelpers.ScaledDummy(6.0f);
+
+ ImGui.TextUnformatted(string.Format(Language.Options_About_Opening, Plugin.PluginName));
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextUnformatted(Language.Options_About_Authors);
+ ImGui.SameLine();
+ ImGui.TextColored(ImGuiColors.ParsedGold, Plugin.Interface.Manifest.Author);
+
+ ImGui.TextUnformatted(Language.Options_About_Discord);
+ ImGui.SameLine();
+ ImGui.TextColored(ImGuiColors.ParsedGold, "@j.j_kazama");
+
+ ImGui.TextUnformatted(Language.Options_About_Version);
+ ImGui.SameLine();
+ ImGui.TextColored(
+ ImGuiColors.ParsedOrange,
+ Plugin.Interface.Manifest.AssemblyVersion.ToString(3)
+ );
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextUnformatted(Language.Options_About_Github_Issues);
+ ImGui.SameLine();
+ if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "githubIssues"))
+ Plugin.PlatformUtil.OpenLink(
+ "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/issues"
+ );
+ }
+ }
+
+ private void DrawFoxBanner()
+ {
+ var banner = FoxBannerTexture.Shared.GetWrapOrDefault();
+ if (banner is null)
+ return;
+
+ const uint CardColor = 0xFFE8E8E8; // off-white fill so the dark fox pops
+ var imgHeight = 170f * ImGuiHelpers.GlobalScale;
+ var imgWidth = imgHeight * banner.Size.X / banner.Size.Y;
+ var pad = 14f * ImGuiHelpers.GlobalScale;
+ var cardWidth = imgWidth + pad * 2f;
+ var cardHeight = imgHeight + pad * 2f;
+ var rounding = 8f * ImGuiHelpers.GlobalScale;
+
+ // Left-aligned: card origin stays at the current layout cursor position.
+ var cardOrigin = ImGui.GetCursorScreenPos();
+
+ // Draw the rounded card behind the image, then place the image on top.
+ ImGui
+ .GetWindowDrawList()
+ .AddRectFilled(
+ cardOrigin,
+ cardOrigin + new Vector2(cardWidth, cardHeight),
+ CardColor,
+ rounding
+ );
+ ImGui.SetCursorScreenPos(cardOrigin + new Vector2(pad, pad));
+ ImGui.Image(banner.Handle, new Vector2(imgWidth, imgHeight));
+
+ // Advance the layout cursor past the full card so content below does not overlap.
+ ImGui.SetCursorScreenPos(cardOrigin);
+ ImGui.Dummy(new Vector2(cardWidth, cardHeight));
+ }
+
+ // ── The Project ──────────────────────────────────────────────────────────
+
+ private void DrawProjectSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered)
+ ImGui.SetNextItemOpen(false);
+
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Project);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Maintainer_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_Maintainer_Body);
+ ImGui.TextUnformatted(HellionStrings.About_Maintainer_Website_Label);
+ ImGui.SameLine();
+ if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "hellionMedia"))
+ Plugin.PlatformUtil.OpenLink("https://hellion-media.de");
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Mission_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_Mission_P1);
+ ImGui.Spacing();
+ ImGui.TextUnformatted(HellionStrings.About_Mission_P2);
+ ImGui.Spacing();
+ ImGui.TextUnformatted(HellionStrings.About_Mission_P3);
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_BuiltOn_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_BuiltOn_P1);
+ ImGui.Spacing();
+ ImGui.TextUnformatted(HellionStrings.About_BuiltOn_P2);
+ ImGui.Spacing();
+ ImGui.TextUnformatted(HellionStrings.About_BuiltOn_Upstream_Label);
+ ImGui.SameLine();
+ if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "chatTwoUpstream"))
+ Plugin.PlatformUtil.OpenLink("https://github.com/Infiziert90/ChatTwo");
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_License_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_License_P1);
+ ImGui.TextUnformatted(HellionStrings.About_License_P2);
+ ImGui.TextUnformatted(HellionStrings.About_License_P3);
+
+ ImGuiHelpers.ScaledDummy(10.0f);
+
+ ImGui.TextColored(ImGuiColors.DalamudOrange, HellionStrings.About_SE_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_SE_P1);
+ ImGui.TextUnformatted(HellionStrings.About_SE_P2);
+
+ ImGui.Spacing();
+
+ ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Localization_Heading);
+ ImGui.TextUnformatted(HellionStrings.About_Localization_P1);
+ ImGui.TextUnformatted(HellionStrings.About_Localization_P2);
+ }
+ }
+
+ // ── Translators ──────────────────────────────────────────────────────────
+
+ private void DrawTranslatorsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered)
+ ImGui.SetNextItemOpen(false);
+
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Translators);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // The translator list belongs to the Chat 2 upstream Crowdin project.
+ using var translatorTree = ImRaii.TreeNode(HellionStrings.About_Translators_TreeNode);
+ if (translatorTree)
+ {
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+ foreach (var translator in Translators)
+ ImGui.TextUnformatted(translator);
+ }
+ }
+ }
+
+ // ── Changelog ────────────────────────────────────────────────────────────
+
+ private void DrawChangelogSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered)
+ ImGui.SetNextItemOpen(false);
+
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Changelog);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.Checkbox(Language.Options_PrintChangelog_Name, ref Mutable.PrintChangelog);
+ ImGuiUtil.HelpMarker(Language.Options_PrintChangelog_Description);
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ var changelog = Plugin.Interface.Manifest.Changelog;
+ if (changelog == null)
+ return;
+
+ ImGui.TextUnformatted(Language.Options_Changelog_Header);
+ ImGui.TextUnformatted(
+ $"Version {Plugin.Interface.Manifest.AssemblyVersion.ToString(3)}"
+ );
+ ImGui.Spacing();
+ foreach (var sentence in changelog.Split("\n"))
+ {
+ if (sentence == string.Empty)
+ {
+ ImGui.NewLine();
+ continue;
+ }
+
+ var indented = sentence.StartsWith('-') || sentence.StartsWith(" -");
+ using var indent = ImRaii.PushIndent(10.0f, true, indented);
+ ImGui.TextUnformatted(sentence);
+ }
+ }
+ }
+}
diff --git a/HellionChat/Ui/SettingsTabs/Appearance.cs b/HellionChat/Ui/SettingsTabs/Appearance.cs
new file mode 100644
index 0000000..6dc985b
--- /dev/null
+++ b/HellionChat/Ui/SettingsTabs/Appearance.cs
@@ -0,0 +1,688 @@
+using System.Numerics;
+using Dalamud;
+using Dalamud.Bindings.ImGui;
+using Dalamud.Interface;
+using Dalamud.Interface.FontIdentifier;
+using Dalamud.Interface.Utility;
+using Dalamud.Interface.Utility.Raii;
+using HellionChat.Code;
+using HellionChat.Resources;
+using HellionChat.Themes;
+using HellionChat.Util;
+using Microsoft.Extensions.Logging;
+
+namespace HellionChat.Ui.SettingsTabs;
+
+internal sealed class Appearance : ISettingsTab
+{
+ private Plugin Plugin { get; }
+ private Configuration Mutable { get; }
+ private readonly ILogger _logger;
+
+ private string? _applyDismissedFor;
+
+ public string Name =>
+ HellionStrings.Settings_Tab_Appearance + "###tabs-appearance";
+
+ internal Appearance(Plugin plugin, Configuration mutable, ILogger logger)
+ {
+ Plugin = plugin;
+ Mutable = mutable;
+ _logger = logger;
+ }
+
+ public void Draw(bool sectionJustEntered)
+ {
+ DrawThemeSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawFontsSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawColoursSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawWindowStyleSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawTimestampSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawAnimationsSection(sectionJustEntered);
+ }
+
+ // ── Theme ──────────────────────────────────────────────────────────────
+
+ private void DrawThemeSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Theme);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ var registry = Plugin.ThemeRegistry;
+ var active = registry.Get(Mutable.Theme);
+
+ ImGui.TextUnformatted(
+ string.Format(HellionStrings.Settings_Themes_Active, active.Name)
+ );
+ using (ImRaii.PushColor(ImGuiCol.Text, 0xFF8FA3B5u))
+ ImGui.TextUnformatted(active.Author);
+
+ DrawChatColorsApplyBanner(active);
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ ImGui.TextUnformatted(HellionStrings.Settings_Themes_BuiltIns);
+ ImGui.Spacing();
+ DrawThemeGrid(registry.AllBuiltIns(), active.Slug);
+
+ var customs = registry.AllCustom().ToList();
+ if (customs.Count > 0)
+ {
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+ ImGui.TextUnformatted(HellionStrings.Settings_Themes_Custom);
+ ImGui.Spacing();
+ DrawThemeGrid(customs, active.Slug);
+ }
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ if (ImGui.Button(HellionStrings.Settings_Themes_OpenFolder))
+ {
+ var dir = Path.Combine(Plugin.Interface.ConfigDirectory.FullName, "themes");
+ Directory.CreateDirectory(dir);
+ Plugin.PlatformUtil.OpenLink(dir);
+ }
+
+ ImGui.SameLine();
+ if (ImGui.Button(HellionStrings.Settings_Themes_ExportActive))
+ {
+ var dir = Path.Combine(Plugin.Interface.ConfigDirectory.FullName, "themes");
+ Directory.CreateDirectory(dir);
+ var fileName = $"{active.Slug}.export.json";
+ var path = Path.Combine(dir, fileName);
+ var json = ThemeJsonWriter.Serialize(active);
+ File.WriteAllText(path, json);
+ _logger.LogInformation($"Exported active theme '{active.Slug}' to {path}");
+ }
+ }
+ }
+
+ private void DrawThemeGrid(IEnumerable themes, string activeSlug)
+ {
+ var avail = ImGui.GetContentRegionAvail();
+ var columns = avail.X >= 700f ? 3 : 2;
+ var cardWidth = (avail.X - (columns - 1) * 8f) / columns;
+ var cardHeight = 140f;
+
+ var list = themes.ToList();
+ for (var i = 0; i < list.Count; i++)
+ {
+ DrawThemeCard(list[i], activeSlug, cardWidth, cardHeight);
+
+ if ((i + 1) % columns != 0 && i != list.Count - 1)
+ ImGui.SameLine();
+ }
+ }
+
+ private void DrawThemeCard(Theme theme, string activeSlug, float w, float h)
+ {
+ ImGui.BeginGroup();
+
+ var isActive = string.Equals(theme.Slug, activeSlug, StringComparison.OrdinalIgnoreCase);
+ var cursorBefore = ImGui.GetCursorScreenPos();
+ var clicked = ImGui.InvisibleButton($"##theme-card-{theme.Slug}", new Vector2(w, h));
+ var hovered = ImGui.IsItemHovered();
+
+ var draw = ImGui.GetWindowDrawList();
+ var bg = ColourUtil.RgbaToAbgr(theme.Colors.WindowBg | 0xFFu);
+ draw.AddRectFilled(cursorBefore, cursorBefore + new Vector2(w, h), bg, 4f);
+
+ if (isActive)
+ {
+ var border = ColourUtil.RgbaToAbgr(theme.Colors.Primary);
+ draw.AddRect(
+ cursorBefore,
+ cursorBefore + new Vector2(w, h),
+ border,
+ 4f,
+ ImDrawFlags.None,
+ 2f
+ );
+ }
+ else if (hovered)
+ {
+ var border = ColourUtil.RgbaToAbgr(theme.Colors.PrimaryLight & 0xFFFFFF99u);
+ draw.AddRect(
+ cursorBefore,
+ cursorBefore + new Vector2(w, h),
+ border,
+ 4f,
+ ImDrawFlags.None,
+ 1f
+ );
+ }
+
+ var mockupOrigin = cursorBefore + new Vector2(12f, 12f);
+ var mockupSize = new Vector2(w - 24f, 60f);
+ ThemeMockup.Draw(mockupOrigin, mockupSize, theme);
+
+ var textColor = ColourUtil.RgbaToAbgr(theme.Colors.TextPrimary);
+ var mutedColor = ColourUtil.RgbaToAbgr(theme.Colors.TextMuted);
+ draw.AddText(cursorBefore + new Vector2(12f, 80f), textColor, theme.Name);
+ draw.AddText(cursorBefore + new Vector2(12f, 100f), mutedColor, theme.Author);
+
+ ImGui.EndGroup();
+
+ if (clicked)
+ {
+ Mutable.Theme = theme.Slug;
+ Plugin.ThemeRegistry.Switch(theme.Slug);
+ _applyDismissedFor = null;
+ }
+ }
+
+ private void DrawChatColorsApplyBanner(Theme active)
+ {
+ if (active.ChatColors is not { Channels.Count: > 0 } themeChatColors)
+ return;
+
+ if (_applyDismissedFor == active.Slug)
+ return;
+
+ var alreadyMatching = themeChatColors.Channels.All(kvp =>
+ Mutable.ChatColours.TryGetValue(kvp.Key, out var current) && current == kvp.Value
+ );
+ if (alreadyMatching)
+ return;
+
+ ImGui.Spacing();
+
+ var border = ColourUtil.RgbaToAbgr(active.Colors.Primary);
+ var bgFill = ColourUtil.RgbaToAbgr((active.Colors.Surface & 0xFFFFFF00u) | 0xCCu);
+ var origin = ImGui.GetCursorScreenPos();
+ var width = ImGui.GetContentRegionAvail().X;
+ var height = 64f;
+ var draw = ImGui.GetWindowDrawList();
+ draw.AddRectFilled(origin, origin + new Vector2(width, height), bgFill, 4f);
+ draw.AddRect(origin, origin + new Vector2(width, height), border, 4f, ImDrawFlags.None, 1f);
+
+ var textColor = ColourUtil.RgbaToAbgr(active.Colors.TextPrimary);
+ draw.AddText(
+ origin + new Vector2(12f, 10f),
+ textColor,
+ HellionStrings.Settings_Themes_ApplyChatColors_Hint
+ );
+
+ using (ImRaii.PushColor(ImGuiCol.Button, active.Colors.Primary))
+ using (ImRaii.PushColor(ImGuiCol.ButtonHovered, active.Colors.PrimaryLight))
+ using (ImRaii.PushColor(ImGuiCol.ButtonActive, active.Colors.PrimaryDark))
+ {
+ ImGui.SetCursorScreenPos(origin + new Vector2(12f, 32f));
+ if (ImGui.Button(HellionStrings.Settings_Themes_ApplyChatColors_Apply))
+ {
+ foreach (var kvp in themeChatColors.Channels)
+ Mutable.ChatColours[kvp.Key] = kvp.Value;
+ _applyDismissedFor = active.Slug;
+ }
+ }
+
+ ImGui.SameLine();
+ if (ImGui.Button(HellionStrings.Settings_Themes_ApplyChatColors_Keep))
+ {
+ _applyDismissedFor = active.Slug;
+ }
+
+ ImGui.SetCursorScreenPos(origin + new Vector2(0f, height + 8f));
+
+ ImGui.Spacing();
+ }
+
+ // ── Fonts ──────────────────────────────────────────────────────────────
+ // R3 deliberately NOT applied here — the UseHellionFont/FontsEnabled
+ // visibility chain has priority over type grouping (R4).
+
+ private void DrawFontsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Fonts);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ if (
+ ImGui.Checkbox(HellionStrings.Theme_UseHellionFont_Name, ref Mutable.UseHellionFont)
+ )
+ {
+ if (Mutable.UseHellionFont)
+ Mutable.FontsEnabled = false;
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Theme_UseHellionFont_Description);
+ ImGui.Spacing();
+
+ if (Mutable.UseHellionFont)
+ {
+ // Bundled-font path: only the base font size matters; the
+ // global / japanese / italic chooser pickers do not apply.
+ ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
+ ImGui.Spacing();
+ }
+ else
+ {
+ ImGui.Checkbox(Language.Options_FontsEnabled, ref Mutable.FontsEnabled);
+ ImGui.Spacing();
+ }
+
+ var unused = false;
+ if (!Mutable.UseHellionFont && !Mutable.FontsEnabled)
+ {
+ ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
+ }
+ else if (!Mutable.UseHellionFont)
+ {
+ var globalChooser = ImGuiUtil.FontChooser(
+ Language.Options_Font_Name,
+ Mutable.GlobalFontV2,
+ false,
+ ref unused
+ );
+ globalChooser?.ResultTask.ContinueWith(r =>
+ {
+ if (r.IsCompletedSuccessfully)
+ {
+ Plugin.Framework.Run(() => Mutable.GlobalFontV2 = r.Result);
+ }
+ });
+ ImGui.SameLine();
+ if (ImGui.Button("Reset##global"))
+ {
+ Mutable.GlobalFontV2 = new SingleFontSpec
+ {
+ FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
+ SizePt = 12.75f,
+ };
+ }
+
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_Font_Description, Plugin.PluginName)
+ );
+ ImGuiUtil.WarningText(Language.Options_Font_Warning);
+ ImGui.Spacing();
+
+ var japaneseChooser = ImGuiUtil.FontChooser(
+ Language.Options_JapaneseFont_Name,
+ Mutable.JapaneseFontV2,
+ false,
+ ref unused,
+ id => !id.LocaleNames?.ContainsKey("ja-jp") ?? false,
+ "いろはにほへと ちりぬるを"
+ );
+ japaneseChooser?.ResultTask.ContinueWith(r =>
+ {
+ if (r.IsCompletedSuccessfully)
+ {
+ Plugin.Framework.Run(() => Mutable.JapaneseFontV2 = r.Result);
+ }
+ });
+ ImGui.SameLine();
+ if (ImGui.Button("Reset##japanese"))
+ {
+ Mutable.JapaneseFontV2 = new SingleFontSpec
+ {
+ FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkMedium),
+ SizePt = 12.75f,
+ };
+ }
+
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_JapaneseFont_Description, Plugin.PluginName)
+ );
+ ImGui.Spacing();
+
+ var italicChooser = ImGuiUtil.FontChooser(
+ Language.Options_ItalicFont_Name,
+ Mutable.ItalicFontV2,
+ true,
+ ref Mutable.ItalicEnabled
+ );
+ italicChooser?.ResultTask.ContinueWith(r =>
+ {
+ if (r.IsCompletedSuccessfully)
+ {
+ Plugin.Framework.Run(() => Mutable.ItalicFontV2 = r.Result);
+ }
+ });
+ ImGui.SameLine();
+ if (ImGui.Button("Reset##italic"))
+ {
+ Mutable.ItalicEnabled = false;
+ Mutable.ItalicFontV2 = new SingleFontSpec
+ {
+ FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
+ SizePt = 12.75f,
+ };
+ }
+
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_Italic_Description, Plugin.PluginName)
+ );
+ ImGui.Spacing();
+ }
+
+ // v1.5.3: ExtraGlyphRanges is an atlas-wide property and stays
+ // reachable regardless of UseHellionFont / FontsEnabled state so
+ // users can verify or override the auto-activation on language change.
+ ImGui.Spacing();
+ if (ImGui.CollapsingHeader(Language.Options_ExtraGlyphs_Name))
+ {
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_ExtraGlyphs_Description, Plugin.PluginName)
+ );
+
+ var range = (int)Mutable.ExtraGlyphRanges;
+ foreach (var extra in Enum.GetValues())
+ {
+ ImGui.CheckboxFlags(extra.Name(), ref range, (int)extra);
+ }
+
+ Mutable.ExtraGlyphRanges = (ExtraGlyphRanges)range;
+ }
+
+ ImGuiUtil.FontSizeCombo(
+ Language.Options_SymbolsFontSize_Name,
+ ref Mutable.SymbolsFontSizeV2
+ );
+ ImGuiUtil.HelpMarker(Language.Options_SymbolsFontSize_Description);
+
+ ImGui.Spacing();
+ }
+ }
+
+ // ── Colours ────────────────────────────────────────────────────────────
+
+ private void DrawColoursSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Colours);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ DrawColourPresetButtons();
+ ImGui.TextDisabled(HellionStrings.Settings_Appearance_Colours_PresetsHint);
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ ImGui.Checkbox(
+ Language.Options_ColorSelectedInputChannelButton_Name,
+ ref Mutable.ColorSelectedInputChannelButton
+ );
+ ImGuiUtil.HelpMarker(Language.Options_ColorSelectedInputChannelButton_Description);
+ ImGui.Spacing();
+
+ foreach (var (_, types) in ChatTypeExt.SortOrder)
+ {
+ foreach (var type in types)
+ {
+ if (
+ ImGuiUtil.IconButton(
+ FontAwesomeIcon.UndoAlt,
+ $"{type}",
+ Language.Options_ChatColours_Reset
+ )
+ )
+ {
+ Mutable.ChatColours.Remove(type);
+ }
+
+ ImGui.SameLine();
+
+ if (
+ ImGuiUtil.IconButton(
+ FontAwesomeIcon.LongArrowAltDown,
+ $"{type}",
+ Language.Options_ChatColours_Import
+ )
+ )
+ {
+ var gameColour = Plugin.Functions.Chat.GetChannelColor(type);
+ Mutable.ChatColours[type] = gameColour ?? type.DefaultColor() ?? 0;
+ }
+
+ ImGui.SameLine();
+
+ var vec = Mutable.ChatColours.TryGetValue(type, out var colour)
+ ? ColourUtil.RgbaToVector3(colour)
+ : ColourUtil.RgbaToVector3(type.DefaultColor() ?? 0);
+ if (ImGui.ColorEdit3(type.Name(), ref vec, ImGuiColorEditFlags.NoInputs))
+ {
+ Mutable.ChatColours[type] = ColourUtil.Vector3ToRgba(vec);
+ }
+ }
+ }
+
+ ImGui.Spacing();
+ }
+ }
+
+ private void DrawColourPresetButtons()
+ {
+ var first = true;
+ foreach (var (_, preset) in ChatColourPresets.All)
+ {
+ if (!first)
+ {
+ ImGui.SameLine();
+ }
+ first = false;
+
+ if (preset.IsBrandPreset)
+ {
+ var border = ColourUtil.RgbaToVector3(ColourUtil.ComponentsToRgba(255, 128, 200));
+ var btn = ColourUtil.RgbaToVector3(ColourUtil.ComponentsToRgba(74, 42, 106));
+ ImGui.PushStyleColor(
+ ImGuiCol.Border,
+ new System.Numerics.Vector4(border.X, border.Y, border.Z, 1f)
+ );
+ ImGui.PushStyleColor(
+ ImGuiCol.Button,
+ new System.Numerics.Vector4(btn.X, btn.Y, btn.Z, 1f)
+ );
+ ImGui.PushStyleVar(ImGuiStyleVar.FrameBorderSize, 1.5f);
+ }
+
+ if (ImGui.Button(GetPresetLabel(preset)))
+ {
+ ApplyPreset(preset);
+ }
+
+ if (preset.IsBrandPreset)
+ {
+ ImGui.PopStyleVar();
+ ImGui.PopStyleColor(2);
+ }
+ }
+ }
+
+ private static string GetPresetLabel(ChatColourPreset preset)
+ {
+ var localized = HellionStrings.ResourceManager.GetString(
+ preset.LocalizationKey,
+ HellionStrings.Culture
+ );
+ return string.IsNullOrEmpty(localized) ? preset.DisplayName : localized;
+ }
+
+ private void ApplyPreset(ChatColourPreset preset)
+ {
+ foreach (var (channel, colour) in preset.Colours)
+ {
+ Mutable.ChatColours[channel] = colour;
+ }
+ Plugin.SaveConfig();
+ GlobalParametersCache.Refresh();
+ _logger.LogDebug($"Applied chat colour preset: {preset.DisplayName}");
+ }
+
+ // ── Window style ───────────────────────────────────────────────────────
+
+ private void DrawWindowStyleSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_WindowStyle);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.Checkbox(Language.Options_ShowTitleBar_Name, ref Mutable.ShowTitleBar);
+
+ ImGui.Checkbox(
+ Language.Options_ShowPopOutTitleBar_Name,
+ ref Mutable.ShowPopOutTitleBar
+ );
+
+ ImGui.Checkbox(Language.Options_ShowHideButton_Name, ref Mutable.ShowHideButton);
+ ImGuiUtil.HelpMarker(Language.Options_ShowHideButton_Description);
+
+ ImGui.Checkbox(Language.Options_SidebarTabView_Name, ref Mutable.SidebarTabView);
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_SidebarTabView_Description, Plugin.PluginName)
+ );
+
+ if (Mutable.SidebarTabView)
+ {
+ var sidebarWidth = Mutable.SidebarWidth;
+ if (
+ ImGui.SliderInt(
+ HellionStrings.Settings_ThemeAndLayout_SidebarWidth_Name,
+ ref sidebarWidth,
+ 44,
+ 160,
+ $"{sidebarWidth} px"
+ )
+ )
+ {
+ Mutable.SidebarWidth = sidebarWidth;
+ }
+ ImGuiUtil.HelpMarker(
+ HellionStrings.Settings_ThemeAndLayout_SidebarWidth_Description
+ );
+ }
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ // Slider range 50-100% maps to 0.5-1.0 internally. Floor at 50% prevents
+ // accidentally hiding the chat background (v1.2.0 bug at WindowAlpha=0).
+ var opacityPercent = Mutable.WindowOpacity * 100f;
+ if (
+ ImGuiUtil.DragFloatVertical(
+ HellionStrings.Settings_ThemeAndLayout_WindowOpacity_Name,
+ ref opacityPercent,
+ .25f,
+ 50f,
+ 100f,
+ $"{opacityPercent:N0}%%",
+ ImGuiSliderFlags.AlwaysClamp
+ )
+ )
+ {
+ Mutable.WindowOpacity = opacityPercent / 100f;
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_WindowOpacity_Description);
+
+ // UI-12: inactive-window opacity, same 50-100% range and clamp.
+ var inactiveOpacityPercent = Mutable.WindowOpacityInactive * 100f;
+ if (
+ ImGuiUtil.DragFloatVertical(
+ HellionStrings.Settings_ThemeAndLayout_WindowOpacityInactive_Name,
+ ref inactiveOpacityPercent,
+ .25f,
+ 50f,
+ 100f,
+ $"{inactiveOpacityPercent:N0}%%",
+ ImGuiSliderFlags.AlwaysClamp
+ )
+ )
+ {
+ Mutable.WindowOpacityInactive = inactiveOpacityPercent / 100f;
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_WindowOpacityInactive_Description);
+ }
+ }
+
+ // ── Timestamps ─────────────────────────────────────────────────────────
+
+ private void DrawTimestampSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Timestamps);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.Checkbox(
+ Language.Options_PrettierTimestamps_Name,
+ ref Mutable.PrettierTimestamps
+ );
+ ImGuiUtil.HelpMarker(Language.Options_PrettierTimestamps_Description);
+
+ if (Mutable.PrettierTimestamps)
+ {
+ ImGui.Checkbox(
+ Language.Options_MoreCompactPretty_Name,
+ ref Mutable.MoreCompactPretty
+ );
+ ImGuiUtil.HelpMarker(Language.Options_MoreCompactPretty_Description);
+
+ ImGui.Checkbox(
+ HellionStrings.Appearance_UseCompactDensity_Name,
+ ref Mutable.UseCompactDensity
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Appearance_UseCompactDensity_Description);
+
+ ImGui.Checkbox(
+ Language.Options_HideSameTimestamps_Name,
+ ref Mutable.HideSameTimestamps
+ );
+ ImGuiUtil.HelpMarker(Language.Options_HideSameTimestamps_Description);
+ }
+
+ ImGui.Checkbox(Language.Options_Use24HourClock_Name, ref Mutable.Use24HourClock);
+ ImGuiUtil.HelpMarker(Language.Options_Use24HourClock_Description);
+ }
+ }
+
+ // ── Animations ─────────────────────────────────────────────────────────
+
+ private void DrawAnimationsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Animations);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // Master accessibility toggle for the v1.5.4 motion work: the
+ // theme crossfade, the sidebar/card hover lerps and the
+ // unread-tab pulse all read Config.ReduceMotion and snap
+ // instantly when it is on.
+ ImGui.Checkbox(
+ HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Name,
+ ref Mutable.ReduceMotion
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Description);
+ }
+ }
+}
diff --git a/HellionChat/Ui/SettingsTabs/Chat.cs b/HellionChat/Ui/SettingsTabs/Chat.cs
index d7fc96b..8653d6a 100644
--- a/HellionChat/Ui/SettingsTabs/Chat.cs
+++ b/HellionChat/Ui/SettingsTabs/Chat.cs
@@ -9,7 +9,7 @@ using HellionChat.Util;
namespace HellionChat.Ui.SettingsTabs;
-// Four sections: Auto-Tell Tabs, Behaviour, Preview, Emotes.
+// Six sections: Messages, Input & preview, Auto-tell tabs, Emotes, Links & tooltips, Novice network.
internal sealed class Chat : ISettingsTab
{
private Plugin Plugin { get; }
@@ -40,37 +40,165 @@ internal sealed class Chat : ISettingsTab
.ToArray(),
};
- public void Draw(bool changed)
+ public void Draw(bool sectionJustEntered)
{
- DrawAutoTellTabsSection();
+ DrawMessagesSection(sectionJustEntered);
ImGui.Spacing();
- DrawBehaviourSection();
+ DrawInputPreviewSection(sectionJustEntered);
ImGui.Spacing();
- DrawPreviewSection();
+ DrawAutoTellTabsSection(sectionJustEntered);
ImGui.Spacing();
- DrawEmotesSection();
+ DrawEmotesSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawLinksTooltipsSection(sectionJustEntered);
+ ImGui.Spacing();
+ DrawNoviceNetworkSection(sectionJustEntered);
}
- private void DrawAutoTellTabsSection()
+ private void DrawMessagesSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Chat_AutoTellTabs_Heading);
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Messages);
if (!tree.Success)
return;
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
+ // Checkboxes first.
+ ImGui.Checkbox(
+ Language.Options_CollapseDuplicateMessages_Name,
+ ref Mutable.CollapseDuplicateMessages
+ );
+ ImGuiUtil.HelpMarker(Language.Options_CollapseDuplicateMessages_Description);
+
+ // Conditional child: only visible when parent is on (R4).
+ if (Mutable.CollapseDuplicateMessages)
+ {
+ ImGui.Checkbox(
+ Language.Options_CollapseDuplicateMsgUniqueLink_Name,
+ ref Mutable.CollapseKeepUniqueLinks
+ );
+ ImGuiUtil.HelpMarker(Language.Options_CollapseDuplicateMsgUniqueLink_Description);
+ }
+
+ ImGui.Checkbox(
+ HellionStrings.Settings_Chat_NotifyFailedTell_Name,
+ ref Mutable.NotifyFailedTell
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_NotifyFailedTell_Description);
+
+ ImGui.Checkbox(
+ HellionStrings.Settings_Chat_NotifyPluginDisclosure_Name,
+ ref Mutable.NotifyPluginDisclosure
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_NotifyPluginDisclosure_Description);
+
+ // Dropdowns after checkboxes (R3).
+ // UI-7: name display options.
+ using (
+ var combo = ImGuiUtil.BeginComboVertical(
+ HellionStrings.Settings_Chat_WorldSuffix_Name,
+ Mutable.WorldSuffixMode.Name()
+ )
+ )
+ {
+ if (combo.Success)
+ {
+ foreach (var mode in Enum.GetValues())
+ {
+ if (ImGui.Selectable(mode.Name(), Mutable.WorldSuffixMode == mode))
+ Mutable.WorldSuffixMode = mode;
+ }
+ }
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_WorldSuffix_Description);
+
+ using (
+ var combo = ImGuiUtil.BeginComboVertical(
+ HellionStrings.Settings_Chat_NameForm_Name,
+ Mutable.NameFormMode.Name()
+ )
+ )
+ {
+ if (combo.Success)
+ {
+ foreach (var mode in Enum.GetValues())
+ {
+ if (ImGui.Selectable(mode.Name(), Mutable.NameFormMode == mode))
+ Mutable.NameFormMode = mode;
+ }
+ }
+ }
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_NameForm_Description);
+ }
+ }
+
+ private void DrawInputPreviewSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_InputPreview);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // Checkboxes first.
+ ImGui.Checkbox(
+ HellionStrings.Settings_Chat_SymbolPicker_Enable_Name,
+ ref Mutable.SymbolPickerEnabled
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_SymbolPicker_Enable_Description);
+
+ ImGui.Checkbox(Language.Options_PreviewOnlyIf_Name, ref Mutable.OnlyPreviewIf);
+ ImGuiUtil.HelpMarker(Language.Options_PreviewOnlyIf_Description);
+
+ // Dropdown after checkboxes (R3).
+ using (
+ var combo = ImGuiUtil.BeginComboVertical(
+ Language.Options_Preview_Name,
+ Mutable.PreviewPosition.Name()
+ )
+ )
+ {
+ if (combo)
+ {
+ foreach (var position in Enum.GetValues())
+ {
+ if (ImGui.Selectable(position.Name(), Mutable.PreviewPosition == position))
+ Mutable.PreviewPosition = position;
+ }
+ }
+ }
+ ImGuiUtil.HelpMarker(Language.Options_Preview_Description);
+
+ // Number input last (R3).
+ if (
+ ImGuiUtil.InputIntVertical(
+ Language.Options_PreviewMinimum_Name,
+ Language.Options_PreviewMinimum_Description,
+ ref Mutable.PreviewMinimum
+ )
+ )
+ Mutable.PreviewMinimum = Math.Clamp(Mutable.PreviewMinimum, 1, 250);
+ }
+ }
+
+ private void DrawAutoTellTabsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_AutoTellTabs);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // Checkboxes first (R3).
ImGui.Checkbox(
HellionStrings.ChatLog_AutoTellTabs_Enable_Name,
ref Mutable.EnableAutoTellTabs
);
ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_Enable_Description);
- ImGui.SetNextItemWidth(200f * ImGuiHelpers.GlobalScale);
- var limit = Mutable.AutoTellTabsLimit;
- if (ImGui.SliderInt(HellionStrings.ChatLog_AutoTellTabs_Limit_Name, ref limit, 1, 50))
- Mutable.AutoTellTabsLimit = limit;
- ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_Limit_Description);
-
ImGui.Checkbox(
HellionStrings.ChatLog_AutoTellTabs_Compact_Name,
ref Mutable.AutoTellTabsCompactDisplay
@@ -89,6 +217,13 @@ internal sealed class Chat : ISettingsTab
);
ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_GreetedToggle_Description);
+ // Sliders after checkboxes (R3).
+ ImGui.SetNextItemWidth(200f * ImGuiHelpers.GlobalScale);
+ var limit = Mutable.AutoTellTabsLimit;
+ if (ImGui.SliderInt(HellionStrings.ChatLog_AutoTellTabs_Limit_Name, ref limit, 1, 50))
+ Mutable.AutoTellTabsLimit = limit;
+ ImGuiUtil.HelpMarker(HellionStrings.ChatLog_AutoTellTabs_Limit_Description);
+
ImGui.Spacing();
ImGuiUtil.HelpText(HellionStrings.ChatLog_AutoTellTabs_PreloadHint);
@@ -117,91 +252,16 @@ internal sealed class Chat : ISettingsTab
}
}
- private void DrawBehaviourSection()
+ private void DrawEmotesSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Chat_Behaviour_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.Checkbox(
- Language.Options_CollapseDuplicateMessages_Name,
- ref Mutable.CollapseDuplicateMessages
- );
- ImGuiUtil.HelpMarker(Language.Options_CollapseDuplicateMessages_Description);
-
- if (Mutable.CollapseDuplicateMessages)
- {
- ImGui.Checkbox(
- Language.Options_CollapseDuplicateMsgUniqueLink_Name,
- ref Mutable.CollapseKeepUniqueLinks
- );
- ImGuiUtil.HelpMarker(Language.Options_CollapseDuplicateMsgUniqueLink_Description);
- }
-
- ImGui.Checkbox(
- HellionStrings.Settings_Chat_SymbolPicker_Enable_Name,
- ref Mutable.SymbolPickerEnabled
- );
- ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_SymbolPicker_Enable_Description);
-
- ImGui.Checkbox(
- HellionStrings.Settings_Chat_NotifyFailedTell_Name,
- ref Mutable.NotifyFailedTell
- );
- ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_NotifyFailedTell_Description);
- }
- }
-
- private void DrawPreviewSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Chat_Preview_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- using (
- var combo = ImGuiUtil.BeginComboVertical(
- Language.Options_Preview_Name,
- Mutable.PreviewPosition.Name()
- )
- )
- {
- if (combo)
- {
- foreach (var position in Enum.GetValues())
- {
- if (ImGui.Selectable(position.Name(), Mutable.PreviewPosition == position))
- Mutable.PreviewPosition = position;
- }
- }
- }
- ImGuiUtil.HelpMarker(Language.Options_Preview_Description);
-
- if (
- ImGuiUtil.InputIntVertical(
- Language.Options_PreviewMinimum_Name,
- Language.Options_PreviewMinimum_Description,
- ref Mutable.PreviewMinimum
- )
- )
- Mutable.PreviewMinimum = Math.Clamp(Mutable.PreviewMinimum, 1, 250);
-
- ImGui.Checkbox(Language.Options_PreviewOnlyIf_Name, ref Mutable.OnlyPreviewIf);
- ImGuiUtil.HelpMarker(Language.Options_PreviewOnlyIf_Description);
- }
- }
-
- private void DrawEmotesSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Chat_Emotes_Heading);
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Emotes);
if (!tree.Success)
return;
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
+ // Checkbox first (R3).
ImGui.Checkbox(Language.Options_ShowEmotes_Name, ref Mutable.ShowEmotes);
ImGuiUtil.HelpMarker(Language.Options_ShowEmotes_Desc);
@@ -219,6 +279,7 @@ internal sealed class Chat : ISettingsTab
WordPopupOptionsBuiltFor = EmoteCache.LoadingState.Done;
}
+ // Button to add blocked emotes (R3 — button before table).
var buttonWidth = ImGui.GetContentRegionAvail().X / 3;
using (Plugin.FontManager.FontAwesome.Push())
ImGui.Button(FontAwesomeIcon.Plus.ToIconString(), new Vector2(buttonWidth, 0));
@@ -279,6 +340,7 @@ internal sealed class Chat : ISettingsTab
$"{Language.Options_Emote_Loaded} {EmoteCache.SortedCodeArray.Length}"
);
+ // 5-column loaded-emotes display table.
using (
var emoteTable = ImRaii.Table(
"##LoadedEmotes",
@@ -304,4 +366,52 @@ internal sealed class Chat : ISettingsTab
}
}
}
+
+ private void DrawLinksTooltipsSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_LinksTooltips);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.Checkbox(
+ Language.Options_NativeItemTooltips_Name,
+ ref Mutable.NativeItemTooltips
+ );
+ ImGuiUtil.HelpMarker(
+ string.Format(Language.Options_NativeItemTooltips_Description, Plugin.PluginName)
+ );
+
+ // Conditional slider: only shown when native tooltips are enabled (R4).
+ if (Mutable.NativeItemTooltips)
+ {
+ ImGuiUtil.DragFloatVertical(
+ Language.Options_TooltipOffset_Name,
+ Language.Options_TooltipOffset_Desc,
+ ref Mutable.TooltipOffset,
+ 1,
+ 0f,
+ 400f,
+ $"{Mutable.TooltipOffset:N0}px",
+ ImGuiSliderFlags.AlwaysClamp
+ );
+ }
+ }
+ }
+
+ private void DrawNoviceNetworkSection(bool sectionJustEntered)
+ {
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_NoviceNetwork);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.Checkbox(Language.Options_ShowNoviceNetwork_Name, ref Mutable.ShowNoviceNetwork);
+ ImGuiUtil.HelpMarker(Language.Options_ShowNoviceNetwork_Description);
+ }
+ }
}
diff --git a/HellionChat/Ui/SettingsTabs/DataManagement.cs b/HellionChat/Ui/SettingsTabs/DataAndPrivacy.cs
similarity index 85%
rename from HellionChat/Ui/SettingsTabs/DataManagement.cs
rename to HellionChat/Ui/SettingsTabs/DataAndPrivacy.cs
index 3ceab5b..e96609b 100644
--- a/HellionChat/Ui/SettingsTabs/DataManagement.cs
+++ b/HellionChat/Ui/SettingsTabs/DataAndPrivacy.cs
@@ -15,16 +15,16 @@ using Microsoft.Extensions.Logging;
namespace HellionChat.Ui.SettingsTabs;
-internal sealed class DataManagement : ISettingsTab
+internal sealed class DataAndPrivacy : ISettingsTab
{
private Plugin Plugin { get; }
private Configuration Mutable { get; }
- private readonly ILogger _logger;
+ private readonly ILogger _logger;
public string Name =>
HellionStrings.Settings_Card_DataManagement_Title + "###tabs-datamanagement";
- // Cleanup state (was in Privacy.cs)
+ // Cleanup state
private Dictionary? CleanupCounts;
private long CleanupKeepCount;
private long CleanupDeleteCount;
@@ -33,7 +33,7 @@ internal sealed class DataManagement : ISettingsTab
private HashSet? CleanupPreviewSnapshot;
private bool RetentionRunning => Plugin.RetentionSweepRunning;
- // Export form state (was in Privacy.cs)
+ // Export form state
private int ExportRangeDays = 30;
private string ExportSenderSubstring = string.Empty;
private readonly HashSet ExportSelectedChannels = [];
@@ -138,36 +138,127 @@ internal sealed class DataManagement : ISettingsTab
),
];
- internal DataManagement(Plugin plugin, Configuration mutable, ILogger logger)
+ internal DataAndPrivacy(Plugin plugin, Configuration mutable, ILogger logger)
{
Plugin = plugin;
Mutable = mutable;
_logger = logger;
}
- public void Draw(bool changed)
+ public void Draw(bool sectionJustEntered)
{
// Shift-on-open keeps the Advanced tools available without a permanent
// toggle in the UI, mirroring upstream Chat 2 behaviour.
- if (changed)
+ if (sectionJustEntered)
ShowAdvanced = ImGui.GetIO().KeyShift;
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ DrawPrivacyFilterSection();
+ ImGui.Spacing();
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
DrawStorageSection();
ImGui.Spacing();
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
DrawRetentionSection();
ImGui.Spacing();
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
DrawCleanupSection();
ImGui.Spacing();
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
DrawExportSection();
ImGui.Spacing();
- DrawDatabaseViewerSection();
- ImGui.Spacing();
- DrawAdvancedSection();
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ DrawDatabaseSection();
+ }
+
+ private void DrawPrivacyFilterSection()
+ {
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_PrivacyFilter);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ // Wizard re-open sits outside the disabled block so it is always clickable.
+ if (ImGui.Button(HellionStrings.Wizard_Reopen_Button))
+ Plugin.FirstRunWizard.IsOpen = true;
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref Mutable.PrivacyFilterEnabled,
+ HellionStrings.Privacy_FilterEnabled_Name,
+ HellionStrings.Privacy_FilterEnabled_Description
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Privacy_FilterEnabled_StorageOnly_Help);
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ // Whitelist, presets, and PersistUnknown are greyed (still visible)
+ // when the filter is off — ImRaii.Disabled block preserved verbatim.
+ using (ImRaii.Disabled(!Mutable.PrivacyFilterEnabled))
+ {
+ ImGuiUtil.HelpText(HellionStrings.Privacy_Whitelist_Help);
+
+ ImGui.Spacing();
+
+ if (ImGui.Button(HellionStrings.Privacy_Preset_PrivacyFirst))
+ Mutable.PrivacyPersistChannels = [.. PrivacyDefaults.PrivacyFirstWhitelist];
+
+ ImGui.SameLine();
+ if (ImGui.Button(HellionStrings.Privacy_Preset_ClearAll))
+ Mutable.PrivacyPersistChannels.Clear();
+
+ ImGui.SameLine();
+ if (ImGui.Button(HellionStrings.Privacy_Preset_SelectAll))
+ foreach (var group in Groups)
+ foreach (var t in group.Types)
+ Mutable.PrivacyPersistChannels.Add(t);
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ foreach (var (heading, types) in Groups)
+ {
+ using var groupTree = ImRaii.TreeNode(heading());
+ if (!groupTree.Success)
+ continue;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ foreach (var type in types)
+ {
+ var enabled = Mutable.PrivacyPersistChannels.Contains(type);
+ var label = type.ToString();
+ if (ImGui.Checkbox($"{label}##privacy-{(int)type}", ref enabled))
+ {
+ if (enabled)
+ Mutable.PrivacyPersistChannels.Add(type);
+ else
+ Mutable.PrivacyPersistChannels.Remove(type);
+ }
+ }
+ }
+ }
+
+ ImGui.Spacing();
+ ImGui.Separator();
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref Mutable.PrivacyPersistUnknownChannels,
+ HellionStrings.Privacy_PersistUnknown_Name,
+ HellionStrings.Privacy_PersistUnknown_Description
+ );
+ }
+ }
}
private void DrawStorageSection()
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Storage_Heading);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Storage);
if (!tree.Success)
return;
@@ -245,7 +336,7 @@ internal sealed class DataManagement : ISettingsTab
private void DrawRetentionSection()
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Retention_Heading);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Retention);
if (!tree.Success)
return;
@@ -437,7 +528,7 @@ internal sealed class DataManagement : ISettingsTab
private void DrawCleanupSection()
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Cleanup_Heading);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Cleanup);
if (!tree.Success)
return;
@@ -627,7 +718,7 @@ internal sealed class DataManagement : ISettingsTab
private void DrawExportSection()
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Export_Heading);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Export);
if (!tree.Success)
return;
@@ -785,9 +876,9 @@ internal sealed class DataManagement : ISettingsTab
}.Start();
}
- private void DrawDatabaseViewerSection()
+ private void DrawDatabaseSection()
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_DbViewer_Heading);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Database);
if (!tree.Success)
return;
@@ -862,49 +953,49 @@ internal sealed class DataManagement : ISettingsTab
NotificationType.Info
);
}
- }
- }
- private void DrawAdvancedSection()
- {
- if (!ShowAdvanced)
- return;
+ // Advanced sub-block: only visible when the tab was opened with Shift held.
+ // Gate matches the Shift-on-open flag set at the top of Draw().
+ if (!ShowAdvanced)
+ return;
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Advanced_Heading);
- if (!tree.Success)
- return;
+ ImGui.Spacing();
+ using var advTree = ImRaii.TreeNode(HellionStrings.Settings_DataManagement_Advanced_Heading);
+ if (!advTree.Success)
+ return;
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- using var wrap = ImRaii.TextWrapPos(0.0f);
-
- ImGuiUtil.WarningText(Language.Options_Database_Advanced_Warning);
- if (
- ImGuiUtil.CtrlShiftButton(
- "Perform maintenance",
- "Ctrl+Shift: MessageManager.Store.PerformMaintenance()"
- )
- )
- Plugin.MessageManager.Store.PerformMaintenance();
-
- if (
- ImGuiUtil.CtrlShiftButton(
- "Reload messages from database",
- "Ctrl+Shift: MessageManager.FilterAllTabs()"
- )
- )
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
- Plugin.MessageManager.ClearAllTabs();
- Plugin.MessageManager.FilterAllTabsAsync();
- }
+ using var wrap = ImRaii.TextWrapPos(0.0f);
- if (
- ImGuiUtil.CtrlShiftButton(
- "Inject 10,000 messages",
- "Ctrl+Shift: creates 10,000 unique messages (async)"
+ ImGuiUtil.WarningText(Language.Options_Database_Advanced_Warning);
+ if (
+ ImGuiUtil.CtrlShiftButton(
+ "Perform maintenance",
+ "Ctrl+Shift: MessageManager.Store.PerformMaintenance()"
+ )
)
- )
- new Thread(() => InsertMessages(10_000)).Start();
+ Plugin.MessageManager.Store.PerformMaintenance();
+
+ if (
+ ImGuiUtil.CtrlShiftButton(
+ "Reload messages from database",
+ "Ctrl+Shift: MessageManager.FilterAllTabs()"
+ )
+ )
+ {
+ Plugin.MessageManager.ClearAllTabs();
+ Plugin.MessageManager.FilterAllTabsAsync();
+ }
+
+ if (
+ ImGuiUtil.CtrlShiftButton(
+ "Inject 10,000 messages",
+ "Ctrl+Shift: creates 10,000 unique messages (async)"
+ )
+ )
+ new Thread(() => InsertMessages(10_000)).Start();
+ }
}
}
diff --git a/HellionChat/Ui/SettingsTabs/FontsAndColours.cs b/HellionChat/Ui/SettingsTabs/FontsAndColours.cs
deleted file mode 100644
index 5d15733..0000000
--- a/HellionChat/Ui/SettingsTabs/FontsAndColours.cs
+++ /dev/null
@@ -1,317 +0,0 @@
-using Dalamud;
-using Dalamud.Bindings.ImGui;
-using Dalamud.Interface;
-using Dalamud.Interface.FontIdentifier;
-using Dalamud.Interface.Utility;
-using Dalamud.Interface.Utility.Raii;
-using HellionChat.Code;
-using HellionChat.Resources;
-using HellionChat.Util;
-using Microsoft.Extensions.Logging;
-
-namespace HellionChat.Ui.SettingsTabs;
-
-internal sealed class FontsAndColours : ISettingsTab
-{
- private Plugin Plugin { get; }
- private Configuration Mutable { get; }
- private readonly ILogger _logger;
-
- public string Name =>
- HellionStrings.Settings_Card_FontsAndColours_Title + "###tabs-fontsandcolours";
-
- internal FontsAndColours(Plugin plugin, Configuration mutable, ILogger logger)
- {
- Plugin = plugin;
- Mutable = mutable;
- _logger = logger;
- }
-
- public void Draw(bool changed)
- {
- DrawFontsSection();
- ImGui.Spacing();
- DrawColoursSection();
- }
-
- private void DrawFontsSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_FontsAndColours_Fonts_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- if (
- ImGui.Checkbox(HellionStrings.Theme_UseHellionFont_Name, ref Mutable.UseHellionFont)
- )
- {
- if (Mutable.UseHellionFont)
- Mutable.FontsEnabled = false;
- }
- ImGuiUtil.HelpMarker(HellionStrings.Theme_UseHellionFont_Description);
- ImGui.Spacing();
-
- if (Mutable.UseHellionFont)
- {
- // Bundled-font path: only the base font size matters; the
- // global / japanese / italic chooser pickers do not apply.
- ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
- ImGui.Spacing();
- }
- else
- {
- ImGui.Checkbox(Language.Options_FontsEnabled, ref Mutable.FontsEnabled);
- ImGui.Spacing();
- }
-
- var unused = false;
- if (!Mutable.UseHellionFont && !Mutable.FontsEnabled)
- {
- ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
- }
- else if (!Mutable.UseHellionFont)
- {
- var globalChooser = ImGuiUtil.FontChooser(
- Language.Options_Font_Name,
- Mutable.GlobalFontV2,
- false,
- ref unused
- );
- globalChooser?.ResultTask.ContinueWith(r =>
- {
- if (r.IsCompletedSuccessfully)
- {
- Plugin.Framework.Run(() => Mutable.GlobalFontV2 = r.Result);
- }
- });
- ImGui.SameLine();
- if (ImGui.Button("Reset##global"))
- {
- Mutable.GlobalFontV2 = new SingleFontSpec
- {
- FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
- SizePt = 12.75f,
- };
- }
-
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_Font_Description, Plugin.PluginName)
- );
- ImGuiUtil.WarningText(Language.Options_Font_Warning);
- ImGui.Spacing();
-
- var japaneseChooser = ImGuiUtil.FontChooser(
- Language.Options_JapaneseFont_Name,
- Mutable.JapaneseFontV2,
- false,
- ref unused,
- id => !id.LocaleNames?.ContainsKey("ja-jp") ?? false,
- "いろはにほへと ちりぬるを"
- );
- japaneseChooser?.ResultTask.ContinueWith(r =>
- {
- if (r.IsCompletedSuccessfully)
- {
- Plugin.Framework.Run(() => Mutable.JapaneseFontV2 = r.Result);
- }
- });
- ImGui.SameLine();
- if (ImGui.Button("Reset##japanese"))
- {
- Mutable.JapaneseFontV2 = new SingleFontSpec
- {
- FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkMedium),
- SizePt = 12.75f,
- };
- }
-
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_JapaneseFont_Description, Plugin.PluginName)
- );
- ImGui.Spacing();
-
- var italicChooser = ImGuiUtil.FontChooser(
- Language.Options_ItalicFont_Name,
- Mutable.ItalicFontV2,
- true,
- ref Mutable.ItalicEnabled
- );
- italicChooser?.ResultTask.ContinueWith(r =>
- {
- if (r.IsCompletedSuccessfully)
- {
- Plugin.Framework.Run(() => Mutable.ItalicFontV2 = r.Result);
- }
- });
- ImGui.SameLine();
- if (ImGui.Button("Reset##italic"))
- {
- Mutable.ItalicEnabled = false;
- Mutable.ItalicFontV2 = new SingleFontSpec
- {
- FontId = new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
- SizePt = 12.75f,
- };
- }
-
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_Italic_Description, Plugin.PluginName)
- );
- ImGui.Spacing();
- }
-
- // v1.5.3: ExtraGlyphRanges is an atlas-wide property and stays
- // reachable regardless of UseHellionFont / FontsEnabled state so
- // users can verify or override the auto-activation on language change.
- ImGui.Spacing();
- if (ImGui.CollapsingHeader(Language.Options_ExtraGlyphs_Name))
- {
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_ExtraGlyphs_Description, Plugin.PluginName)
- );
-
- var range = (int)Mutable.ExtraGlyphRanges;
- foreach (var extra in Enum.GetValues())
- {
- ImGui.CheckboxFlags(extra.Name(), ref range, (int)extra);
- }
-
- Mutable.ExtraGlyphRanges = (ExtraGlyphRanges)range;
- }
-
- ImGuiUtil.FontSizeCombo(
- Language.Options_SymbolsFontSize_Name,
- ref Mutable.SymbolsFontSizeV2
- );
- ImGuiUtil.HelpMarker(Language.Options_SymbolsFontSize_Description);
-
- ImGui.Spacing();
- }
- }
-
- private void DrawColoursSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_FontsAndColours_Colours_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- DrawColourPresetButtons();
- ImGui.TextDisabled(HellionStrings.Settings_Appearance_Colours_PresetsHint);
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- ImGui.Checkbox(
- Language.Options_ColorSelectedInputChannelButton_Name,
- ref Mutable.ColorSelectedInputChannelButton
- );
- ImGuiUtil.HelpMarker(Language.Options_ColorSelectedInputChannelButton_Description);
- ImGui.Spacing();
-
- foreach (var (_, types) in ChatTypeExt.SortOrder)
- {
- foreach (var type in types)
- {
- if (
- ImGuiUtil.IconButton(
- FontAwesomeIcon.UndoAlt,
- $"{type}",
- Language.Options_ChatColours_Reset
- )
- )
- {
- Mutable.ChatColours.Remove(type);
- }
-
- ImGui.SameLine();
-
- if (
- ImGuiUtil.IconButton(
- FontAwesomeIcon.LongArrowAltDown,
- $"{type}",
- Language.Options_ChatColours_Import
- )
- )
- {
- var gameColour = Plugin.Functions.Chat.GetChannelColor(type);
- Mutable.ChatColours[type] = gameColour ?? type.DefaultColor() ?? 0;
- }
-
- ImGui.SameLine();
-
- var vec = Mutable.ChatColours.TryGetValue(type, out var colour)
- ? ColourUtil.RgbaToVector3(colour)
- : ColourUtil.RgbaToVector3(type.DefaultColor() ?? 0);
- if (ImGui.ColorEdit3(type.Name(), ref vec, ImGuiColorEditFlags.NoInputs))
- {
- Mutable.ChatColours[type] = ColourUtil.Vector3ToRgba(vec);
- }
- }
- }
-
- ImGui.Spacing();
- }
- }
-
- private void DrawColourPresetButtons()
- {
- var first = true;
- foreach (var (_, preset) in ChatColourPresets.All)
- {
- if (!first)
- {
- ImGui.SameLine();
- }
- first = false;
-
- if (preset.IsBrandPreset)
- {
- var border = ColourUtil.RgbaToVector3(ColourUtil.ComponentsToRgba(255, 128, 200));
- var btn = ColourUtil.RgbaToVector3(ColourUtil.ComponentsToRgba(74, 42, 106));
- ImGui.PushStyleColor(
- ImGuiCol.Border,
- new System.Numerics.Vector4(border.X, border.Y, border.Z, 1f)
- );
- ImGui.PushStyleColor(
- ImGuiCol.Button,
- new System.Numerics.Vector4(btn.X, btn.Y, btn.Z, 1f)
- );
- ImGui.PushStyleVar(ImGuiStyleVar.FrameBorderSize, 1.5f);
- }
-
- if (ImGui.Button(GetPresetLabel(preset)))
- {
- ApplyPreset(preset);
- }
-
- if (preset.IsBrandPreset)
- {
- ImGui.PopStyleVar();
- ImGui.PopStyleColor(2);
- }
- }
- }
-
- private static string GetPresetLabel(ChatColourPreset preset)
- {
- var localized = HellionStrings.ResourceManager.GetString(
- preset.LocalizationKey,
- HellionStrings.Culture
- );
- return string.IsNullOrEmpty(localized) ? preset.DisplayName : localized;
- }
-
- private void ApplyPreset(ChatColourPreset preset)
- {
- foreach (var (channel, colour) in preset.Colours)
- {
- Mutable.ChatColours[channel] = colour;
- }
- Plugin.SaveConfig();
- GlobalParametersCache.Refresh();
- _logger.LogDebug($"Applied chat colour preset: {preset.DisplayName}");
- }
-}
diff --git a/HellionChat/Ui/SettingsTabs/General.cs b/HellionChat/Ui/SettingsTabs/General.cs
index 81654ad..1e48b42 100644
--- a/HellionChat/Ui/SettingsTabs/General.cs
+++ b/HellionChat/Ui/SettingsTabs/General.cs
@@ -19,24 +19,24 @@ internal sealed class General : ISettingsTab
Mutable = mutable;
}
- public void Draw(bool changed)
+ public void Draw(bool sectionJustEntered)
{
- DrawInputSection();
+ DrawInputSection(sectionJustEntered);
ImGui.Spacing();
- DrawAudioSection();
+ DrawSoundSection(sectionJustEntered);
ImGui.Spacing();
- DrawPerformanceSection();
+ DrawLanguageSection(sectionJustEntered);
ImGui.Spacing();
- DrawLanguageSection();
+ DrawPerformanceSection(sectionJustEntered);
}
- private void DrawInputSection()
+ private void DrawInputSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_General_Input_Heading);
+ // Collapse every time the tab is freshly entered so state doesn't bleed across sessions.
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Input);
if (!tree.Success)
- {
return;
- }
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
@@ -83,53 +83,55 @@ internal sealed class General : ISettingsTab
}
}
- private void DrawAudioSection()
+ private void DrawSoundSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_General_Audio_Heading);
+ // Collapse every time the tab is freshly entered so state doesn't bleed across sessions.
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Sound);
if (!tree.Success)
- {
return;
- }
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
ImGui.Checkbox(Language.Options_PlaySounds_Name, ref Mutable.PlaySounds);
ImGuiUtil.HelpMarker(Language.Options_PlaySounds_Description);
-
- ImGui.Checkbox(Language.Options_ShowNoviceNetwork_Name, ref Mutable.ShowNoviceNetwork);
- ImGuiUtil.HelpMarker(Language.Options_ShowNoviceNetwork_Description);
- }
- }
-
- private void DrawPerformanceSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_General_Performance_Heading);
- if (!tree.Success)
- {
- return;
- }
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.SetNextItemWidth(200f * ImGuiHelpers.GlobalScale);
- if (ImGui.InputInt(Language.Options_MaxLinesToShow_Name, ref Mutable.MaxLinesToRender))
+ // Volume is stored as a 0-1 float but shown as 0-100% to match user
+ // intuition. Full range — unlike opacity there is no unsafe floor.
+ var customSoundVolumePercent = Mutable.CustomSoundVolume * 100f;
+ if (
+ ImGuiUtil.DragFloatVertical(
+ HellionStrings.Settings_General_CustomSoundVolume_Name,
+ ref customSoundVolumePercent,
+ 1f,
+ 0f,
+ 100f,
+ $"{customSoundVolumePercent:N0}%%",
+ ImGuiSliderFlags.AlwaysClamp
+ )
+ )
{
- Mutable.MaxLinesToRender = Math.Clamp(Mutable.MaxLinesToRender, 1, 10_000);
+ Mutable.CustomSoundVolume = customSoundVolumePercent / 100f;
}
- ImGuiUtil.HelpMarker(Language.Options_MaxLinesToShow_Description);
+ // Show the functional description and the per-tab navigation hint together.
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_General_CustomSoundVolume_Description + "\n\n" + HellionStrings.Settings_Section_Sound_TabsHint);
}
}
- private void DrawLanguageSection()
+ private void DrawLanguageSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_General_Language_Heading);
+ // Collapse every time the tab is freshly entered so state doesn't bleed across sessions.
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Language);
if (!tree.Success)
- {
return;
- }
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
{
+ ImGui.Checkbox(Language.Options_SortAutoTranslate_Name, ref Mutable.SortAutoTranslate);
+ ImGuiUtil.HelpMarker(Language.Options_SortAutoTranslate_Description);
+
+ ImGui.Spacing();
+
using (
var combo = ImGuiUtil.BeginComboVertical(
Language.Options_Language_Name,
@@ -183,9 +185,25 @@ internal sealed class General : ISettingsTab
string.Format(Language.Options_CommandHelpSide_Description, Plugin.PluginName)
);
ImGui.Spacing();
+ }
+ }
- ImGui.Checkbox(Language.Options_SortAutoTranslate_Name, ref Mutable.SortAutoTranslate);
- ImGuiUtil.HelpMarker(Language.Options_SortAutoTranslate_Description);
+ private void DrawPerformanceSection(bool sectionJustEntered)
+ {
+ // Collapse every time the tab is freshly entered so state doesn't bleed across sessions.
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Performance);
+ if (!tree.Success)
+ return;
+
+ using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
+ {
+ ImGui.SetNextItemWidth(200f * ImGuiHelpers.GlobalScale);
+ if (ImGui.InputInt(Language.Options_MaxLinesToShow_Name, ref Mutable.MaxLinesToRender))
+ {
+ Mutable.MaxLinesToRender = Math.Clamp(Mutable.MaxLinesToRender, 1, 10_000);
+ }
+ ImGuiUtil.HelpMarker(Language.Options_MaxLinesToShow_Description);
}
}
}
diff --git a/HellionChat/Ui/SettingsTabs/ISettingsTab.cs b/HellionChat/Ui/SettingsTabs/ISettingsTab.cs
index ce99fea..9dbdd39 100755
--- a/HellionChat/Ui/SettingsTabs/ISettingsTab.cs
+++ b/HellionChat/Ui/SettingsTabs/ISettingsTab.cs
@@ -3,5 +3,5 @@ namespace HellionChat.Ui.SettingsTabs;
internal interface ISettingsTab
{
string Name { get; }
- void Draw(bool changed);
+ void Draw(bool sectionJustEntered);
}
diff --git a/HellionChat/Ui/SettingsTabs/Information.cs b/HellionChat/Ui/SettingsTabs/Information.cs
deleted file mode 100644
index 39c1208..0000000
--- a/HellionChat/Ui/SettingsTabs/Information.cs
+++ /dev/null
@@ -1,251 +0,0 @@
-using System.Numerics;
-using Dalamud.Bindings.ImGui;
-using Dalamud.Interface;
-using Dalamud.Interface.Colors;
-using Dalamud.Interface.Utility;
-using Dalamud.Interface.Utility.Raii;
-using HellionChat.Branding;
-using HellionChat.Resources;
-using HellionChat.Util;
-
-namespace HellionChat.Ui.SettingsTabs;
-
-// Combines the former About and Changelog tabs into three collapsible sections.
-internal sealed class Information : ISettingsTab
-{
- private Configuration Mutable { get; }
-
- public string Name => HellionStrings.Settings_Tab_Information + "###tabs-information";
-
- private readonly List Translators =
- [
- "q673135110",
- "Akizem",
- "d0tiKs",
- "Moonlight_Everlit",
- "Dark32",
- "andreycout",
- "Button_",
- "Cali666",
- "cassandra308",
- "lokinmodar",
- "jtabox",
- "AkiraYorumoto",
- "MKhayle",
- "elena.space",
- "imlisa",
- "andrei5125",
- "ShivaMaheshvara",
- "aislinn87",
- "nishinatsu051",
- "lichuyuan",
- "Risu64",
- "yummypillow",
- "witchymary",
- "Yuzumi",
- "zomsakura",
- "Sirayuki",
- ];
-
- internal Information(Configuration mutable)
- {
- Mutable = mutable;
- Translators.Sort(
- (a, b) =>
- string.Compare(a.ToLowerInvariant(), b.ToLowerInvariant(), StringComparison.Ordinal)
- );
- }
-
- public void Draw(bool changed)
- {
- using var wrap = ImRaii.TextWrapPos(0.0f);
-
- DrawHellionForgeSection();
- ImGui.Spacing();
- DrawVersionInfoSection();
- ImGui.Spacing();
- DrawAboutSection();
- ImGui.Spacing();
- DrawChangelogSection();
- }
-
- private void DrawHellionForgeSection()
- {
- var banner = FoxBannerTexture.Shared.GetWrapOrDefault();
- if (banner is null)
- return;
-
- const uint CardColor = 0xFFE8E8E8; // off-white fill so the dark fox pops
- var imgHeight = 170f * ImGuiHelpers.GlobalScale;
- var imgWidth = imgHeight * banner.Size.X / banner.Size.Y;
- var pad = 14f * ImGuiHelpers.GlobalScale;
- var cardWidth = imgWidth + pad * 2f;
- var cardHeight = imgHeight + pad * 2f;
- var rounding = 8f * ImGuiHelpers.GlobalScale;
-
- // Left-aligned: card origin stays at the current layout cursor position.
- var cardOrigin = ImGui.GetCursorScreenPos();
-
- // Draw the rounded card behind the image, then place the image on top.
- ImGui
- .GetWindowDrawList()
- .AddRectFilled(
- cardOrigin,
- cardOrigin + new Vector2(cardWidth, cardHeight),
- CardColor,
- rounding
- );
- ImGui.SetCursorScreenPos(cardOrigin + new Vector2(pad, pad));
- ImGui.Image(banner.Handle, new Vector2(imgWidth, imgHeight));
-
- // Advance the layout cursor past the full card so content below does not overlap.
- ImGui.SetCursorScreenPos(cardOrigin);
- ImGui.Dummy(new Vector2(cardWidth, cardHeight));
- }
-
- private void DrawVersionInfoSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Information_VersionInfo_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.TextUnformatted(string.Format(Language.Options_About_Opening, Plugin.PluginName));
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextUnformatted(Language.Options_About_Authors);
- ImGui.SameLine();
- ImGui.TextColored(ImGuiColors.ParsedGold, Plugin.Interface.Manifest.Author);
-
- ImGui.TextUnformatted(Language.Options_About_Discord);
- ImGui.SameLine();
- ImGui.TextColored(ImGuiColors.ParsedGold, "@j.j_kazama");
-
- ImGui.TextUnformatted(Language.Options_About_Version);
- ImGui.SameLine();
- ImGui.TextColored(
- ImGuiColors.ParsedOrange,
- Plugin.Interface.Manifest.AssemblyVersion.ToString(3)
- );
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextUnformatted(Language.Options_About_Github_Issues);
- ImGui.SameLine();
- if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "githubIssues"))
- Plugin.PlatformUtil.OpenLink(
- "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/issues"
- );
- }
- }
-
- private void DrawAboutSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Information_About_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Maintainer_Heading);
- ImGui.TextUnformatted(HellionStrings.About_Maintainer_Body);
- ImGui.TextUnformatted(HellionStrings.About_Maintainer_Website_Label);
- ImGui.SameLine();
- if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "hellionMedia"))
- Plugin.PlatformUtil.OpenLink("https://hellion-media.de");
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Mission_Heading);
- ImGui.TextUnformatted(HellionStrings.About_Mission_P1);
- ImGui.Spacing();
- ImGui.TextUnformatted(HellionStrings.About_Mission_P2);
- ImGui.Spacing();
- ImGui.TextUnformatted(HellionStrings.About_Mission_P3);
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_BuiltOn_Heading);
- ImGui.TextUnformatted(HellionStrings.About_BuiltOn_P1);
- ImGui.Spacing();
- ImGui.TextUnformatted(HellionStrings.About_BuiltOn_P2);
- ImGui.Spacing();
- ImGui.TextUnformatted(HellionStrings.About_BuiltOn_Upstream_Label);
- ImGui.SameLine();
- if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "chatTwoUpstream"))
- Plugin.PlatformUtil.OpenLink("https://github.com/Infiziert90/ChatTwo");
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_License_Heading);
- ImGui.TextUnformatted(HellionStrings.About_License_P1);
- ImGui.TextUnformatted(HellionStrings.About_License_P2);
- ImGui.TextUnformatted(HellionStrings.About_License_P3);
-
- ImGuiHelpers.ScaledDummy(10.0f);
-
- ImGui.TextColored(ImGuiColors.DalamudOrange, HellionStrings.About_SE_Heading);
- ImGui.TextUnformatted(HellionStrings.About_SE_P1);
- ImGui.TextUnformatted(HellionStrings.About_SE_P2);
-
- ImGui.Spacing();
-
- ImGui.TextColored(ImGuiColors.ParsedGold, HellionStrings.About_Localization_Heading);
- ImGui.TextUnformatted(HellionStrings.About_Localization_P1);
- ImGui.TextUnformatted(HellionStrings.About_Localization_P2);
-
- ImGui.Spacing();
-
- using (var translatorTree = ImRaii.TreeNode(HellionStrings.About_Translators_TreeNode))
- {
- if (translatorTree)
- {
- using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
- foreach (var translator in Translators)
- ImGui.TextUnformatted(translator);
- }
- }
- }
- }
-
- private void DrawChangelogSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Information_Changelog_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.Checkbox(Language.Options_PrintChangelog_Name, ref Mutable.PrintChangelog);
- ImGuiUtil.HelpMarker(Language.Options_PrintChangelog_Description);
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- var changelog = Plugin.Interface.Manifest.Changelog;
- if (changelog == null)
- return;
-
- ImGui.TextUnformatted(Language.Options_Changelog_Header);
- ImGui.TextUnformatted(
- $"Version {Plugin.Interface.Manifest.AssemblyVersion.ToString(3)}"
- );
- ImGui.Spacing();
- foreach (var sentence in changelog.Split("\n"))
- {
- if (sentence == string.Empty)
- {
- ImGui.NewLine();
- continue;
- }
-
- var indented = sentence.StartsWith('-') || sentence.StartsWith(" -");
- using var indent = ImRaii.PushIndent(10.0f, true, indented);
- ImGui.TextUnformatted(sentence);
- }
- }
- }
-}
diff --git a/HellionChat/Ui/SettingsTabs/Integrations.cs b/HellionChat/Ui/SettingsTabs/Integrations.cs
deleted file mode 100644
index 4f7792d..0000000
--- a/HellionChat/Ui/SettingsTabs/Integrations.cs
+++ /dev/null
@@ -1,219 +0,0 @@
-using Dalamud.Bindings.ImGui;
-using Dalamud.Interface;
-using Dalamud.Interface.Utility.Raii;
-using HellionChat.Branding;
-using HellionChat.Integrations;
-using HellionChat.Resources;
-using HellionChat.Util;
-
-namespace HellionChat.Ui.SettingsTabs;
-
-// Added in v1.3.0. Each future integration cycle adds a section above
-// the "Coming soon" block and removes its stub item.
-internal sealed class Integrations : ISettingsTab
-{
- private Plugin Plugin { get; }
- private Configuration Mutable { get; }
-
- public string Name => HellionStrings.Settings_Tab_Integrations + "###tabs-integrations";
-
- internal Integrations(Plugin plugin, Configuration mutable)
- {
- Plugin = plugin;
- Mutable = mutable;
- }
-
- public void Draw(bool changed)
- {
- ImGui.TextWrapped(HellionStrings.Settings_Integrations_Intro);
- ImGui.Spacing();
- ImGui.Spacing();
-
- DrawHonorificSection();
- ImGui.Spacing();
- ImGui.Spacing();
-
- DrawComingSoonSection();
- ImGui.Spacing();
- ImGui.Spacing();
-
- DrawGotAnIdeaSection();
- }
-
- private void DrawHonorificSection()
- {
- DrawSectionHeader(HellionStrings.Settings_Integrations_Honorific_SectionHeader);
-
- DrawHonorificStatus();
- ImGui.Spacing();
-
- // Toggle works regardless of detection state: "show when available,
- // hide otherwise". Disabling it when Honorific is missing would force
- // the user to retoggle on every reload.
- if (
- ImGui.Checkbox(
- HellionStrings.Settings_Integrations_Honorific_Toggle,
- ref Mutable.ShowHonorificTitleInHeader
- )
- )
- {
- Plugin.SaveConfig();
- }
-
- using (ImRaii.PushIndent())
- {
- using (
- ImRaii.PushColor(
- ImGuiCol.Text,
- ColourUtil.RgbaToAbgr(Plugin.ThemeRegistry.Active.Colors.TextMuted)
- )
- )
- {
- ImGui.TextWrapped(HellionStrings.Settings_Integrations_Honorific_ToggleHint);
- }
-
- if (
- ImGui.Checkbox(
- HellionStrings.Settings_Integrations_Honorific_Glow_Toggle,
- ref Mutable.ShowHonorificGlow
- )
- )
- {
- Plugin.SaveConfig();
- }
- ImGuiUtil.HelpMarker(HellionStrings.Settings_Integrations_Honorific_Glow_Hint);
- }
-
- // Honorific has no LICENSE in its repo so we link upstream and author
- // instead of bundling assets. Text labels because FA Brands isn't
- // guaranteed in Dalamud's font set.
- ImGui.Spacing();
- if (ImGui.Button(HellionStrings.Settings_Integrations_Honorific_LinkRepo))
- {
- Plugin.PlatformUtil.OpenLink(IntegrationLinks.HonorificRepo);
- }
- ImGui.SameLine();
- if (ImGui.Button(HellionStrings.Settings_Integrations_Honorific_LinkAuthor))
- {
- Plugin.PlatformUtil.OpenLink(IntegrationLinks.HonorificAuthor);
- }
- }
-
- private void DrawHonorificStatus()
- {
- var theme = Plugin.ThemeRegistry.Active;
- var service = Plugin.HonorificService;
-
- if (service.IsAvailable && service.DetectedApiVersion is { } version)
- {
- DrawStatusGlyph('●', theme.Colors.StatusSuccess);
- ImGui.SameLine();
- ImGui.TextUnformatted(
- string.Format(
- HellionStrings.Settings_Integrations_Honorific_Status_Detected,
- version.Major,
- version.Minor
- )
- );
- }
- else if (service.DetectedApiVersion is { } incompatibleVersion)
- {
- DrawStatusGlyph('⚠', theme.Colors.StatusWarning);
- ImGui.SameLine();
- ImGui.TextUnformatted(
- string.Format(
- HellionStrings.Settings_Integrations_Honorific_Status_Incompatible,
- HonorificService.ExpectedApiMajor,
- incompatibleVersion.Major,
- incompatibleVersion.Minor
- )
- );
- }
- else
- {
- DrawStatusGlyph('○', theme.Colors.TextMuted);
- ImGui.SameLine();
- ImGui.TextUnformatted(
- HellionStrings.Settings_Integrations_Honorific_Status_NotInstalled
- );
- }
- }
-
- private static void DrawStatusGlyph(char glyph, uint rgba)
- {
- using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(rgba)))
- {
- ImGui.TextUnformatted(glyph.ToString());
- }
- }
-
- private void DrawComingSoonSection()
- {
- DrawSectionHeader(HellionStrings.Settings_Integrations_ComingSoon_SectionHeader);
- ImGui.TextWrapped(HellionStrings.Settings_Integrations_ComingSoon_Intro);
- ImGui.Spacing();
-
- // Each integration cycle removes its stub here and adds a full section above.
- DrawComingSoonItem(
- HellionStrings.Settings_Integrations_ComingSoon_ContextMenu_Title,
- HellionStrings.Settings_Integrations_ComingSoon_ContextMenu_Description
- );
- DrawComingSoonItem(
- HellionStrings.Settings_Integrations_ComingSoon_Notifications_Title,
- HellionStrings.Settings_Integrations_ComingSoon_Notifications_Description
- );
- DrawComingSoonItem(
- HellionStrings.Settings_Integrations_ComingSoon_RPStatus_Title,
- HellionStrings.Settings_Integrations_ComingSoon_RPStatus_Description
- );
- DrawComingSoonItem(
- HellionStrings.Settings_Integrations_ComingSoon_ExtraChat_Title,
- HellionStrings.Settings_Integrations_ComingSoon_ExtraChat_Description
- );
- DrawComingSoonItem(
- HellionStrings.Settings_Integrations_ComingSoon_QuickDM_Title,
- HellionStrings.Settings_Integrations_ComingSoon_QuickDM_Description
- );
- }
-
- private void DrawComingSoonItem(string title, string description)
- {
- var theme = Plugin.ThemeRegistry.Active;
- using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.TextMuted)))
- using (Plugin.FontManager.FontAwesome.Push())
- {
- ImGui.TextUnformatted(FontAwesomeIcon.Hourglass.ToIconString());
- }
- ImGui.SameLine();
- ImGui.TextUnformatted(title);
- using (ImRaii.PushIndent())
- {
- using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.TextMuted)))
- {
- ImGui.TextWrapped(description);
- }
- }
- ImGui.Spacing();
- }
-
- private void DrawGotAnIdeaSection()
- {
- DrawSectionHeader(HellionStrings.Settings_Integrations_GotAnIdea_SectionHeader);
- ImGui.TextWrapped(HellionStrings.Settings_Integrations_GotAnIdea_Body);
- ImGui.Spacing();
-
- if (ImGui.Button(HellionStrings.Settings_Integrations_GotAnIdea_LinkLabel))
- {
- Plugin.PlatformUtil.OpenLink(BrandingLinks.HellionForgeDiscordInvite);
- }
- }
-
- private void DrawSectionHeader(string label)
- {
- var theme = Plugin.ThemeRegistry.Active;
- using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(theme.Colors.Primary)))
- {
- ImGui.TextUnformatted("── " + label + " ──");
- }
- }
-}
diff --git a/HellionChat/Ui/SettingsTabs/Privacy.cs b/HellionChat/Ui/SettingsTabs/Privacy.cs
deleted file mode 100644
index 27e70a4..0000000
--- a/HellionChat/Ui/SettingsTabs/Privacy.cs
+++ /dev/null
@@ -1,198 +0,0 @@
-using Dalamud.Bindings.ImGui;
-using Dalamud.Interface.Utility.Raii;
-using HellionChat.Code;
-using HellionChat.Privacy;
-using HellionChat.Resources;
-using HellionChat.Util;
-
-namespace HellionChat.Ui.SettingsTabs;
-
-internal sealed class Privacy : ISettingsTab
-{
- private Plugin Plugin { get; }
- private Configuration Mutable { get; }
-
- public string Name => HellionStrings.Privacy_Tab_Title + "###tabs-privacy";
-
- internal Privacy(Plugin plugin, Configuration mutable)
- {
- Plugin = plugin;
- Mutable = mutable;
- }
-
- // (HeadingKey, ChatType list). Heading resolved per-frame for live language switching.
- private static readonly (Func Heading, ChatType[] Types)[] Groups =
- [
- (
- () => HellionStrings.Privacy_Group_DirectMessages,
- [ChatType.TellIncoming, ChatType.TellOutgoing]
- ),
- (
- () => HellionStrings.Privacy_Group_PartyAlliance,
- [ChatType.Party, ChatType.CrossParty, ChatType.Alliance, ChatType.PvpTeam]
- ),
- (
- () => HellionStrings.Privacy_Group_FreeCompany,
- [
- ChatType.FreeCompany,
- ChatType.FreeCompanyAnnouncement,
- ChatType.FreeCompanyLoginLogout,
- ]
- ),
- (
- () => HellionStrings.Privacy_Group_Linkshells,
- [
- ChatType.Linkshell1,
- ChatType.Linkshell2,
- ChatType.Linkshell3,
- ChatType.Linkshell4,
- ChatType.Linkshell5,
- ChatType.Linkshell6,
- ChatType.Linkshell7,
- ChatType.Linkshell8,
- ]
- ),
- (
- () => HellionStrings.Privacy_Group_CrossLinkshells,
- [
- ChatType.CrossLinkshell1,
- ChatType.CrossLinkshell2,
- ChatType.CrossLinkshell3,
- ChatType.CrossLinkshell4,
- ChatType.CrossLinkshell5,
- ChatType.CrossLinkshell6,
- ChatType.CrossLinkshell7,
- ChatType.CrossLinkshell8,
- ]
- ),
- (
- () => HellionStrings.Privacy_Group_ExtraChat,
- [
- ChatType.ExtraChatLinkshell1,
- ChatType.ExtraChatLinkshell2,
- ChatType.ExtraChatLinkshell3,
- ChatType.ExtraChatLinkshell4,
- ChatType.ExtraChatLinkshell5,
- ChatType.ExtraChatLinkshell6,
- ChatType.ExtraChatLinkshell7,
- ChatType.ExtraChatLinkshell8,
- ]
- ),
- (
- () => HellionStrings.Privacy_Group_PublicChat,
- [
- ChatType.Say,
- ChatType.Shout,
- ChatType.Yell,
- ChatType.NoviceNetwork,
- ChatType.CustomEmote,
- ChatType.StandardEmote,
- ]
- ),
- (
- () => HellionStrings.Privacy_Group_SystemLogs,
- [
- ChatType.System,
- ChatType.Notice,
- ChatType.Urgent,
- ChatType.Echo,
- ChatType.NpcDialogue,
- ChatType.NpcAnnouncement,
- ChatType.LootNotice,
- ChatType.LootRoll,
- ChatType.RetainerSale,
- ChatType.Crafting,
- ChatType.Gathering,
- ChatType.Sign,
- ChatType.RandomNumber,
- ]
- ),
- ];
-
- public void Draw(bool changed)
- {
- if (ImGui.Button(HellionStrings.Wizard_Reopen_Button))
- Plugin.FirstRunWizard.IsOpen = true;
- ImGui.Spacing();
-
- DrawPrivacyFilterSection();
- }
-
- private void DrawPrivacyFilterSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Privacy_Filter_Tree_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGuiUtil.OptionCheckbox(
- ref Mutable.PrivacyFilterEnabled,
- HellionStrings.Privacy_FilterEnabled_Name,
- HellionStrings.Privacy_FilterEnabled_Description
- );
- ImGuiUtil.HelpMarker(HellionStrings.Privacy_FilterEnabled_StorageOnly_Help);
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- using (ImRaii.Disabled(!Mutable.PrivacyFilterEnabled))
- {
- ImGuiUtil.HelpText(HellionStrings.Privacy_Whitelist_Help);
-
- ImGui.Spacing();
-
- if (ImGui.Button(HellionStrings.Privacy_Preset_PrivacyFirst))
- Mutable.PrivacyPersistChannels = [.. PrivacyDefaults.PrivacyFirstWhitelist];
-
- ImGui.SameLine();
- if (ImGui.Button(HellionStrings.Privacy_Preset_ClearAll))
- Mutable.PrivacyPersistChannels.Clear();
-
- ImGui.SameLine();
- if (ImGui.Button(HellionStrings.Privacy_Preset_SelectAll))
- foreach (var group in Groups)
- foreach (var t in group.Types)
- Mutable.PrivacyPersistChannels.Add(t);
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- foreach (var (heading, types) in Groups)
- {
- using var groupTree = ImRaii.TreeNode(heading());
- if (!groupTree.Success)
- continue;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- foreach (var type in types)
- {
- var enabled = Mutable.PrivacyPersistChannels.Contains(type);
- var label = type.ToString();
- if (ImGui.Checkbox($"{label}##privacy-{(int)type}", ref enabled))
- {
- if (enabled)
- Mutable.PrivacyPersistChannels.Add(type);
- else
- Mutable.PrivacyPersistChannels.Remove(type);
- }
- }
- }
- }
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(
- ref Mutable.PrivacyPersistUnknownChannels,
- HellionStrings.Privacy_PersistUnknown_Name,
- HellionStrings.Privacy_PersistUnknown_Description
- );
- }
- }
- }
-}
diff --git a/HellionChat/Ui/SettingsTabs/Tabs.cs b/HellionChat/Ui/SettingsTabs/Tabs.cs
index 2d97523..4bd008d 100755
--- a/HellionChat/Ui/SettingsTabs/Tabs.cs
+++ b/HellionChat/Ui/SettingsTabs/Tabs.cs
@@ -24,7 +24,7 @@ internal sealed class Tabs : ISettingsTab
Mutable = mutable;
}
- public void Draw(bool changed)
+ public void Draw(bool sectionJustEntered)
{
const string addTabPopup = "add-tab-popup";
@@ -72,6 +72,13 @@ internal sealed class Tabs : ISettingsTab
{
var tab = Mutable.Tabs[i];
+ // Sub-sections (Channels/Display/Notification/Input/Pop-out) are inlined into
+ // this loop body rather than extracted to helpers, because each one closes over
+ // the per-iteration `i` and `tab` state. Extraction would mean passing both
+ // into every helper without meaningful encapsulation gain.
+
+ // ToOpen controls which tab-item TreeNode is open (e.g. after add/move).
+ // This is the outer level — not touched by sectionJustEntered.
if (doOpens)
ImGui.SetNextItemOpen(i == ToOpen);
@@ -117,6 +124,7 @@ internal sealed class Tabs : ISettingsTab
ToOpen = i + 1;
}
+ // Name and Icon are always visible — no sub-section collapse for these.
ImGui.InputText(
Language.Options_Tabs_Name,
ref tab.Name,
@@ -165,284 +173,376 @@ internal sealed class Tabs : ISettingsTab
}
}
- ImGui.Checkbox(Language.Options_Tabs_ShowTimestamps, ref tab.DisplayTimestamp);
- ImGui.Checkbox(
- HellionStrings.Tabs_NotificationSound_Enable_Name,
- ref tab.EnableNotificationSound
- );
- ImGuiUtil.HelpMarker(HellionStrings.Tabs_NotificationSound_Description);
- if (tab.EnableNotificationSound)
+ ImGui.Spacing();
+
+ // ── Sub-section: Channels ─────────────────────────────────────────
+ // First because it answers "what does this tab collect?" — most important.
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using (var secChannels = ImRaii.TreeNode(HellionStrings.Settings_Section_Tab_Channels + $"##sec-channels-{i}"))
{
- using var indent = ImRaii.PushIndent(10.0f);
- // Build a readable preview label for the currently selected sound.
- var soundPreview =
- tab.NotificationSoundId <= 16
- ? $"{HellionStrings.Tabs_NotificationSound_Option} {tab.NotificationSoundId}"
- : $"{HellionStrings.Tabs_NotificationSound_CustomOption} {tab.NotificationSoundId - 16}";
- using (var combo = ImRaii.Combo($"##notif-sound-{i}", soundPreview))
+ if (secChannels.Success)
{
- if (combo.Success)
- {
- for (uint s = 1; s <= 16; s++)
- {
- if (
- ImGui.Selectable(
- $"{HellionStrings.Tabs_NotificationSound_Option} {s}",
- tab.NotificationSoundId == s
- )
- )
- tab.NotificationSoundId = s;
- }
-
- ImGui.Separator();
-
- // Bundled custom sounds (ids 17-19).
- for (uint n = 1; n <= 3; n++)
- {
- var customId = 16 + n;
- if (
- ImGui.Selectable(
- $"{HellionStrings.Tabs_NotificationSound_CustomOption} {n}",
- tab.NotificationSoundId == customId
- )
- )
- tab.NotificationSoundId = customId;
- }
- }
- }
-
- // Let the user hear the currently selected sound without waiting
- // for a real message to arrive in this tab.
- ImGui.SameLine();
- if (
- ImGuiUtil.IconButton(
- FontAwesomeIcon.Play,
- tooltip: HellionStrings.Tabs_NotificationSound_Preview
- )
- )
- {
- var previewId = tab.NotificationSoundId;
- if (previewId <= 16)
- {
- Plugin.Framework.RunOnFrameworkThread(() =>
- {
- unsafe
- {
- UIGlobals.PlaySoundEffect(previewId);
- }
- });
- }
- else
- {
- Plugin.CustomAudioPlayer.Play((int)previewId - 16);
- }
- }
- }
- ImGui.Checkbox(Language.Options_Tabs_PopOut, ref tab.PopOut);
- if (tab.PopOut)
- {
- using var _ = ImRaii.PushIndent(10.0f);
- ImGui.Checkbox(
- Language.Options_Tabs_IndependentOpacity,
- ref tab.IndependentOpacity
- );
- if (tab.IndependentOpacity)
- ImGuiUtil.DragFloatVertical(
- Language.Options_Tabs_Opacity,
- ref tab.Opacity,
- 0.25f,
- 0f,
- 100f,
- $"{tab.Opacity:N2}%%",
- ImGuiSliderFlags.AlwaysClamp
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+ ImGuiUtil.ChannelSelector(Language.Options_Tabs_Channels, tab.SelectedChannels);
+ ImGuiUtil.ExtraChatSelector(
+ Language.Options_Tabs_ExtraChatChannels,
+ ref tab.ExtraChatAll,
+ tab.ExtraChatChannels
);
-
- ImGui.Checkbox(Language.Options_Tabs_IndependentHide, ref tab.IndependentHide);
- if (tab.IndependentHide)
- {
- using var __ = ImRaii.PushIndent(10.0f);
- ImGuiUtil.OptionCheckbox(
- ref tab.HideDuringCutscenes,
- Language.Options_HideDuringCutscenes_Name
- );
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(
- ref tab.HideWhenNotLoggedIn,
- Language.Options_HideWhenNotLoggedIn_Name
- );
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(
- ref tab.HideWhenUiHidden,
- Language.Options_HideWhenUiHidden_Name
- );
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(
- ref tab.HideInLoadingScreens,
- Language.Options_HideInLoadingScreens_Name
- );
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(
- ref tab.HideInBattle,
- Language.Options_HideInBattle_Name
- );
- ImGui.Spacing();
- }
-
- ImGuiUtil.OptionCheckbox(ref tab.CanMove, Language.Popout_CanMove_Name);
- ImGui.Spacing();
-
- ImGuiUtil.OptionCheckbox(ref tab.CanResize, Language.Popout_CanResize_Name);
- ImGui.Spacing();
- }
-
- using (
- var combo = ImGuiUtil.BeginComboVertical(
- Language.Options_Tabs_UnreadMode,
- tab.UnreadMode.Name()
- )
- )
- {
- if (combo.Success)
- {
- foreach (var mode in Enum.GetValues())
- {
- if (ImGui.Selectable(mode.Name(), tab.UnreadMode == mode))
- tab.UnreadMode = mode;
-
- if (mode.Tooltip() is { } tooltip && ImGui.IsItemHovered())
- ImGuiUtil.Tooltip(tooltip);
- }
}
}
- if (Mutable.HideWhenInactive)
- ImGui.Checkbox(Language.Options_Tabs_InactivityBehaviour, ref tab.UnhideOnActivity);
+ ImGui.Spacing();
- ImGui.Checkbox(Language.Options_Tabs_NoInput, ref tab.InputDisabled);
- if (!tab.InputDisabled)
+ // ── Sub-section: Display ──────────────────────────────────────────
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using (var secDisplay = ImRaii.TreeNode(HellionStrings.Settings_Section_Tab_Display + $"##sec-display-{i}"))
{
- var input =
- tab.Channel?.ToChatType().Name() ?? Language.Options_Tabs_NoInputChannel;
- using (
- var combo = ImGuiUtil.BeginComboVertical(
- Language.Options_Tabs_InputChannel,
- input
- )
- )
+ if (secDisplay.Success)
{
- if (combo.Success)
- {
- if (
- ImGui.Selectable(
- Language.Options_Tabs_NoInputChannel,
- tab.Channel == null
- )
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+
+ ImGui.Checkbox(Language.Options_Tabs_ShowTimestamps, ref tab.DisplayTimestamp);
+
+ using (
+ var combo = ImGuiUtil.BeginComboVertical(
+ Language.Options_Tabs_UnreadMode,
+ tab.UnreadMode.Name()
)
- tab.Channel = null;
-
- foreach (var channel in Enum.GetValues())
- if (
- ImGui.Selectable(
- channel.ToChatType().Name(),
- tab.Channel == channel
- )
- )
- tab.Channel = channel;
- }
- }
-
- var player = Plugin.ObjectTable.LocalPlayer;
- if (tab.Channel == InputChannel.Tell && player != null)
- {
- ImGui.Checkbox(Language.Options_Tabs_SenderMessages, ref tab.AllSenderMessages);
- ImGuiUtil.HelpText(Language.Options_Help_SenderMessages);
-
- var worlds = Sheets
- .WorldsOnDatacenter(player)
- .OrderByDescending(world => world.DataCenter.RowId)
- .ThenBy(world => world.Name.ToString())
- .ToList();
-
- using (ImRaii.ItemWidth(ImGui.GetWindowWidth() / 3f))
+ )
{
- ImGui.Text(Language.Options_Header_Target);
- ImGui.SameLine();
-
- var name = tab.TellTarget.Name;
- if (ImGui.InputText("##targetInput", ref name, 21))
- tab.TellTarget.Name = name;
-
- ImGui.SameLine();
-
- // Guard against an empty worlds list (character switch or sheet not yet populated)
- // to avoid an out-of-bounds crash on worlds[selectedWorld].
- if (worlds.Count == 0)
+ if (combo.Success)
{
- ImGui.TextDisabled("(no worlds available)");
- }
- else
- {
- var selectedWorld = worlds.FindIndex(world =>
- world.RowId == tab.TellTarget.World
- );
- if (selectedWorld == -1)
- selectedWorld = 0;
-
- using (
- var combo = ImRaii.Combo(
- "###player-world",
- worlds[selectedWorld].Name.ToString()
- )
- )
+ foreach (var mode in Enum.GetValues())
{
- if (combo.Success)
+ if (ImGui.Selectable(mode.Name(), tab.UnreadMode == mode))
+ tab.UnreadMode = mode;
+
+ if (mode.Tooltip() is { } tooltip && ImGui.IsItemHovered())
+ ImGuiUtil.Tooltip(tooltip);
+ }
+ }
+ }
+
+ // Only relevant when the global hide-when-inactive is on.
+ if (Mutable.HideWhenInactive)
+ ImGui.Checkbox(Language.Options_Tabs_InactivityBehaviour, ref tab.UnhideOnActivity);
+ }
+ }
+
+ ImGui.Spacing();
+
+ // ── Sub-section: Notification ─────────────────────────────────────
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using (var secNotif = ImRaii.TreeNode(HellionStrings.Settings_Section_Tab_Notification + $"##sec-notif-{i}"))
+ {
+ if (secNotif.Success)
+ {
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+
+ ImGui.Checkbox(
+ HellionStrings.Tabs_NotificationSound_Enable_Name,
+ ref tab.EnableNotificationSound
+ );
+ ImGuiUtil.HelpMarker(HellionStrings.Tabs_NotificationSound_Description);
+ if (tab.EnableNotificationSound)
+ {
+ using var notifIndent = ImRaii.PushIndent(10.0f);
+ // Build a readable preview label for the currently selected sound.
+ var soundPreview =
+ tab.NotificationSoundId <= 16
+ ? $"{HellionStrings.Tabs_NotificationSound_Option} {tab.NotificationSoundId}"
+ : $"{HellionStrings.Tabs_NotificationSound_CustomOption} {tab.NotificationSoundId - 16}";
+ using (var combo = ImRaii.Combo($"##notif-sound-{i}", soundPreview))
+ {
+ if (combo.Success)
+ {
+ for (uint s = 1; s <= 16; s++)
{
- var lastDc = worlds.First().DataCenter.RowId;
- foreach (var (idx, world) in worlds.Index())
- {
- if (
- ImGui.Selectable(
- world.Name.ToString(),
- selectedWorld == idx
- )
+ if (
+ ImGui.Selectable(
+ $"{HellionStrings.Tabs_NotificationSound_Option} {s}",
+ tab.NotificationSoundId == s
)
- {
- selectedWorld = idx;
- tab.TellTarget.World = worlds[selectedWorld].RowId;
- }
+ )
+ tab.NotificationSoundId = s;
+ }
- if (lastDc == world.DataCenter.RowId)
- continue;
+ ImGui.Separator();
- lastDc = world.DataCenter.RowId;
- ImGui.Separator();
- }
+ // Bundled custom sounds (ids 17-19).
+ for (uint n = 1; n <= 3; n++)
+ {
+ var customId = 16 + n;
+ if (
+ ImGui.Selectable(
+ $"{HellionStrings.Tabs_NotificationSound_CustomOption} {n}",
+ tab.NotificationSoundId == customId
+ )
+ )
+ tab.NotificationSoundId = customId;
}
}
}
+
+ // Let the user hear the currently selected sound without waiting
+ // for a real message to arrive in this tab.
+ ImGui.SameLine();
+ if (
+ ImGuiUtil.IconButton(
+ FontAwesomeIcon.Play,
+ tooltip: HellionStrings.Tabs_NotificationSound_Preview
+ )
+ )
+ {
+ var previewId = tab.NotificationSoundId;
+ if (previewId <= 16)
+ {
+ Plugin.Framework.RunOnFrameworkThread(() =>
+ {
+ unsafe
+ {
+ UIGlobals.PlaySoundEffect(previewId);
+ }
+ });
+ }
+ else
+ {
+ Plugin.CustomAudioPlayer.Play((int)previewId - 16, Mutable.CustomSoundVolume);
+ }
+ }
}
- var target =
- (Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target)
- as IPlayerCharacter;
- using (ImRaii.Disabled(target == null))
+ // Volume is stored as a 0-1 float but shown as 0-100%.
+ // Same field as General → Sound; shown here for convenience.
+ // DragFloatVertical derives its widget ID from the label text and exposes no
+ // override. We inline the equivalent (text label + SetNextItemWidth + DragFloat)
+ // to keep an explicit ##tab-volume-{i} ID, which reads more clearly than relying
+ // on the surrounding PushId("tab-{i}") scope to disambiguate identical labels.
+ // Volume is global (Mutable.CustomSoundVolume) and applies to every tab's
+ // notification sound, so it is shown unconditionally — not gated by the
+ // per-tab EnableNotificationSound toggle.
+ ImGui.TextUnformatted(HellionStrings.Settings_General_CustomSoundVolume_Name);
+ ImGui.SetNextItemWidth(-1);
+ var customSoundVolumePercent = Mutable.CustomSoundVolume * 100f;
+ if (
+ ImGui.DragFloat(
+ $"##tab-volume-{i}",
+ ref customSoundVolumePercent,
+ 1f,
+ 0f,
+ 100f,
+ $"{customSoundVolumePercent:N0}%%",
+ ImGuiSliderFlags.AlwaysClamp
+ )
+ )
{
- if (ImGui.Button("Set to target") && target != null)
- tab.TellTarget.FromTarget(target);
+ Mutable.CustomSoundVolume = customSoundVolumePercent / 100f;
+ }
+ // Applies globally — same value as in General → Sound.
+ ImGuiUtil.HelpMarker(HellionStrings.Settings_General_CustomSoundVolume_Description + "\n\n" + HellionStrings.Settings_Section_Tab_Volume_AllTabsHint);
+ }
+ }
+
+ ImGui.Spacing();
+
+ // ── Sub-section: Input ────────────────────────────────────────────
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using (var secInput = ImRaii.TreeNode(HellionStrings.Settings_Section_Tab_Input + $"##sec-input-{i}"))
+ {
+ if (secInput.Success)
+ {
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+
+ ImGui.Checkbox(Language.Options_Tabs_NoInput, ref tab.InputDisabled);
+ if (!tab.InputDisabled)
+ {
+ var input =
+ tab.Channel?.ToChatType().Name() ?? Language.Options_Tabs_NoInputChannel;
+ using (
+ var combo = ImGuiUtil.BeginComboVertical(
+ Language.Options_Tabs_InputChannel,
+ input
+ )
+ )
+ {
+ if (combo.Success)
+ {
+ if (
+ ImGui.Selectable(
+ Language.Options_Tabs_NoInputChannel,
+ tab.Channel == null
+ )
+ )
+ tab.Channel = null;
+
+ foreach (var channel in Enum.GetValues())
+ if (
+ ImGui.Selectable(
+ channel.ToChatType().Name(),
+ tab.Channel == channel
+ )
+ )
+ tab.Channel = channel;
+ }
+ }
+
+ var player = Plugin.ObjectTable.LocalPlayer;
+ if (tab.Channel == InputChannel.Tell && player != null)
+ {
+ ImGui.Checkbox(Language.Options_Tabs_SenderMessages, ref tab.AllSenderMessages);
+ ImGuiUtil.HelpText(Language.Options_Help_SenderMessages);
+
+ var worlds = Sheets
+ .WorldsOnDatacenter(player)
+ .OrderByDescending(world => world.DataCenter.RowId)
+ .ThenBy(world => world.Name.ToString())
+ .ToList();
+
+ using (ImRaii.ItemWidth(ImGui.GetWindowWidth() / 3f))
+ {
+ ImGui.Text(Language.Options_Header_Target);
+ ImGui.SameLine();
+
+ var name = tab.TellTarget.Name;
+ if (ImGui.InputText("##targetInput", ref name, 21))
+ tab.TellTarget.Name = name;
+
+ ImGui.SameLine();
+
+ // Guard against an empty worlds list (character switch or sheet not yet populated)
+ // to avoid an out-of-bounds crash on worlds[selectedWorld].
+ if (worlds.Count == 0)
+ {
+ ImGui.TextDisabled("(no worlds available)");
+ }
+ else
+ {
+ var selectedWorld = worlds.FindIndex(world =>
+ world.RowId == tab.TellTarget.World
+ );
+ if (selectedWorld == -1)
+ selectedWorld = 0;
+
+ using (
+ var combo = ImRaii.Combo(
+ "###player-world",
+ worlds[selectedWorld].Name.ToString()
+ )
+ )
+ {
+ if (combo.Success)
+ {
+ var lastDc = worlds.First().DataCenter.RowId;
+ foreach (var (idx, world) in worlds.Index())
+ {
+ if (
+ ImGui.Selectable(
+ world.Name.ToString(),
+ selectedWorld == idx
+ )
+ )
+ {
+ selectedWorld = idx;
+ tab.TellTarget.World = worlds[selectedWorld].RowId;
+ }
+
+ if (lastDc == world.DataCenter.RowId)
+ continue;
+
+ lastDc = world.DataCenter.RowId;
+ ImGui.Separator();
+ }
+ }
+ }
+ }
+ }
+
+ var target =
+ (Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target)
+ as IPlayerCharacter;
+ using (ImRaii.Disabled(target == null))
+ {
+ if (ImGui.Button("Set to target") && target != null)
+ tab.TellTarget.FromTarget(target);
+ }
+ }
}
}
}
- ImGuiUtil.ChannelSelector(Language.Options_Tabs_Channels, tab.SelectedChannels);
- ImGuiUtil.ExtraChatSelector(
- Language.Options_Tabs_ExtraChatChannels,
- ref tab.ExtraChatAll,
- tab.ExtraChatChannels
- );
+ ImGui.Spacing();
+
+ // ── Sub-section: Pop-out window ───────────────────────────────────
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using (var secPopOut = ImRaii.TreeNode(HellionStrings.Settings_Section_Tab_PopOut + $"##sec-popout-{i}"))
+ {
+ if (secPopOut.Success)
+ {
+ using var indent = ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false);
+
+ ImGui.Checkbox(Language.Options_Tabs_PopOut, ref tab.PopOut);
+ if (tab.PopOut)
+ {
+ using var _ = ImRaii.PushIndent(10.0f);
+ ImGui.Checkbox(
+ Language.Options_Tabs_IndependentOpacity,
+ ref tab.IndependentOpacity
+ );
+ if (tab.IndependentOpacity)
+ ImGuiUtil.DragFloatVertical(
+ Language.Options_Tabs_Opacity,
+ ref tab.Opacity,
+ 0.25f,
+ 0f,
+ 100f,
+ $"{tab.Opacity:N2}%%",
+ ImGuiSliderFlags.AlwaysClamp
+ );
+
+ ImGui.Checkbox(Language.Options_Tabs_IndependentHide, ref tab.IndependentHide);
+ if (tab.IndependentHide)
+ {
+ using var __ = ImRaii.PushIndent(10.0f);
+ ImGuiUtil.OptionCheckbox(
+ ref tab.HideDuringCutscenes,
+ Language.Options_HideDuringCutscenes_Name
+ );
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref tab.HideWhenNotLoggedIn,
+ Language.Options_HideWhenNotLoggedIn_Name
+ );
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref tab.HideWhenUiHidden,
+ Language.Options_HideWhenUiHidden_Name
+ );
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref tab.HideInLoadingScreens,
+ Language.Options_HideInLoadingScreens_Name
+ );
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(
+ ref tab.HideInBattle,
+ Language.Options_HideInBattle_Name
+ );
+ ImGui.Spacing();
+ }
+
+ ImGuiUtil.OptionCheckbox(ref tab.CanMove, Language.Popout_CanMove_Name);
+ ImGui.Spacing();
+
+ ImGuiUtil.OptionCheckbox(ref tab.CanResize, Language.Popout_CanResize_Name);
+ ImGui.Spacing();
+ }
+ }
+ }
}
if (toRemove > -1)
diff --git a/HellionChat/Ui/SettingsTabs/ThemeAndLayout.cs b/HellionChat/Ui/SettingsTabs/ThemeAndLayout.cs
deleted file mode 100644
index ccc1e62..0000000
--- a/HellionChat/Ui/SettingsTabs/ThemeAndLayout.cs
+++ /dev/null
@@ -1,356 +0,0 @@
-using System.Numerics;
-using Dalamud.Bindings.ImGui;
-using Dalamud.Interface.Utility.Raii;
-using HellionChat.Resources;
-using HellionChat.Themes;
-using HellionChat.Util;
-using Microsoft.Extensions.Logging;
-
-namespace HellionChat.Ui.SettingsTabs;
-
-internal sealed class ThemeAndLayout : ISettingsTab
-{
- private Plugin Plugin { get; }
- private Configuration Mutable { get; }
- private readonly ILogger _logger;
-
- private string? _applyDismissedFor;
-
- public string Name =>
- HellionStrings.Settings_Card_ThemeAndLayout_Title + "###tabs-themeandlayout";
-
- internal ThemeAndLayout(Plugin plugin, Configuration mutable, ILogger logger)
- {
- Plugin = plugin;
- Mutable = mutable;
- _logger = logger;
- }
-
- public void Draw(bool changed)
- {
- DrawThemeSection();
- ImGui.Spacing();
- DrawWindowStyleSection();
- ImGui.Spacing();
- DrawTimestampStyleSection();
- }
-
- private void DrawThemeSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_ThemeAndLayout_Theme_Heading);
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- var registry = Plugin.ThemeRegistry;
- var active = registry.Get(Mutable.Theme);
-
- ImGui.TextUnformatted(
- string.Format(HellionStrings.Settings_Themes_Active, active.Name)
- );
- using (ImRaii.PushColor(ImGuiCol.Text, 0xFF8FA3B5u))
- ImGui.TextUnformatted(active.Author);
-
- DrawChatColorsApplyBanner(active);
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- ImGui.TextUnformatted(HellionStrings.Settings_Themes_BuiltIns);
- ImGui.Spacing();
- DrawThemeGrid(registry.AllBuiltIns(), active.Slug);
-
- var customs = registry.AllCustom().ToList();
- if (customs.Count > 0)
- {
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
- ImGui.TextUnformatted(HellionStrings.Settings_Themes_Custom);
- ImGui.Spacing();
- DrawThemeGrid(customs, active.Slug);
- }
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- if (ImGui.Button(HellionStrings.Settings_Themes_OpenFolder))
- {
- var dir = Path.Combine(Plugin.Interface.ConfigDirectory.FullName, "themes");
- Directory.CreateDirectory(dir);
- Plugin.PlatformUtil.OpenLink(dir);
- }
-
- ImGui.SameLine();
- if (ImGui.Button(HellionStrings.Settings_Themes_ExportActive))
- {
- var dir = Path.Combine(Plugin.Interface.ConfigDirectory.FullName, "themes");
- Directory.CreateDirectory(dir);
- var fileName = $"{active.Slug}.export.json";
- var path = Path.Combine(dir, fileName);
- var json = ThemeJsonWriter.Serialize(active);
- File.WriteAllText(path, json);
- _logger.LogInformation($"Exported active theme '{active.Slug}' to {path}");
- }
- }
- }
-
- private void DrawThemeGrid(IEnumerable themes, string activeSlug)
- {
- var avail = ImGui.GetContentRegionAvail();
- var columns = avail.X >= 700f ? 3 : 2;
- var cardWidth = (avail.X - (columns - 1) * 8f) / columns;
- var cardHeight = 140f;
-
- var list = themes.ToList();
- for (var i = 0; i < list.Count; i++)
- {
- DrawThemeCard(list[i], activeSlug, cardWidth, cardHeight);
-
- if ((i + 1) % columns != 0 && i != list.Count - 1)
- ImGui.SameLine();
- }
- }
-
- private void DrawThemeCard(Theme theme, string activeSlug, float w, float h)
- {
- ImGui.BeginGroup();
-
- var isActive = string.Equals(theme.Slug, activeSlug, StringComparison.OrdinalIgnoreCase);
- var cursorBefore = ImGui.GetCursorScreenPos();
- var clicked = ImGui.InvisibleButton($"##theme-card-{theme.Slug}", new Vector2(w, h));
- var hovered = ImGui.IsItemHovered();
-
- var draw = ImGui.GetWindowDrawList();
- var bg = ColourUtil.RgbaToAbgr(theme.Colors.WindowBg | 0xFFu);
- draw.AddRectFilled(cursorBefore, cursorBefore + new Vector2(w, h), bg, 4f);
-
- if (isActive)
- {
- var border = ColourUtil.RgbaToAbgr(theme.Colors.Primary);
- draw.AddRect(
- cursorBefore,
- cursorBefore + new Vector2(w, h),
- border,
- 4f,
- ImDrawFlags.None,
- 2f
- );
- }
- else if (hovered)
- {
- var border = ColourUtil.RgbaToAbgr(theme.Colors.PrimaryLight & 0xFFFFFF99u);
- draw.AddRect(
- cursorBefore,
- cursorBefore + new Vector2(w, h),
- border,
- 4f,
- ImDrawFlags.None,
- 1f
- );
- }
-
- var mockupOrigin = cursorBefore + new Vector2(12f, 12f);
- var mockupSize = new Vector2(w - 24f, 60f);
- ThemeMockup.Draw(mockupOrigin, mockupSize, theme);
-
- var textColor = ColourUtil.RgbaToAbgr(theme.Colors.TextPrimary);
- var mutedColor = ColourUtil.RgbaToAbgr(theme.Colors.TextMuted);
- draw.AddText(cursorBefore + new Vector2(12f, 80f), textColor, theme.Name);
- draw.AddText(cursorBefore + new Vector2(12f, 100f), mutedColor, theme.Author);
-
- ImGui.EndGroup();
-
- if (clicked)
- {
- Mutable.Theme = theme.Slug;
- Plugin.ThemeRegistry.Switch(theme.Slug);
- _applyDismissedFor = null;
- }
- }
-
- private void DrawChatColorsApplyBanner(Theme active)
- {
- if (active.ChatColors is not { Channels.Count: > 0 } themeChatColors)
- return;
-
- if (_applyDismissedFor == active.Slug)
- return;
-
- var alreadyMatching = themeChatColors.Channels.All(kvp =>
- Mutable.ChatColours.TryGetValue(kvp.Key, out var current) && current == kvp.Value
- );
- if (alreadyMatching)
- return;
-
- ImGui.Spacing();
-
- var border = ColourUtil.RgbaToAbgr(active.Colors.Primary);
- var bgFill = ColourUtil.RgbaToAbgr((active.Colors.Surface & 0xFFFFFF00u) | 0xCCu);
- var origin = ImGui.GetCursorScreenPos();
- var width = ImGui.GetContentRegionAvail().X;
- var height = 64f;
- var draw = ImGui.GetWindowDrawList();
- draw.AddRectFilled(origin, origin + new Vector2(width, height), bgFill, 4f);
- draw.AddRect(origin, origin + new Vector2(width, height), border, 4f, ImDrawFlags.None, 1f);
-
- var textColor = ColourUtil.RgbaToAbgr(active.Colors.TextPrimary);
- draw.AddText(
- origin + new Vector2(12f, 10f),
- textColor,
- HellionStrings.Settings_Themes_ApplyChatColors_Hint
- );
-
- using (ImRaii.PushColor(ImGuiCol.Button, active.Colors.Primary))
- using (ImRaii.PushColor(ImGuiCol.ButtonHovered, active.Colors.PrimaryLight))
- using (ImRaii.PushColor(ImGuiCol.ButtonActive, active.Colors.PrimaryDark))
- {
- ImGui.SetCursorScreenPos(origin + new Vector2(12f, 32f));
- if (ImGui.Button(HellionStrings.Settings_Themes_ApplyChatColors_Apply))
- {
- foreach (var kvp in themeChatColors.Channels)
- Mutable.ChatColours[kvp.Key] = kvp.Value;
- _applyDismissedFor = active.Slug;
- }
- }
-
- ImGui.SameLine();
- if (ImGui.Button(HellionStrings.Settings_Themes_ApplyChatColors_Keep))
- {
- _applyDismissedFor = active.Slug;
- }
-
- ImGui.SetCursorScreenPos(origin + new Vector2(0f, height + 8f));
-
- ImGui.Spacing();
- }
-
- private void DrawWindowStyleSection()
- {
- using var tree = ImRaii.TreeNode(
- HellionStrings.Settings_ThemeAndLayout_WindowStyle_Heading
- );
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.Checkbox(Language.Options_ShowTitleBar_Name, ref Mutable.ShowTitleBar);
-
- ImGui.Checkbox(
- Language.Options_ShowPopOutTitleBar_Name,
- ref Mutable.ShowPopOutTitleBar
- );
-
- ImGui.Checkbox(Language.Options_ShowHideButton_Name, ref Mutable.ShowHideButton);
- ImGuiUtil.HelpMarker(Language.Options_ShowHideButton_Description);
-
- ImGui.Checkbox(Language.Options_SidebarTabView_Name, ref Mutable.SidebarTabView);
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_SidebarTabView_Description, Plugin.PluginName)
- );
-
- if (Mutable.SidebarTabView)
- {
- var sidebarWidth = Mutable.SidebarWidth;
- if (
- ImGui.SliderInt(
- HellionStrings.Settings_ThemeAndLayout_SidebarWidth_Name,
- ref sidebarWidth,
- 44,
- 160,
- $"{sidebarWidth} px"
- )
- )
- {
- Mutable.SidebarWidth = sidebarWidth;
- }
- ImGuiUtil.HelpMarker(
- HellionStrings.Settings_ThemeAndLayout_SidebarWidth_Description
- );
- }
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- // Slider range 50-100% maps to 0.5-1.0 internally. Floor at 50% prevents
- // accidentally hiding the chat background (v1.2.0 bug at WindowAlpha=0).
- var opacityPercent = Mutable.WindowOpacity * 100f;
- if (
- ImGuiUtil.DragFloatVertical(
- HellionStrings.Settings_ThemeAndLayout_WindowOpacity_Name,
- ref opacityPercent,
- .25f,
- 50f,
- 100f,
- $"{opacityPercent:N0}%%",
- ImGuiSliderFlags.AlwaysClamp
- )
- )
- {
- Mutable.WindowOpacity = opacityPercent / 100f;
- }
- ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_WindowOpacity_Description);
-
- ImGui.Spacing();
- ImGui.Separator();
- ImGui.Spacing();
-
- // Master accessibility toggle for the v1.5.4 motion work: the
- // theme crossfade, the sidebar/card hover lerps and the
- // unread-tab pulse all read Config.ReduceMotion and snap
- // instantly when it is on.
- ImGui.Checkbox(
- HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Name,
- ref Mutable.ReduceMotion
- );
- ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Description);
- }
- }
-
- private void DrawTimestampStyleSection()
- {
- using var tree = ImRaii.TreeNode(
- HellionStrings.Settings_ThemeAndLayout_TimestampStyle_Heading
- );
- if (!tree.Success)
- return;
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.Checkbox(
- Language.Options_PrettierTimestamps_Name,
- ref Mutable.PrettierTimestamps
- );
- ImGuiUtil.HelpMarker(Language.Options_PrettierTimestamps_Description);
-
- if (Mutable.PrettierTimestamps)
- {
- ImGui.Checkbox(
- Language.Options_MoreCompactPretty_Name,
- ref Mutable.MoreCompactPretty
- );
- ImGuiUtil.HelpMarker(Language.Options_MoreCompactPretty_Description);
-
- ImGui.Checkbox(
- HellionStrings.Appearance_UseCompactDensity_Name,
- ref Mutable.UseCompactDensity
- );
- ImGuiUtil.HelpMarker(HellionStrings.Appearance_UseCompactDensity_Description);
-
- ImGui.Checkbox(
- Language.Options_HideSameTimestamps_Name,
- ref Mutable.HideSameTimestamps
- );
- ImGuiUtil.HelpMarker(Language.Options_HideSameTimestamps_Description);
- }
-
- ImGui.Checkbox(Language.Options_Use24HourClock_Name, ref Mutable.Use24HourClock);
- ImGuiUtil.HelpMarker(Language.Options_Use24HourClock_Description);
- }
- }
-}
diff --git a/HellionChat/Ui/SettingsTabs/Window.cs b/HellionChat/Ui/SettingsTabs/Window.cs
index 7f7a0f1..58056d3 100644
--- a/HellionChat/Ui/SettingsTabs/Window.cs
+++ b/HellionChat/Ui/SettingsTabs/Window.cs
@@ -18,20 +18,19 @@ internal sealed class Window : ISettingsTab
Mutable = mutable;
}
- public void Draw(bool changed)
+ public void Draw(bool sectionJustEntered)
{
- DrawHideSection();
+ DrawHideSection(sectionJustEntered);
ImGui.Spacing();
- DrawInactivityHideSection();
+ DrawInactivityHideSection(sectionJustEntered);
ImGui.Spacing();
- DrawFrameSection();
- ImGui.Spacing();
- DrawTooltipsSection();
+ DrawFrameSection(sectionJustEntered);
}
- private void DrawHideSection()
+ private void DrawHideSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Window_Hide_Heading);
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Hide);
if (!tree.Success)
{
return;
@@ -82,9 +81,10 @@ internal sealed class Window : ISettingsTab
}
}
- private void DrawInactivityHideSection()
+ private void DrawInactivityHideSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Window_InactivityHide_Heading);
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_InactivityHide);
if (!tree.Success)
{
return;
@@ -164,9 +164,10 @@ internal sealed class Window : ISettingsTab
}
}
- private void DrawFrameSection()
+ private void DrawFrameSection(bool sectionJustEntered)
{
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Window_Frame_Behaviour_Heading);
+ if (sectionJustEntered) ImGui.SetNextItemOpen(false);
+ using var tree = ImRaii.TreeNode(HellionStrings.Settings_Section_Frame);
if (!tree.Success)
{
return;
@@ -192,37 +193,4 @@ internal sealed class Window : ISettingsTab
}
}
- private void DrawTooltipsSection()
- {
- using var tree = ImRaii.TreeNode(HellionStrings.Settings_Window_Tooltips_Heading);
- if (!tree.Success)
- {
- return;
- }
-
- using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
- {
- ImGui.Checkbox(
- Language.Options_NativeItemTooltips_Name,
- ref Mutable.NativeItemTooltips
- );
- ImGuiUtil.HelpMarker(
- string.Format(Language.Options_NativeItemTooltips_Description, Plugin.PluginName)
- );
-
- if (Mutable.NativeItemTooltips)
- {
- ImGuiUtil.DragFloatVertical(
- Language.Options_TooltipOffset_Name,
- Language.Options_TooltipOffset_Desc,
- ref Mutable.TooltipOffset,
- 1,
- 0f,
- 400f,
- $"{Mutable.TooltipOffset:N0}px",
- ImGuiSliderFlags.AlwaysClamp
- );
- }
- }
- }
}
diff --git a/HellionChat/Util/SenderNameDisplay.cs b/HellionChat/Util/SenderNameDisplay.cs
new file mode 100644
index 0000000..9446076
--- /dev/null
+++ b/HellionChat/Util/SenderNameDisplay.cs
@@ -0,0 +1,98 @@
+using System.Collections.Generic;
+using Dalamud.Game.Text.SeStringHandling.Payloads;
+using HellionChat._Helpers;
+
+namespace HellionChat.Util;
+
+// UI-7: produces a render-only view of a chunk list with the sender's name
+// reformatted per the user's WorldSuffixMode / NameFormMode. Called from
+// ChatLogWindow.DrawChunks on every draw — it never mutates the input, so the
+// stored message (the Sender BLOB in the DB) stays byte-for-byte unchanged and
+// a later settings change reformats history too.
+// Known trade-off: at non-default settings, this allocates one List per
+// visible message per frame. Lists are small and the path is skipped at the
+// neutral defaults, so GC pressure is low in practice. Accepted; noted in
+// Cycle Notes.
+internal static class SenderNameDisplay
+{
+ // Returns a copy of the list with the whole ChunkSource.Sender span
+ // collapsed to one formatted chunk, or the original list when nothing
+ // should change (neutral defaults, no sender span, or a non-player sender).
+ internal static IReadOnlyList ForDisplay(IReadOnlyList chunks)
+ {
+ var suffixMode = Plugin.Config.WorldSuffixMode;
+ var formMode = Plugin.Config.NameFormMode;
+
+ // Neutral default = today's rendering. Bail before scanning so the
+ // common case stays free.
+ if (suffixMode == WorldSuffixMode.OtherWorldOnly && formMode == NameFormMode.Full)
+ return chunks;
+
+ // Locate the sender span. A content list has no Sender chunks and is
+ // returned untouched.
+ var first = -1;
+ var last = -1;
+ for (var i = 0; i < chunks.Count; i++)
+ {
+ if (chunks[i].Source != ChunkSource.Sender)
+ continue;
+ if (first < 0)
+ first = i;
+ last = i;
+ }
+ if (first < 0)
+ return chunks;
+
+ // The PlayerPayload rides on the sender chunks; a system or non-player
+ // sender has none and is left alone.
+ PlayerPayload? payload = null;
+ for (var i = first; i <= last; i++)
+ {
+ if (chunks[i].Link is PlayerPayload pp)
+ {
+ payload = pp;
+ break;
+ }
+ }
+ if (payload is null)
+ return chunks;
+
+ var worldName = payload.World.ValueNullable?.Name.ExtractText() ?? string.Empty;
+
+ // IPlayerState.HomeWorld reads AgentLobby directly without a
+ // framework-thread guard (reference_dalamud_framework_thread), so this
+ // call is safe from the draw thread.
+ // RowId is a value field — safe to read directly without ValueNullable, unlike the world name above.
+ var isHomeWorld = payload.World.RowId == Plugin.PlayerState.HomeWorld.RowId;
+
+ var formatted = SenderNameFormatter.Format(
+ payload.PlayerName, worldName, isHomeWorld, formMode, suffixMode);
+
+ // Render-only copy: replace the whole sender span (name text, world
+ // text, and any cross-world icon) with one formatted chunk that keeps
+ // the PlayerPayload link so the name stays clickable. Dropping the
+ // original sender icon is an accepted trade-off and only happens once
+ // the user moves UI-7 off its defaults.
+ // Channel brackets and colons are ChunkSource.None wrappers outside the
+ // Sender span — they are preserved untouched by the copy loops below.
+ var copy = new List(chunks.Count);
+ for (var i = 0; i < first; i++)
+ copy.Add(chunks[i]);
+ TextChunk? styleSource = null;
+ for (var i = first; i <= last; i++)
+ {
+ if (chunks[i] is TextChunk tc)
+ {
+ styleSource = tc;
+ break;
+ }
+ }
+ var replacement = styleSource is not null
+ ? styleSource.NewWithStyle(ChunkSource.Sender, payload, formatted)
+ : new TextChunk(ChunkSource.Sender, payload, formatted);
+ copy.Add(replacement);
+ for (var i = last + 1; i < chunks.Count; i++)
+ copy.Add(chunks[i]);
+ return copy;
+ }
+}
diff --git a/HellionChat/_Helpers/PluginDisclosureScanner.cs b/HellionChat/_Helpers/PluginDisclosureScanner.cs
new file mode 100644
index 0000000..5f4029e
--- /dev/null
+++ b/HellionChat/_Helpers/PluginDisclosureScanner.cs
@@ -0,0 +1,30 @@
+namespace HellionChat._Helpers;
+
+// UI-11 pure decision helper: does a message about to be sent carry a glyph
+// that only renders correctly for players running HellionChat or a similar
+// plugin? Those are FFXIV Private-Use-Area icon codepoints (the same range
+// SeIconChar covers); a recipient without a plugin sees an empty box.
+//
+// Works on raw char codepoints on purpose: SeIconChar is a Dalamud type, and a
+// helper that touched it could not run in the xUnit AppDomain
+// (feedback_dalamud_test_isolation, point 7).
+// TEST-MIRROR: ../../../Hellion Build test/Ui/PluginDisclosureScannerTests.cs
+public static class PluginDisclosureScanner
+{
+ // FFXIV packs its icon glyphs into this slice of the Unicode Private Use
+ // Area. The whole range is inside the BMP, so a single char per codepoint
+ // is enough — no surrogate-pair handling needed.
+ private const char PrivateUseFirst = '';
+ private const char PrivateUseLast = '';
+
+ public static bool ContainsPrivateUseGlyph(string text)
+ {
+ foreach (var c in text)
+ {
+ if (c >= PrivateUseFirst && c <= PrivateUseLast)
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/HellionChat/_Helpers/SenderNameFormatter.cs b/HellionChat/_Helpers/SenderNameFormatter.cs
new file mode 100644
index 0000000..a17d3dc
--- /dev/null
+++ b/HellionChat/_Helpers/SenderNameFormatter.cs
@@ -0,0 +1,53 @@
+using System;
+
+namespace HellionChat._Helpers;
+
+// UI-7 pure decision helper: builds the display string for a sender's name +
+// world per the user's NameFormMode / WorldSuffixMode. Dalamud-free so the
+// Build Suite can cover every combination; SenderNameDisplay feeds it the name
+// and world it pulled from the PlayerPayload.
+// TEST-MIRROR: ../../../Hellion Build test/Ui/SenderNameFormatterTests.cs
+public static class SenderNameFormatter
+{
+ public static string Format(
+ string fullName,
+ string worldName,
+ bool isHomeWorld,
+ NameFormMode formMode,
+ WorldSuffixMode suffixMode)
+ {
+ var name = FormatName(fullName, formMode);
+
+ var showWorld = suffixMode switch
+ {
+ WorldSuffixMode.Never => false,
+ WorldSuffixMode.Always => true,
+ WorldSuffixMode.OtherWorldOnly => !isHomeWorld,
+ _ => !isHomeWorld,
+ };
+
+ return showWorld && !string.IsNullOrEmpty(worldName)
+ ? $"{name}@{worldName}"
+ : name;
+ }
+
+ private static string FormatName(string fullName, NameFormMode mode)
+ {
+ if (mode == NameFormMode.Full)
+ return fullName;
+
+ // FFXIV character names are two words. Anything else (one word, odd
+ // spacing) falls back to the full name rather than risking an empty or
+ // misleading render.
+ var parts = fullName.Split(' ', StringSplitOptions.RemoveEmptyEntries);
+ if (parts.Length < 2)
+ return fullName;
+
+ return mode switch
+ {
+ NameFormMode.FirstNameOnly => parts[0],
+ NameFormMode.Initials => $"{parts[0][0]}. {parts[^1][0]}.",
+ _ => fullName,
+ };
+ }
+}
diff --git a/README.md b/README.md
index 77b8b05..51dce2a 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
[](LICENSE)
-[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
+[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[](https://github.com/goatcorp/Dalamud)
[](https://dotnet.microsoft.com/)
[](https://www.finalfantasyxiv.com/)
@@ -11,7 +11,7 @@
-**Version 1.5.5** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
+**Version 1.5.6** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine
@@ -118,13 +118,13 @@ Deuteranopia/Protanopia-safe (red-green color blindness) based on the Wong/Okabe
- **Honorific custom titles in the chat header.** When the Honorific plugin is active and a custom
title is set, it is displayed in the chat header above the message log. Auto-detect with silent
- fallback: without Honorific the slot is invisible. Toggle in Settings → Integrations → Honorific.
+ fallback: without Honorific the slot is invisible. Toggle in Settings → About → Extensions → Honorific.
First cycle of a multi-stage plugin integration roadmap (context menu, NotificationMaster, RP
status, ExtraChat, and XIVIM to follow).
### Pop-Out Convenience (v0.6.0)
-- **Input bar in pop-out windows** as a global opt-in in Settings → Windows → Window Frame. When
+- **Input bar in pop-out windows** as a global opt-in in Settings → Window → Window Frame. When
active, every pop-out window has a compact input at the bottom with a channel-colored icon button
and text field. No more switching back to the main window for a quick reply.
- **Per-pop-out independent text buffer and history cursor.** Changing channels in a pop-out works
@@ -171,7 +171,7 @@ HellionChat/
│ ├── FirstRunWizard.cs # Three-profile onboarding
│ ├── HellionStyle.cs # ImGui theme push (local and global)
│ └── SettingsTabs/
-│ └── Privacy.cs # Privacy tab (filters, retention, cleanup, export)
+│ └── DataAndPrivacy.cs # Data & Privacy tab (filters, retention, cleanup, export)
├── Ipc/ # IPC channels, migrated to HellionChat.* in v1.0.0
├── ChatTwoConflictDetector.cs # Blocks plugin load if upstream Chat 2 is active
├── images/
@@ -250,7 +250,7 @@ start. Order matters:
4. Add the custom repo as described above.
5. Install Hellion Chat. On first start, the configuration file and the entire database directory
are moved into the HellionChat layout.
-6. **Verify** under Settings → Privacy → Refresh preview that the message count looks plausible.
+6. **Verify** under Settings → Data & Privacy → Cleanup → Refresh preview that the message count looks plausible.
### Troubleshooting
@@ -299,16 +299,15 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo
## Project Status
-**Version 1.5.5** — Upstream-Sync Tab-Features. Failed tells now raise a warning toast
-when a message could not be delivered (recipient offline, in an instance, or blocking
-you). Per-tab notification sounds let each tab play one of the 16 game chat sounds or
-three bundled Hellion sounds when a message arrives on a background tab, with a
-preview button. The tab rename field in the right-click menu auto-focuses on open and
-accepts up to 512 characters. A jump-to-latest button appears in the chat log header
-while scrolled up from the live end. Map-flag and item-link insertion is available from
-the chat input right-click menu. The Hellion Forge fox banner in the first-run wizard
-and the Information tab is now a real image. Schema bumped to v18, additive fields
-only, no data migration.
+**Version 1.5.6** — Settings Overhaul + Filter & Notification Polish. The Settings window
+has been reorganised from ten tabs to seven (General, Appearance, Chat, Window, Channels,
+Data & Privacy, About). Each tab now uses collapsible sections grouped by control type;
+sections start collapsed every time you enter a tab. New sender-name display options in
+Chat → Messages let you control when the home world is appended and whether to show the
+full name, first name only, or initials. A pre-send warning fires when a message contains
+plugin-only symbols other players may see as empty boxes. The chat window now has a
+separate opacity for when it is not focused. The three bundled custom notification sounds
+gained a volume slider in Settings → General. All 24 locale files updated.
---
diff --git a/docs/AI_DISCLOSURE.md b/docs/AI_DISCLOSURE.md
index ea2ccad..cc25d7f 100644
--- a/docs/AI_DISCLOSURE.md
+++ b/docs/AI_DISCLOSURE.md
@@ -45,7 +45,7 @@ plugin development in general.
Upstream Chat 2 (by Infi & Anna, EUPL-1.2) is the foundation and was not produced with AI
assistance. HellionChat-specific code lives in `HellionChat/Privacy/`, `HellionChat/Export/`,
-`HellionChat/Resources/HellionStrings*`, `Ui/SettingsTabs/Privacy.cs`, `Ui/FirstRunWizard.cs`,
+`HellionChat/Resources/HellionStrings*`, `Ui/SettingsTabs/DataAndPrivacy.cs`, `Ui/FirstRunWizard.cs`,
`Ui/HellionStyle.cs`, plus the Migrate3 recovery and plugin layout migration in `MessageStore.cs`
and `Plugin.cs`. These were developed with Pair-level assistance as described above.
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 5f0b965..ebcde14 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -11,6 +11,18 @@ releases as an overview and links to the release pages for details.
---
+## Hellion Chat 1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)
+
+- Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.
+- New sender-name display options under Chat → Messages: separate world-suffix and name-format modes (Full name / First name only / Initials × Never / Other worlds only / Always).
+- Plugin-only symbols now show a pre-send warning so other players do not get empty boxes (Chat → Messages → "Warn before sending plugin-only symbols").
+- Separate window opacity for focused vs. inactive chat window (Appearance → Window style → "Inactive window opacity"). The slider above sets the focused value.
+- Custom notification sound volume slider (General → Sound, and mirrored in Channels → per-tab → Notification). Affects only the three bundled custom sounds; the 16 game sounds are unaffected.
+- The per-tab regex filter that briefly shipped earlier in this cycle has been removed — FFXIV's built-in blackword filter covers the same need.
+- All 24 locale files updated for the new section labels and the v1.5.6 control labels (machine translation; native review continues via the Hellion Forge Discord).
+
+---
+
## Hellion Chat 1.5.5 — Upstream-Sync Tab-Features (2026-05-21)
A backlog-sync cycle. Inherited tab items: a failed-tell warning toast, per-tab
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index fbd3e09..37c0c9e 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -12,16 +12,39 @@ be a poor fit for the plugin's privacy-first scope during brainstorming.
## Next Cycle
-**v1.5.5b — Upstream-Sync Filter/Notification/Polish** is the next planned scope: the second half
-of the backlog-sync wave, covering filter improvements, notification refinements, and UI polish
-items that did not fit the v1.5.5 bundle. Plugin Integrations Wave 2-6 (Context-Menu,
-NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM) follows.
+**v1.5.7 — Ad-Block / Spam-Filter** is the next planned scope: the hybrid ad-block and
+spam-filter cycle, combining a lightweight built-in filter with optional `NoSoliciting`
+IPC integration. Plugin Integrations Wave 2-6 (Context-Menu, NotificationMaster, Moodles,
+ExtraChat, XIVIM Quick-DM) follows.
Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in
parallel as a continuous correction pass, gathered via the Hellion Forge Discord.
---
+## v1.5.6 — Settings Overhaul + Filter & Notification Polish (released 2026-05-23)
+
+Settings window reorganised from ten tabs to seven (General, Appearance, Chat, Window,
+Channels, Data & Privacy, About). Each tab uses collapsible sections grouped by control
+type; sections start collapsed on every tab-open.
+
+Delivered from the originally-planned v1.5.5b bundle:
+- **UI-7** — Sender-name display options: world-suffix mode (Never / Other worlds only / Always)
+ and name-format mode (Full name / First name only / Initials). Lives in Chat → Messages.
+- **UI-11** — Pre-send warning when a message contains plugin-only symbols. Toggle in
+ Chat → Messages.
+- **UI-12** — Separate window opacity for focused vs. inactive chat window. New slider in
+ Appearance → Window style.
+- **AUDIO-1** — Custom notification sound volume slider. General → Sound, mirrored in
+ Channels → per-tab → Notification. Affects only the three bundled custom sounds.
+- ~~**UI-8**~~ — **GESTRICHEN**: per-tab regex filter. Removed because FFXIV's built-in
+ blackword filter covers the same need.
+
+All 24 locale files updated for new section labels and v1.5.6 control labels (machine
+translation; native review via Hellion Forge Discord).
+
+---
+
## v1.5.5 — Upstream-Sync Tab-Features (released 2026-05-21)
A backlog-sync cycle of inherited tab-feature items. Failed tells now raise a warning toast when a
@@ -391,7 +414,7 @@ deferred in favour of the theme engine — both items live on in the mid-term bl
- **Regex Tab Routing** — route plugin output spam into dedicated tabs, auto-sort tells from
specific people. Clearly scoped against ad-block: routing sorts into views, blocking hides
globally.
-- **Auto-Detect Duties** — tab switch on duty start via condition flag.
+- ~~**Auto-Detect Duties**~~ — dropped in v1.5.6 cycle: the effort (a render-gate in the tab-bar / tab-sidebar draw plus resolving what happens to the active tab when it is hidden) outweighs the practical benefit. Removed from backlog.
- **UX Bundle** — vertical tab bar as a layout option, Shift+Mousewheel to scroll tab headers
without activating them, global hotkey to close the active tab.
- **Configure Tab Title** — configurable tab title format (name / name + abbreviated world / full
@@ -404,10 +427,9 @@ deferred in favour of the theme engine — both items live on in the mid-term bl
with the current channel colour.
- **Plugin-Disclosure Pre-Send Filter** — configurable word/regex list blocks sending with a
pre-send confirmation. Protects against accidentally mentioning plugins in public channels.
-- **Chat Clear on Name Change** — on character name change, migrate or wipe local history; default
- is wipe for maximum privacy.
+- ~~**Chat Clear on Name Change**~~ — dropped in v1.5.6 cycle: would require tracking the character against a stored prior state, which conflicts with the privacy-plugin identity; the desired effect already exists because HellionChat keeps history per character identity, so there is no functional gap. Removed from backlog.
- **Hide Plugin Window on NG+ Screen** — extend hide logic to cover additional addon names.
-- **Kick from Novice Network** — mentor niche; context menu entry with confirmation.
+- ~~**Kick from Novice Network**~~ — dropped in v1.5.6 cycle: no accessible IPC surface found for Novice Network membership check or kick action; not feasible without a risky memory scan. Removed from backlog.
- **Text-to-Speech for /tell** — incoming tells via TTS, optionally per sender, with channel filter
and mute-in-combat. Low priority.
diff --git a/repo.json b/repo.json
index 68a6f5c..51e45e2 100644
--- a/repo.json
+++ b/repo.json
@@ -3,7 +3,7 @@
"Author": "Jon Kazama (Hellion Forge)",
"Name": "Hellion Chat",
"InternalName": "HellionChat",
- "AssemblyVersion": "1.5.5.0",
+ "AssemblyVersion": "1.5.6.0",
"Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with four profiles: Privacy-First, Casual, Roleplay, Full History\n- Multi-language UI (24 locales) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR",
"ApplicableVersion": "any",
"RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat",
@@ -20,12 +20,12 @@
"CanUnloadAsync": false,
"LoadPriority": 0,
"Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.",
- "Changelog": "**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**\n\nA backlog-sync cycle: inherited tab-feature items plus a new fox\nbanner image and custom notification sounds.\n\nUser-visible:\n\n- Failed tells now raise a warning toast when a message you sent\n could not be delivered (recipient offline, in an instance, or\n blocking you). Toggle in Settings, Chat tab.\n- Per-tab notification sound: each tab can play a sound when a\n message arrives while you are looking at a different tab. Pick\n one of the 16 game chat sounds or one of three bundled Hellion\n sounds, with a preview button to hear it. Off by default,\n respects the global sound toggle.\n- The tab rename field in the right-click menu now focuses\n itself when the menu opens and accepts up to 512 characters,\n matching the settings-tab rename.\n- A jump-to-latest button appears in the chat log header while\n you are scrolled up from the live end.\n- Map flags and item links can be inserted into the chat input\n from its right-click menu.\n- The Hellion Forge fox banner in the first-run wizard and the\n Information tab is now a real image instead of ASCII art.\n\nSchema bumped to v18 (additive fields only, no data migration).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.4 — Polish and Motion (2026-05-20)**\n\nA polish cycle: smoother theme switching, faster theme and tab\naccess, and subtle hover motion. Three P3 items plus an\naccessibility toggle.\n\nUser-visible:\n\n- Theme switches now crossfade smoothly over ~300 ms across every\n Hellion-rendered surface — sidebar, title, buttons, tabs,\n scrollbar, separators. The window background snaps deliberately\n so the per-window opacity override from Dalamud's pinning menu\n stays untouched.\n- New header quick-picker: a palette button left of the cog opens\n a compact popup with two sections — every built-in and custom\n theme, and every tab. The active entry carries a check glyph;\n clicking another switches without closing the popup.\n- Sidebar icons ease their opacity on hover, and card-mode message\n borders highlight per tab while the cursor is over their rows.\n Framerate-independent, so a stalled Wine frame cannot overshoot\n the animation.\n- New \"Reduce motion\" toggle in Theme & Layout disables the\n crossfade, the hover animations and the unread-tab pulse for\n users who prefer a static UI.\n\nUnder the hood:\n\n- Two pure-helper lerp paths (ThemeAbgrCacheLerp, FrameLerp) with\n xUnit coverage in the Build Suite, plus a ColourUtil.ApplyAlpha\n alpha modulator. Two new /xlperf self-test steps pin the\n crossfade and quick-picker contracts.\n\nNo schema bump, no migration. Migration v17 stays.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)**\n\nMulti-language pass plus a long-standing first-frame HITCH lands\nas a side effect of a font-stack rewrite.\n\nUser-visible:\n\n- 24 selectable UI languages (was 2). Catalan, Czech, Danish,\n Dutch, English, Finnish, French, German, Greek, Hungarian,\n Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese\n (BR + PT), Romanian, Russian, Spanish, Swedish, Turkish,\n Ukrainian, Simplified + Traditional Chinese. Sorted by endonym,\n \"None\" pinned first. Non-native locales are AI-assisted and\n flagged for native-speaker review via the Forge Discord.\n- Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The\n Inter font ships Latin Extended-A/B, Greek polytonic and\n Cyrillic Supplement coverage; NotoSansCjkRegular joins as a\n third merge layer for Hangul and Simplified-Han glyphs the\n FFXIV Japanese game font does not ship.\n- First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that\n held since v1.4.x) to a median of ~20 ms (5-reload sample\n 17.9-23.6 ms, Linux/Wine). The bundled-font path silently\n fell back to the FFXIV Axis font for the entire v1.5.x series\n because of an early-return in the draw loop. The fix that\n routes RegularFont through draw also lands the defer-pattern\n win the v1.5.1 cycle was reaching for.\n- ExtraGlyphRanges auto-activates on language change. Korean,\n ChineseFull and the two new flags (LatinExtended, Greek) toggle\n on without a manual visit to Fonts and Colours.\n- New WarningText under the language dropdown notes FFXIV's\n chat input only fully supports EN/DE/FR/JA character sets.\n Other languages render in HellionChat but may garble when\n typed into in-game chat.\n\nUnder the hood:\n\n- Three-layer font stack: Inter Light primary, FFXIV\n JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular\n merge 2 for everything else CJK.\n- LanguageOverride enum gains ten locales plus three previously\n commented out (Italian, Korean, Norwegian as `nb`). New\n values append to the enum so existing config integers stay\n stable across update.\n- Crowdin gap closed: four post-sync ChatTwo keys backfilled\n into 13 legacy locales with per-key AI markers.\n- Plugin.LoadAsync runs a one-shot migration that ORs in the\n matching ExtraGlyphRanges flag for users already on a\n non-default language. Settings.Apply auto-activates on\n change going forward.\n- Em-dash sweep across the EN source and 18 translations to the\n house style. Russian and Ukrainian keep the typographic norm.\n\nMigration v17 stays. UseHellionFont users transition from Exo 2\nto Inter Light transparently on first reload.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.2 — First-Run Wizard Rework (2026-05-18)**\n\nUX patch. The first-run wizard becomes a four-step flow with a\nnew Roleplay privacy profile and a power-settings step that\nsurfaces previously-hidden defaults. Existing v1.5.1 users see\nthe new wizard once on first v1.5.2 boot.\n\nWhat changes user-visible:\n\n- Wizard navigation: Welcome → Privacy profile → Power settings\n → Done. Forge-Bronze pagination dots, dedicated stage for the\n power settings so they are no longer buried in Settings.\n- Fourth privacy profile \"Roleplay\": Privacy-First plus Say and\n both emote types, with a 30-day window for Say and a 90-day\n window for emotes. Shout, Yell and Novice Network stay out.\n- Privacy picker becomes a 2x2 grid. Casual stays the\n recommended option with a ★ marker.\n- Power-settings step covers Load Previous Session, Filter\n Include Previous Sessions, Auto-Tell-Tabs History Preload,\n Compact Density, Prettier Timestamps and a built-in theme\n picker. All six map to existing Configuration fields — no new\n settings introduced.\n- Staged commit: the wizard only writes to Config on the Finish\n step. Decide-later or X-close at any point leaves the existing\n config untouched.\n- Inline test hint on the done step: \"type /tell \n into chat\" surfaces the auto-tell-tab spawn mechanism.\n- Window starts at 720x480 (was 900x560) and can shrink to\n 600x400; Step 1 keeps the fox banner in a folded TreeNode so\n the onboarding copy stays primary.\n- Existing users get the new wizard surfaced once on first boot\n after the update via the new WizardLastShownVersion config\n field. Future cycles bump the constant only when the wizard\n itself changes shape.\n\nUnder the hood:\n\n- WizardStateSmokeStep added to /xlperf alongside the FontManager\n and ThemeSwitch self-tests.\n- Twelve new pure-helper xUnit Facts in the Build Suite cover\n all four privacy profile sets and their retention overrides.\n\nMigration v17 stays (no schema bump). The Configuration grows\none optional string field (WizardLastShownVersion) which\ndefaults to empty for legacy users.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases",
+ "Changelog": "**v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)**\n\n- Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.\n- New sender-name display options under Chat → Messages: separate world-suffix and name-format modes (Full name / First name only / Initials × Never / Other worlds only / Always).\n- Plugin-only symbols now show a pre-send warning so other players do not get empty boxes (Chat → Messages → \"Warn before sending plugin-only symbols\").\n- Separate window opacity for focused vs. inactive chat window (Appearance → Window style → \"Inactive window opacity\"). The slider above sets the focused value.\n- Custom notification sound volume slider (General → Sound, and mirrored in Channels → per-tab → Notification). Affects only the three bundled custom sounds; the 16 game sounds are unaffected.\n- The per-tab regex filter that briefly shipped earlier in this cycle has been removed — FFXIV's built-in blackword filter covers the same need.\n- All 24 locale files updated for the new section labels and the v1.5.6 control labels (machine translation; native review continues via the Hellion Forge Discord).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**\n\nA backlog-sync cycle: inherited tab-feature items plus a new fox\nbanner image and custom notification sounds.\n\nUser-visible:\n\n- Failed tells now raise a warning toast when a message you sent\n could not be delivered (recipient offline, in an instance, or\n blocking you). Toggle in Settings, Chat tab.\n- Per-tab notification sound: each tab can play a sound when a\n message arrives while you are looking at a different tab. Pick\n one of the 16 game chat sounds or one of three bundled Hellion\n sounds, with a preview button to hear it. Off by default,\n respects the global sound toggle.\n- The tab rename field in the right-click menu now focuses\n itself when the menu opens and accepts up to 512 characters,\n matching the settings-tab rename.\n- A jump-to-latest button appears in the chat log header while\n you are scrolled up from the live end.\n- Map flags and item links can be inserted into the chat input\n from its right-click menu.\n- The Hellion Forge fox banner in the first-run wizard and the\n Information tab is now a real image instead of ASCII art.\n\nSchema bumped to v18 (additive fields only, no data migration).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.4 — Polish and Motion (2026-05-20)**\n\nA polish cycle: smoother theme switching, faster theme and tab\naccess, and subtle hover motion. Three P3 items plus an\naccessibility toggle.\n\nUser-visible:\n\n- Theme switches now crossfade smoothly over ~300 ms across every\n Hellion-rendered surface — sidebar, title, buttons, tabs,\n scrollbar, separators. The window background snaps deliberately\n so the per-window opacity override from Dalamud's pinning menu\n stays untouched.\n- New header quick-picker: a palette button left of the cog opens\n a compact popup with two sections — every built-in and custom\n theme, and every tab. The active entry carries a check glyph;\n clicking another switches without closing the popup.\n- Sidebar icons ease their opacity on hover, and card-mode message\n borders highlight per tab while the cursor is over their rows.\n Framerate-independent, so a stalled Wine frame cannot overshoot\n the animation.\n- New \"Reduce motion\" toggle in Theme & Layout disables the\n crossfade, the hover animations and the unread-tab pulse for\n users who prefer a static UI.\n\nUnder the hood:\n\n- Two pure-helper lerp paths (ThemeAbgrCacheLerp, FrameLerp) with\n xUnit coverage in the Build Suite, plus a ColourUtil.ApplyAlpha\n alpha modulator. Two new /xlperf self-test steps pin the\n crossfade and quick-picker contracts.\n\nNo schema bump, no migration. Migration v17 stays.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)**\n\nMulti-language pass plus a long-standing first-frame HITCH lands\nas a side effect of a font-stack rewrite.\n\nUser-visible:\n\n- 24 selectable UI languages (was 2). Catalan, Czech, Danish,\n Dutch, English, Finnish, French, German, Greek, Hungarian,\n Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese\n (BR + PT), Romanian, Russian, Spanish, Swedish, Turkish,\n Ukrainian, Simplified + Traditional Chinese. Sorted by endonym,\n \"None\" pinned first. Non-native locales are AI-assisted and\n flagged for native-speaker review via the Forge Discord.\n- Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The\n Inter font ships Latin Extended-A/B, Greek polytonic and\n Cyrillic Supplement coverage; NotoSansCjkRegular joins as a\n third merge layer for Hangul and Simplified-Han glyphs the\n FFXIV Japanese game font does not ship.\n- First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that\n held since v1.4.x) to a median of ~20 ms (5-reload sample\n 17.9-23.6 ms, Linux/Wine). The bundled-font path silently\n fell back to the FFXIV Axis font for the entire v1.5.x series\n because of an early-return in the draw loop. The fix that\n routes RegularFont through draw also lands the defer-pattern\n win the v1.5.1 cycle was reaching for.\n- ExtraGlyphRanges auto-activates on language change. Korean,\n ChineseFull and the two new flags (LatinExtended, Greek) toggle\n on without a manual visit to Fonts and Colours.\n- New WarningText under the language dropdown notes FFXIV's\n chat input only fully supports EN/DE/FR/JA character sets.\n Other languages render in HellionChat but may garble when\n typed into in-game chat.\n\nUnder the hood:\n\n- Three-layer font stack: Inter Light primary, FFXIV\n JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular\n merge 2 for everything else CJK.\n- LanguageOverride enum gains ten locales plus three previously\n commented out (Italian, Korean, Norwegian as `nb`). New\n values append to the enum so existing config integers stay\n stable across update.\n- Crowdin gap closed: four post-sync ChatTwo keys backfilled\n into 13 legacy locales with per-key AI markers.\n- Plugin.LoadAsync runs a one-shot migration that ORs in the\n matching ExtraGlyphRanges flag for users already on a\n non-default language. Settings.Apply auto-activates on\n change going forward.\n- Em-dash sweep across the EN source and 18 translations to the\n house style. Russian and Ukrainian keep the typographic norm.\n\nMigration v17 stays. UseHellionFont users transition from Exo 2\nto Inter Light transparently on first reload.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases",
"AcceptsFeedback": true,
- "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.5/latest.zip",
- "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.5/latest.zip",
- "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.5/latest.zip",
- "TestingAssemblyVersion": "1.5.5.0",
+ "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip",
+ "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip",
+ "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip",
+ "TestingAssemblyVersion": "1.5.6.0",
"IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png",
"ImageUrls": [
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png",