Merge branch 'feature/v2.0.5'
Forge Announce / Post changelog to Hellion Forge (push) Successful in 10s
Security Scan (reusable) / Security Scan (push) Successful in 25s
Security / scan (push) Successful in 25s
Build / Build (Release) (push) Successful in 35s
Release / Build and attach release ZIP (push) Successful in 30s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 10s
Security Scan (reusable) / Security Scan (push) Successful in 25s
Security / scan (push) Successful in 25s
Build / Build (Release) (push) Successful in 35s
Release / Build and attach release ZIP (push) Successful in 30s
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
---
|
||||
subtitle: "Fokus bleibt, Tabs lassen sich schließen"
|
||||
versionsnatur: "Bugfix-Release"
|
||||
---
|
||||
Zwei Meldungen aus dem Test, beide in derselben Ecke: was ein eintreffendes Flüstern mit dem macht, was du gerade tust — und was du mit einem Tab machen kannst, wenn er erst einmal da ist.
|
||||
|
||||
- **Ein Flüstern, das ankam während du geschrieben hast, hat dir die Tastatur weggenommen.** Der Tab wechselte unter dir weg, und in diesem Spiel heißt das, dass die nächsten Tasten deine Figur bewegen statt Text zu schreiben. Schlimmer: Der halb getippte Satz konnte beim Falschen landen. Was du tippst gehört dem Fenster, der Empfänger wird aber von dem Tab gelesen, der beim Enter gerade aktiv ist. Solange du an einer Zeile schreibst, springt jetzt nichts mehr — in keinem Modus. Der Tab taucht trotzdem auf und wartet mit seinem Ungelesen-Punkt.
|
||||
- **Ein Flüster-Tab ließ sich überhaupt nicht schließen.** Der Eintrag ging beim Fenster-Neubau in 2.0.0 verloren: Er lebte im alten Menü, und das neue hat Umbenennen, Töne, Herauslösen und Anheften zurückgebracht, das Schließen aber nie. Flüster-Tabs sind absichtlich aus dem Einstellungs-Editor ausgenommen, mit einem Verweis auf das Kontextmenü — das sie ebenfalls nicht schließen konnte. Jetzt per Rechtsklick auf jedem Tab. Bei einem angehefteten Flüster-Tab musst du erst die Anheftung lösen, damit ein Fehlklick kein Gespräch beendet, das du behalten wolltest.
|
||||
- **Zwei Einstellungen entschieden, wo ein Flüstern aufgeht, und die ältere gewann immer.** "Neue /tell-Tabs direkt als Pop-out öffnen" feuerte beim Anlegen des Tabs, einen Tick bevor der Modus darunter überhaupt gefragt wurde — deshalb sah der aus, als täte er nichts. Beide sind jetzt eine. Deine bisherige Wahl wird übernommen.
|
||||
- **"Aus" ist aus dieser Auswahl verschwunden.** Es hat nie verhindert, dass ein Flüster-Tab entsteht, das macht der Schalter weiter oben. Es hat nur den Sprung dorthin unterbunden, und genau dafür ist der Schalter darunter da.
|
||||
- **Einen Tab zu schließen konnte ein Pop-out beschädigen, in dem du gerade warst.** Der Fokus sprang immer auf den ersten Tab der Liste, auch wenn der in einem eigenen Fenster offen war, und nahm ihm dabei seine Flüster-Bindung.
|
||||
- **Kleinkram.** "Pop Out" im Kontextmenü war auf jedem Client englisch, die Modusnamen ebenfalls. Der Hinweis zum Anheft-Limit verwies auf eine Funktion, die im Mai entfernt wurde. Im Spanischen stand ein Wort, das es nicht gibt, im Griechischen ein unübersetztes, im europäischen Portugiesisch eines, das seinem eigenen Knopf widersprach. Und segmentierte Einstellungszeilen haben lange Beschriftungen abgeschnitten.
|
||||
@@ -353,13 +353,6 @@ internal sealed class AutoTellTabsService : IDisposable
|
||||
|
||||
tab.AddMessage(currentMessage, unread: true);
|
||||
|
||||
// Flag the tab as a pop-out if configured; the marshalled TryOpen below reads
|
||||
// that flag to open the real window.
|
||||
if (Plugin.Config.AutoTellTabsOpenAsPopout)
|
||||
{
|
||||
tab.PopOut = true;
|
||||
}
|
||||
|
||||
return tab;
|
||||
}
|
||||
|
||||
@@ -373,20 +366,13 @@ internal sealed class AutoTellTabsService : IDisposable
|
||||
|
||||
Plugin.Config.Tabs.Add(tab);
|
||||
|
||||
// Actually open the pop-out window for the flagged tab — without this the
|
||||
// flag was dead (a PopOut tab with no window). CommitTempTab runs on the
|
||||
// PendingMessage worker thread under Plugin.TabsListLock; TryOpen does
|
||||
// OnTabActivated + Bind (window state Draw reads), so marshal onto the
|
||||
// framework thread. If the pool is full, drop the flag so it never claims a
|
||||
// window it didn't get (flag/window parity).
|
||||
if (tab.PopOut)
|
||||
{
|
||||
Plugin.Framework.RunOnFrameworkThread(() =>
|
||||
{
|
||||
if (!_plugin.ChannelPopoutPool.TryOpen(tab))
|
||||
tab.PopOut = false;
|
||||
});
|
||||
}
|
||||
// No pop-out is opened here any more. This service owns tab CREATION and
|
||||
// lifecycle; where a tell becomes VISIBLE is TellRouterService's single
|
||||
// decision (v2.0.5). It used to be both, and this one always won the race
|
||||
// -- it fired at creation, the router only a tick later -- which is why
|
||||
// TellAutoOpenMode looked like it did nothing for anyone with the old
|
||||
// AutoTellTabsOpenAsPopout flag on, and why the router's "is the user
|
||||
// mid-sentence" guard could be walked straight past.
|
||||
}
|
||||
|
||||
private static Tab BuildTempTab(string playerName, uint worldRowId)
|
||||
|
||||
@@ -35,7 +35,7 @@ public class ConfigKeyBind
|
||||
[Serializable]
|
||||
public class Configuration : IPluginConfiguration
|
||||
{
|
||||
internal const int LatestVersion = 27;
|
||||
internal const int LatestVersion = 28;
|
||||
|
||||
public int Version { get; set; } = LatestVersion;
|
||||
|
||||
@@ -167,6 +167,11 @@ public class Configuration : IPluginConfiguration
|
||||
// On by default: the wizard's closing step tells the user to try /tell and
|
||||
// watch a conversation open on its own, so the behaviour it describes has to
|
||||
// be the behaviour they get.
|
||||
// Retired in v2.0.5: this and TellAutoOpenMode were two settings for one
|
||||
// decision, and this one always won because it fired first -- which made the
|
||||
// other one look broken. The FIELD stays so the v28 migration can still read
|
||||
// what the user actually had; nothing else reads it, and it is gone from the
|
||||
// settings window.
|
||||
public bool AutoTellTabsOpenAsPopout = true;
|
||||
|
||||
// How sender names are rendered in the chat log.
|
||||
@@ -296,7 +301,11 @@ public class Configuration : IPluginConfiguration
|
||||
public bool MainWindowOpen = true;
|
||||
public bool SettingsWindowOpen;
|
||||
public int MaxParallelPopouts = 8;
|
||||
public TellAutoOpenMode TellAutoOpenMode = TellAutoOpenMode.Sidebar;
|
||||
|
||||
// Popout, not Sidebar: with AutoTellTabsOpenAsPopout defaulting to true, a
|
||||
// fresh install has ALWAYS opened tells in their own window. Naming that as
|
||||
// the default is what keeps a new install behaving the way it always did.
|
||||
public TellAutoOpenMode TellAutoOpenMode = TellAutoOpenMode.Popout;
|
||||
|
||||
// When true (default) the tell-auto-open router switches the active tab to the
|
||||
// incoming tell on every message; when false the tab is still created/revealed
|
||||
@@ -318,23 +327,6 @@ public enum TellAutoOpenMode
|
||||
Popout,
|
||||
}
|
||||
|
||||
public static class TellAutoOpenModeExt
|
||||
{
|
||||
// The only display name set still in English. It sat inline in ChannelsTab
|
||||
// as a literal array, which is why it was missed when the rest moved into
|
||||
// resources; here it is at least in the same place as its peers for the
|
||||
// localisation pass to pick up.
|
||||
public static string Name(this TellAutoOpenMode mode) =>
|
||||
mode switch
|
||||
{
|
||||
TellAutoOpenMode.Off => "Off",
|
||||
TellAutoOpenMode.Sidebar => "Sidebar",
|
||||
TellAutoOpenMode.TopTab => "Top tab",
|
||||
TellAutoOpenMode.Popout => "Popout",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
|
||||
};
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public enum MainWindowLayoutMode
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
|
||||
<PropertyGroup>
|
||||
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
|
||||
<Version>2.0.4</Version>
|
||||
<Version>2.0.5</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<!-- Use lock file to pin exact versions -->
|
||||
|
||||
@@ -21,6 +21,18 @@ tags:
|
||||
- Replacement
|
||||
- Privacy
|
||||
changelog: |-
|
||||
**v2.0.5 — Focus, and a way out (2026-08-23)**
|
||||
|
||||
Two tester reports, both about the same corner: what a tell does to what you were doing, and what you can do about a tab once it exists.
|
||||
|
||||
- **A tell arriving while you were typing took the keyboard.** The tab switched under you, and in this game that means the next thing you type walks your character around. It could also send your sentence to the wrong person: what you have typed belongs to the window, while the recipient is read off whichever tab is active when you press Enter — so a line meant for one person could leave addressed to whoever had just written. Nothing is revealed now while you are mid-sentence, in any mode. The tab still appears with its unread mark and waits for you.
|
||||
- **A tell tab could not be closed.** The entry was lost in the 2.0.0 window rebuild: it lived in the old menu, and the rebuilt one restored renaming, sounds, pop-outs and pinning but not this. Tell tabs are kept out of the settings editor on purpose, with a note pointing at the context menu — which could not close them either. Right-click any tab to close it. A pinned tell tab asks you to unpin it first, so one misclick cannot end a conversation you meant to keep.
|
||||
- **Two settings decided where a tell opens, and the older one always won.** "Open new /tell tabs as a pop-out" fired when the tab was created, a tick before the mode below it was ever asked — which is why that mode looked like it did nothing. They are one setting now and your existing choice carries over. "Off" went with them: it never stopped tell tabs from being created, that is the switch further up, it only stopped the jump to them, which is what the switch below it does.
|
||||
- **Closing a tab could break a pop-out you were using.** Re-anchoring always jumped to the first tab in the list, even when that tab was open in its own window, and stripped its tell binding on the way there.
|
||||
- **Smaller things.** "Pop Out" in the context menu was English on every client, as were the tell-open modes. The pinned-tab limit still pointed at a feature removed in May. Spanish had a word that does not exist, Greek had an untranslated one, Portuguese contradicted its own button. Segmented settings rows cut long labels in half. The last compiler warning in the project is gone.
|
||||
|
||||
---
|
||||
|
||||
**v2.0.4 — Housekeeping (2026-08-20)**
|
||||
|
||||
Nothing changes in how the plugin behaves. Two pieces of tidying that were overdue.
|
||||
@@ -44,13 +56,4 @@ changelog: |-
|
||||
- **Five settings descriptions printed `{0}` instead of the plugin name.** All 25 languages were affected, English included — it just hid better there, since "Hide {0} during cutscenes" still scans as a sentence while German puts the placeholder first. A test now walks every resource string with a placeholder and fails if one reaches a widget unformatted.
|
||||
- **New preview images.** The ones in the plugin installer were from 8 May and showed the interface as it looked before any of the window rebuilds.
|
||||
|
||||
---
|
||||
|
||||
**v2.0.1 — Hotfix (2026-08-19)**
|
||||
|
||||
A same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without.
|
||||
|
||||
- MessagePack raised from 3.1.4 to 3.1.7. It handles the payload serialisation behind the message database. The advisories are a recursion-depth limit in `Skip` and a fault in LZ4 decompression, both reachable only through crafted input — this plugin writes and reads its own bytes in a local file, so the practical exposure needs someone who already has write access to it. Lifted anyway, because it costs nothing.
|
||||
- The release workflow publishes through the Gitea API directly. The 2.0.0 build succeeded and then failed to attach its own archive, which is why that release had to be completed by hand.
|
||||
|
||||
Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
|
||||
|
||||
+27
-1
@@ -354,6 +354,32 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
||||
);
|
||||
}
|
||||
|
||||
// v28 migration: two settings could open a tell in its own window,
|
||||
// and AutoTellTabsOpenAsPopout won every race because it fired at tab
|
||||
// creation while TellAutoOpenMode only got asked a tick later -- by
|
||||
// which point the window was already open and the mode read back as
|
||||
// "nothing to do". Anyone with the old flag on was, in practice, on
|
||||
// Popout, so that is what carries forward. The flag itself is left
|
||||
// alone: it is the only record of what was chosen, and clearing it
|
||||
// would make a re-run of this step silently change a later decision.
|
||||
if (Config.Version < 28)
|
||||
{
|
||||
if (Config.AutoTellTabsOpenAsPopout)
|
||||
{
|
||||
Config.TellAutoOpenMode = TellAutoOpenMode.Popout;
|
||||
}
|
||||
else if (Config.TellAutoOpenMode == TellAutoOpenMode.Off)
|
||||
{
|
||||
// "Off" never stopped the tab from being created -- that is the
|
||||
// auto-tell switch further up -- it only stopped the jump to it,
|
||||
// which is exactly what TellAutoOpenSwitchAlways is for. Two
|
||||
// controls for one decision, and the one that read like "no tell
|
||||
// tabs at all" was the misleading one. Same behaviour, said once.
|
||||
Config.TellAutoOpenMode = TellAutoOpenMode.Sidebar;
|
||||
Config.TellAutoOpenSwitchAlways = false;
|
||||
}
|
||||
}
|
||||
|
||||
// v25 carried no migration step; the bump was documentation.
|
||||
//
|
||||
// v26 does. NameCameFromPartner is what screenshot mode reads to decide
|
||||
@@ -392,7 +418,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
||||
}
|
||||
}
|
||||
|
||||
Config.Version = 27;
|
||||
Config.Version = Configuration.LatestVersion;
|
||||
|
||||
// Unpinned TempTabs are session-only and dropped on every load. Pinned
|
||||
// TempTabs survive reload -- tester feedback in v1.4.7.
|
||||
|
||||
+6
-2
@@ -219,8 +219,6 @@ internal class HellionStrings
|
||||
internal static string ChatLog_AutoTellTabs_Compact_Description => Get(nameof(ChatLog_AutoTellTabs_Compact_Description));
|
||||
internal static string ChatLog_AutoTellTabs_GreetedToggle_Name => Get(nameof(ChatLog_AutoTellTabs_GreetedToggle_Name));
|
||||
internal static string ChatLog_AutoTellTabs_GreetedToggle_Description => Get(nameof(ChatLog_AutoTellTabs_GreetedToggle_Description));
|
||||
internal static string ChatLog_AutoTellTabs_OpenAsPopout_Name => Get(nameof(ChatLog_AutoTellTabs_OpenAsPopout_Name));
|
||||
internal static string ChatLog_AutoTellTabs_OpenAsPopout_Description => Get(nameof(ChatLog_AutoTellTabs_OpenAsPopout_Description));
|
||||
internal static string ChatLog_AutoTellTabs_PreloadHint => Get(nameof(ChatLog_AutoTellTabs_PreloadHint));
|
||||
internal static string ChatLog_AutoTellTabs_ConflictHint => Get(nameof(ChatLog_AutoTellTabs_ConflictHint));
|
||||
|
||||
@@ -419,6 +417,9 @@ internal class HellionStrings
|
||||
internal static string Settings_Chat_CommandHelpSide_Description => Get(nameof(Settings_Chat_CommandHelpSide_Description));
|
||||
internal static string Settings_Channels_TellAutoOpenMode_Name => Get(nameof(Settings_Channels_TellAutoOpenMode_Name));
|
||||
internal static string Settings_Channels_TellAutoOpenMode_Description => Get(nameof(Settings_Channels_TellAutoOpenMode_Description));
|
||||
internal static string Settings_Channels_TellAutoOpen_MainWindow => Get(nameof(Settings_Channels_TellAutoOpen_MainWindow));
|
||||
internal static string Settings_Channels_TellAutoOpen_Popout => Get(nameof(Settings_Channels_TellAutoOpen_Popout));
|
||||
internal static string Settings_Channels_TellAutoOpen_BusyHint => Get(nameof(Settings_Channels_TellAutoOpen_BusyHint));
|
||||
internal static string Settings_Channels_TellSwitchAlways_Name => Get(nameof(Settings_Channels_TellSwitchAlways_Name));
|
||||
internal static string Settings_Channels_TellSwitchAlways_Description => Get(nameof(Settings_Channels_TellSwitchAlways_Description));
|
||||
internal static string Settings_Window_LayoutSidebar => Get(nameof(Settings_Window_LayoutSidebar));
|
||||
@@ -504,6 +505,9 @@ internal class HellionStrings
|
||||
internal static string Tabs_NotificationSound_Option => Get(nameof(Tabs_NotificationSound_Option));
|
||||
internal static string Tabs_NotificationSound_Preview => Get(nameof(Tabs_NotificationSound_Preview));
|
||||
internal static string Tabs_NotificationSound_CustomOption => Get(nameof(Tabs_NotificationSound_CustomOption));
|
||||
internal static string Tabs_Close_MenuItem => Get(nameof(Tabs_Close_MenuItem));
|
||||
internal static string Tabs_Close_UnpinFirst => Get(nameof(Tabs_Close_UnpinFirst));
|
||||
internal static string Tabs_Close_LastTab => Get(nameof(Tabs_Close_LastTab));
|
||||
|
||||
// Scroll-to-bottom and item/flag linking
|
||||
internal static string ChatLog_ScrollToBottom_Tooltip => Get(nameof(ChatLog_ScrollToBottom_Tooltip));
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Amplada de la barra lateral de pestanyes en píxels. El valor per defecte (44 px) és només icones; amplia-la per encabir les capçaleres de secció com "Tells actius (3)" sense que es tallin.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Has assolit el màxim de {0} pestanyes de tell fixades. Desfixa'n una primer, o utilitza Converteix en permanent.</value>
|
||||
<value>Has assolit el màxim de {0} pestanyes de tell fixades. Desfixa'n una primer.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fixada: sobreviu al reconnectar.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Afegeix un botó al costat de cada pestanya auto-tell per marcar un interlocutor com a ja saludat: el nom de la pestanya s'atenua. Útil per als greeters de clubs que gestionen moltes converses en paral·lel. Desactivat per defecte.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Obre les pestanyes de /tell noves directament com a finestres emergents</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Quan està actiu, cada nova pestanya de /tell s'obre immediatament com a finestra pròpia. Tancar la finestra retorna la pestanya a la barra lateral.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>El nombre de tells precarregats es pot configurar a la pestanya Privadesa.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>So de Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Tanca la pestanya</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Desfixa aquesta pestanya abans de tancar-la.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Ha de quedar almenys una pestanya. Crea'n una altra primer.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>No s'ha pogut lliurar el tell.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>On s'obre un tell quan arriba.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Finestra principal</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Finestra emergent</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Mentre escrius, no s'obre cap finestra. La pestanya espera a la finestra principal perquè el teclat no torni al joc.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Canvia a la pestanya a cada tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Šířka postranního panelu záložek v pixelech. Výchozí (44 px) zobrazuje pouze ikony. Rozšíř ho, aby se záhlaví sekcí jako „Aktivní telly (3)" zobrazovala celá bez oříznutí.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Dosažen maximální počet {0} připnutých tell záložek. Nejdřív jednu odepni nebo použij Povýšit na trvalou.</value>
|
||||
<value>Dosažen maximální počet {0} připnutých tell záložek. Nejdřív jednu odepni.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Připnuto: přežívá relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Přidá klikací tlačítko vedle každé auto-tell záložky pro označení konverzačního partnera jako již pozdraveného: název záložky se pak ztlumí. Užitečné pro greetery v klubech, kteří paralelně vedou mnoho konverzací. Ve výchozím stavu vypnuto.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Otevírat nové /tell záložky přímo jako pop-outy</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Když je aktivní, každá nově vytvořená /tell záložka se okamžitě otevře jako vlastní okno. Zavřením okna se záložka vrátí do postranního panelu.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Počet předem načtených tellů lze nastavit v záložce Soukromí.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion zvuk</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Zavřít záložku</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Nejdřív záložku odepni, pak ji můžeš zavřít.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Musí zůstat alespoň jedna záložka. Vytvoř nejdřív další.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Tell nebylo možné doručit.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Kde se tell otevře, když dorazí.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Hlavní okno</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Vyskakovací okno</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Když píšeš, žádné okno se neotevře. Záložka počká v hlavním okně, aby se klávesnice nevrátila do hry.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Přepnout na kartu při každém tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Bredden af tab-sidebjælken i pixels. Standard (44 px) er kun ikon. Udvid den for at vise sektionsoverskrifter som "Aktive tells (3)" uden afskæring.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maksimum på {0} fastgjorte tell-tabs nået. Frigør én først, eller brug Konvertér til permanent.</value>
|
||||
<value>Maksimum på {0} fastgjorte tell-tabs nået. Frigør én først.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fastgjort: overlever genlog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Tilføjer en klikknap ved siden af hver auto-tell-tab til at markere en samtalepartner som allerede hilset på: tab-navnet dæmpes derefter. Nyttigt for club-greeter der håndterer mange samtaler parallelt. Fra som standard.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Åbn nye /tell-tabs direkte som pop-outs</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Når aktiv åbnes hver nyoprettet /tell-tab straks som sit eget vindue. Lukker man vinduet vender tab'en tilbage til sidebjælken.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Antallet af forudindlæste tells kan konfigureres under fanen Privatliv.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-lyd</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Luk tab</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Frigør denne tab, før du lukker den.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Der skal blive mindst én tab tilbage. Opret en anden først.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Et tell kunne ikke leveres.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Hvor en tell åbnes, når den ankommer.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Hovedvindue</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Popud-vindue</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Mens du skriver, åbnes der ikke noget vindue. Fanen venter i hovedvinduet, så tastaturet ikke hopper tilbage til spillet.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Skift til tab ved hver tell</value>
|
||||
</data>
|
||||
|
||||
@@ -468,7 +468,7 @@
|
||||
<value>Tab lösen</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maximal {0} angepinnte Flüster-Tabs erreicht. Erst einen lösen oder dauerhaft behalten.</value>
|
||||
<value>Maximal {0} angepinnte Flüster-Tabs erreicht. Erst einen lösen.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Angepinnt: überlebt Relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Fügt neben jedem Auto-Flüster-Tab einen Klick-Button hinzu, um einen Gesprächspartner als bereits begrüßt zu markieren: der Tab-Name wird dann gedimmt. Nützlich für Club-Greeter, die parallel viele Konversationen führen. Standardmäßig aus.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Neue /tell-Tabs direkt als Pop-Out öffnen</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Wenn aktiv, wird jeder neu angelegte /tell-Tab sofort als eigenes Fenster geöffnet. Beim Schließen des Fensters kehrt der Tab in die Seitenleiste zurück.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Die Anzahl der vorgeladenen Flüsternachrichten lässt sich im Datenschutz-Tab einstellen.</value>
|
||||
</data>
|
||||
@@ -1026,6 +1020,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-Sound</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Tab schließen</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Löse den Tab, bevor du ihn schließt.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Mindestens ein Tab muss bleiben. Lege zuerst einen weiteren an.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Ein Flüstern konnte nicht zugestellt werden.</value>
|
||||
</data>
|
||||
@@ -1181,6 +1184,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Wo ein Flüstern geöffnet wird, wenn er ankommt.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Hauptfenster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Pop-Out-Fenster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Während du schreibst, öffnet sich kein Fenster. Der Tab wartet im Hauptfenster, damit die Tastatur nicht ins Spiel zurückspringt.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Bei jedem Flüstern zum Tab wechseln</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Πλάτος του sidebar καρτελών σε pixels. Η προεπιλογή (44 px) είναι μόνο εικονίδιο. Διεύρυνε για να χωράνε οι επικεφαλίδες ενοτήτων όπως "Active Tells (3)" χωρίς αποκοπή.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Έχει συμπληρωθεί το μέγιστο των {0} καρφιτσωμένων tell tabs. Ξεκαρφίτσωσε πρώτα μία ή χρησιμοποίησε Προαγωγή σε μόνιμη.</value>
|
||||
<value>Έχει συμπληρωθεί το μέγιστο των {0} καρφιτσωμένων καρτελών tell. Ξεκαρφίτσωσε πρώτα μία.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Καρφιτσωμένο: επιβιώνει relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Προσθέτει ένα κουμπί δίπλα σε κάθε auto-tell tab για να σημειώσεις έναν συνομιλητή ως ήδη χαιρετισμένο. Το όνομα της καρτέλας αμβλύνεται τότε. Χρήσιμο για greeters club που διαχειρίζονται πολλές συνομιλίες παράλληλα. Απενεργοποιημένο εξ ορισμού.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Άνοιγμα νέων /tell tabs απευθείας ως pop-outs</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Όταν είναι ενεργό, κάθε νεοδημιουργημένη /tell καρτέλα ανοίγει αμέσως ως δικό της παράθυρο. Κλείνοντας το παράθυρο επιστρέφει η καρτέλα στο sidebar.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Ο αριθμός των προφορτωμένων tells μπορεί να ρυθμιστεί στην καρτέλα Απόρρητο.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Ήχος Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Κλείσιμο καρτέλας</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Ξεκαρφίτσωσε πρώτα την καρτέλα για να την κλείσεις.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Πρέπει να μείνει τουλάχιστον μία καρτέλα. Δημιούργησε πρώτα μια άλλη.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Ένα tell δεν μπόρεσε να παραδοθεί.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Πού ανοίγει ένα tell όταν φτάνει.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Κύριο παράθυρο</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Αναδυόμενο παράθυρο</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Όσο πληκτρολογείς, δεν ανοίγει παράθυρο. Η καρτέλα περιμένει στο κύριο παράθυρο, ώστε το πληκτρολόγιο να μην επιστρέψει στο παιχνίδι.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Μετάβαση στην καρτέλα σε κάθε tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Ancho de la barra lateral de pestañas en píxeles. El valor predeterminado (44 px) es solo icono; amplíalo para que encabezados de sección como "Tells activos (3)" no se corten.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Se alcanzó el máximo de {0} pestañas de tell fijadas. Desija una primero o usa Convertir en permanente.</value>
|
||||
<value>Se alcanzó el máximo de {0} pestañas de tell fijadas. Desfija una primero.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fijada: sobrevive al relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Añade un botón junto a cada pestaña de tell automática para marcar a un interlocutor como ya saludado: el nombre de la pestaña se atenúa. Útil para los saludadores de clubs que gestionan muchas conversaciones en paralelo. Desactivado por defecto.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Abrir nuevas pestañas de /tell directamente como ventanas emergentes</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Cuando está activo, cada nueva pestaña de /tell se abre inmediatamente como su propia ventana. Cerrar la ventana devuelve la pestaña a la barra lateral.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>El número de tells precargados se puede configurar en la pestaña Privacidad.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Sonido Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Cerrar pestaña</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Desfija esta pestaña antes de cerrarla.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Debe quedar al menos una pestaña. Crea otra primero.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>No se pudo entregar el tell.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Dónde se abre un tell cuando llega.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Ventana principal</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Ventana emergente</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Mientras escribes, no se abre ninguna ventana. La pestaña espera en la ventana principal para que el teclado no vuelva al juego.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Cambiar a la pestaña con cada tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Välilehtisivupalkin leveys pikseleinä. Oletus (44 px) on vain kuvake; levennä niin, että osion otsikot kuten "Active Tells (3)" mahtuvat ilman katkaisua.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Kiinnitettyjen tell-välilehtien enimmäismäärä {0} saavutettu. Irrota ensin yksi tai muuta pysyväksi välilehdeksi.</value>
|
||||
<value>Kiinnitettyjen tell-välilehtien enimmäismäärä {0} saavutettu. Irrota ensin yksi.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Kiinnitetty: selviää relogista.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Lisää napsautuspainikkeen jokaisen auto-tell-välilehden viereen, jolla voit merkitä keskustelukumppanin jo tervehdytyksi: välilehden nimi himmenee tällöin. Hyödyllinen klubi-tervehtijöille, jotka hallitsevat useita samanaikaisia keskusteluja. Oletuksena pois päältä.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Avaa uudet /tell-välilehdet suoraan irrotettuna ikkunana</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Kun aktiivinen, jokainen juuri luotu /tell-välilehti avataan välittömästi omana ikkunanaan. Ikkunan sulkeminen palauttaa välilehden sivupalkkiin.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Esivalmistellujen tellien määrä on määritettävissä Tietosuoja-välilehdellä.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-ääni</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Sulje välilehti</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Irrota välilehti ennen kuin suljet sen.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Vähintään yhden välilehden on jäätävä. Luo ensin toinen.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Telliä ei voitu toimittaa.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Missä tell avautuu saapuessaan.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Pääikkuna</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Ponnahdusikkuna</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Kirjoittaessasi ikkunaa ei avata. Välilehti odottaa pääikkunassa, jottei näppäimistö palaa peliin.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Vaihda välilehteen jokaisella tellillä</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Largeur de la barre latérale d'onglets en pixels. La valeur par défaut (44 px) n'affiche que les icônes ; élargissez-la pour permettre l'affichage complet d'en-têtes de section comme « Messages privés actifs (3) » sans troncature.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maximum de {0} onglets de message privé épinglés atteint. Désépinglez-en un d'abord, ou utilisez Promouvoir en permanent.</value>
|
||||
<value>Maximum de {0} onglets de message privé épinglés atteint. Désépinglez-en un d'abord.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Épinglé : survit à la reconnexion.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Ajoute un bouton à côté de chaque onglet de message privé automatique pour marquer un partenaire de conversation comme déjà salué. Le nom de l'onglet est alors atténué. Utile pour les hôtes de club qui gèrent de nombreuses conversations en parallèle. Désactivé par défaut.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Ouvrir les nouveaux onglets /tell directement comme fenêtres détachées</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Quand cette option est active, chaque onglet /tell nouvellement créé est immédiatement ouvert dans sa propre fenêtre. Fermer la fenêtre renvoie l'onglet dans la barre latérale.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Le nombre de messages privés préchargés peut être configuré dans l'onglet Confidentialité.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Son Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Fermer l'onglet</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Désépinglez cet onglet avant de le fermer.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Au moins un onglet doit rester. Créez-en un autre d'abord.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Un Message privé n'a pas pu être remis.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Où s'ouvre un message privé à son arrivée.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Fenêtre principale</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Fenêtre détachée</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Pendant que vous écrivez, aucune fenêtre ne s'ouvre. L'onglet attend dans la fenêtre principale, pour que le clavier ne retourne pas au jeu.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Basculer vers l'onglet à chaque message privé</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>A fül-oldalsáv szélessége képpontban. Az alapértelmezés (44 px) csak ikont mutat; szélesítsd meg, hogy a szakaszfejlécek (pl. „Aktív tellek (3)") ne legyenek levágva.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Elérted a {0} rögzített tell-fül maximumát. Először oldd fel az egyiket, vagy használd az Állandó füllé előléptetés funkciót.</value>
|
||||
<value>Elérted a {0} rögzített tell-fül maximumát. Először oldd fel az egyiket.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Rögzített: túléli az újrabejelentkezést.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Minden auto-tell-fül mellé egy kattintható gombot ad, amellyel a beszélgető partnert már üdvözöltként lehet megjelölni: a fül neve ezután halvány lesz. Hasznos klubi köszöntőknek, akik párhuzamosan sok beszélgetést kezelnek. Alapértelmezés szerint ki van kapcsolva.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Új /tell-fülek megnyitása közvetlenül pop-outként</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Ha aktív, minden újonnan létrehozott /tell-fül azonnal saját ablakként nyílik meg. Az ablak bezárásakor a fül visszakerül az oldalsávba.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Az előtöltött tellek száma az Adatvédelem fülön állítható be.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion hang</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Fül bezárása</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Előbb oldd fel a fül rögzítését, utána zárhatod be.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Legalább egy fülnek maradnia kell. Előbb hozz létre egy másikat.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Egy tell nem kézbesíthető.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Hol nyílik meg egy tell, amikor megérkezik.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Főablak</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Kiugró ablak</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Amíg gépelsz, nem nyílik ablak. A fül a főablakban vár, hogy a billentyűzet ne ugorjon vissza a játékba.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Váltás a fülre minden tellnél</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Larghezza della barra laterale dei tab in pixel. Il predefinito (44 px) mostra solo le icone; allargala per visualizzare le intestazioni di sezione come "Tell attivi (3)" senza troncamento.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Raggiunto il massimo di {0} tab tell fissi. Sblocca prima uno o usa Converti in permanente.</value>
|
||||
<value>Raggiunto il massimo di {0} tab tell fissi. Sblocca prima uno.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fisso: sopravvive al relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Aggiunge un pulsante cliccabile accanto a ogni tab tell automatico per contrassegnare un partner di conversazione come già salutato: il nome del tab viene poi attenuato. Utile per i greeter dei club che gestiscono molte conversazioni in parallelo. Disattivato per impostazione predefinita.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Apri i nuovi tab /tell direttamente come pop-out</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Se attivo, ogni nuovo tab /tell creato viene aperto immediatamente come finestra separata. Chiudendo la finestra il tab torna alla barra laterale.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Il numero di tell precaricati può essere configurato nel tab Privacy.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Suono Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Chiudi tab</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Sblocca questo tab prima di chiuderlo.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Deve rimanere almeno un tab. Creane prima un altro.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Un tell non può essere consegnato.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Dove si apre un tell quando arriva.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Finestra principale</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Finestra pop-out</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Mentre scrivi non si apre nessuna finestra. Il tab attende nella finestra principale, così la tastiera non torna al gioco.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Passa alla scheda a ogni tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>タブサイドバーの幅(ピクセル単位)。デフォルト(44px)はアイコンのみ表示です。「アクティブなテル (3)」などのセクションヘッダーが切れないよう広げてください。</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>ピン留めテルタブの上限 {0} 件に達しました。先に1件解除するか、「永続タブに昇格」をご利用ください。</value>
|
||||
<value>ピン留めテルタブの上限 {0} 件に達しました。先に1件解除してください。</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>ピン留め済み: 再ログイン後も残ります。</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>各自動テルタブの横にクリックボタンを追加し、会話相手を挨拶済みとしてマークできます。マークするとタブ名が薄く表示されます。複数の会話を並行して処理するクラブグリーター向けの機能です。デフォルトはオフです。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>新しい /tell タブを直接ポップアウトとして開く</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>有効にすると、新しく作成された /tell タブが即座に独立したウィンドウとして開きます。ウィンドウを閉じるとタブはサイドバーに戻ります。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>プリロードするテルの件数はプライバシータブで設定できます。</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellionサウンド</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>タブを閉じる</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>閉じる前にタブのピン留めを解除してください。</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>タブは最低1つ必要です。先に別のタブを作成してください。</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>テルを届けられませんでした。</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>テルが届いたときにどこで開くか。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>メインウィンドウ</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>ポップアウトウィンドウ</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>入力中はウィンドウを開きません。タブはメインウィンドウで待機するため、キーボードがゲームに戻ることはありません。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>テルのたびにタブへ切り替える</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>탭 사이드바의 너비 (픽셀). 기본값 (44px)은 아이콘만 표시됩니다. "활성 귓속말 (3)"과 같은 섹션 헤더가 잘리지 않으려면 너비를 넓히세요.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>고정 귓속말 탭의 최대 개수 {0}에 도달했습니다. 먼저 하나를 해제하거나 영구 탭으로 변환하세요.</value>
|
||||
<value>고정 귓속말 탭의 최대 개수 {0}에 도달했습니다. 먼저 하나를 해제하세요.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>고정됨: 재접속 후에도 유지됩니다.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>각 자동 귓속말 탭 옆에 클릭 버튼을 추가하여 대화 상대를 이미 인사한 것으로 표시합니다. 탭 이름이 흐리게 표시됩니다. 동시에 여러 대화를 관리하는 클럽 접대 담당자에게 유용합니다. 기본값은 꺼짐입니다.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>새 /tell 탭을 팝아웃으로 바로 열기</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>활성화하면 새로 생성된 /tell 탭이 즉시 별도 창으로 열립니다. 창을 닫으면 탭이 사이드바로 돌아옵니다.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>미리 불러올 귓속말 수는 개인정보 탭에서 설정할 수 있습니다.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion 소리</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>탭 닫기</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>닫기 전에 탭 고정을 해제하세요.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>탭은 최소 하나가 남아 있어야 합니다. 먼저 다른 탭을 만드세요.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>귓속말을 전달하지 못했습니다.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>귓속말이 도착했을 때 어디에서 열릴지.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>기본 창</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>팝아웃 창</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>입력하는 동안에는 창이 열리지 않습니다. 탭이 기본 창에서 대기하므로 키보드가 게임으로 돌아가지 않습니다.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>귓속말마다 탭으로 전환</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Bredde på fane-sidefeltet i piksler. Standard (44 px) er kun ikon. Gjør det bredere for å vise seksjonsoverskrifter som "Aktive tells (3)" uten avkutting.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maksimalt antall på {0} festede tell-faner er nådd. Løsgjør én først, eller bruk Gjør permanent.</value>
|
||||
<value>Maksimalt antall på {0} festede tell-faner er nådd. Løsgjør én først.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Festet: overlever relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Legger til en klikknapp ved siden av hver auto-tell-fane for å merke en samtalepartner som allerede hilset: fanenavnet dempes da. Nyttig for klubbvakter som håndterer mange samtaler parallelt. Av som standard.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Åpne nye /tell-faner direkte som pop-out-vinduer</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Når aktivt åpnes hver nyopprettet /tell-fane umiddelbart som sitt eget vindu. Å lukke vinduet returnerer fanen til sidefeltet.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Antallet forhåndslastede tells kan konfigureres i Personvern-fanen.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-lyd</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Lukk fane</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Løsgjør denne fanen før du lukker den.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Minst én fane må bli igjen. Opprett en annen først.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Et tell kunne ikke leveres.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Hvor en tell åpnes når den kommer.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Hovedvindu</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Utskilt vindu</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Mens du skriver, åpnes ingen vinduer. Fanen venter i hovedvinduet, slik at tastaturet ikke hopper tilbake til spillet.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Bytt til fanen ved hver tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Breedte van de tabbladzijbalk in pixels. De standaard (44 px) toont alleen pictogrammen; vergroot dit zodat sectiekoppen zoals "Actieve tells (3)" niet worden afgekapt.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maximum van {0} vastgepinde tell-tabbladen bereikt. Maak er eerst één los, of gebruik Omzetten naar permanent tabblad.</value>
|
||||
<value>Maximum van {0} vastgepinde tell-tabbladen bereikt. Maak er eerst één los.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Vastgepind: overleeft relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Voegt een klikknop toe naast elk auto-tell-tabblad om een gesprekspartner als al begroet te markeren: de tabbladnaam wordt dan gedimd. Handig voor club-greeters die tegelijkertijd veel gesprekken beheren. Standaard uitgeschakeld.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Nieuwe /tell-tabbladen direct als pop-out openen</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Als dit actief is, wordt elk nieuw aangemaakt /tell-tabblad meteen geopend als een eigen venster. Het sluiten van het venster brengt het tabblad terug naar de zijbalk.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Het aantal vooraf geladen tells kan worden ingesteld in het tabblad Privacy.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-geluid</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Tabblad sluiten</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Maak dit tabblad los voordat je het sluit.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Er moet minstens één tabblad overblijven. Maak eerst een ander aan.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Een tell kon niet worden bezorgd.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Waar een tell opent wanneer die binnenkomt.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Hoofdvenster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Pop-outvenster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Terwijl je typt, gaat er geen venster open. Het tabblad wacht in het hoofdvenster, zodat het toetsenbord niet terugspringt naar het spel.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Bij elke tell naar het tabblad schakelen</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Szerokość paska bocznego zakładek w pikselach. Domyślna (44 px) pokazuje tylko ikony; poszerz, żeby nagłówki sekcji jak „Aktywne tells (3)" nie były obcinane.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Osiągnięto maksymalną liczbę {0} przypiętych zakładek tell. Najpierw odepnij jedną lub użyj opcji Przekształć w stałą zakładkę.</value>
|
||||
<value>Osiągnięto maksymalną liczbę {0} przypiętych zakładek tell. Najpierw odepnij jedną.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Przypięta: przeżywa relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Dodaje przycisk przy każdej auto-zakładce tell, pozwalający oznaczyć partnera rozmowy jako już powitanego: nazwa zakładki jest wtedy przyciemniona. Przydatne dla greeters w klubach prowadzących wiele rozmów równocześnie. Domyślnie wyłączone.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Otwieraj nowe zakładki /tell bezpośrednio jako pop-outy</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Gdy aktywne, każda nowo utworzona zakładka /tell jest natychmiast otwierana jako własne okno. Zamknięcie okna powoduje powrót zakładki do paska bocznego.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Liczbę wstępnie wczytywanych tells można skonfigurować w zakładce Prywatność.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Dźwięk Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Zamknij zakładkę</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Najpierw odepnij zakładkę, potem możesz ją zamknąć.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Musi zostać co najmniej jedna zakładka. Utwórz najpierw kolejną.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Tell nie mógł zostać dostarczony.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Gdzie otwiera się tell, gdy nadejdzie.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Okno główne</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Okno wyskakujące</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Gdy piszesz, żadne okno się nie otwiera. Zakładka czeka w oknie głównym, żeby klawiatura nie wróciła do gry.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Przełączaj na zakładkę przy każdym tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Largura da barra lateral de abas em pixels. O padrão (44 px) é somente ícone; aumente para que cabeçalhos como "Tells Ativos (3)" não sejam cortados.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Limite máximo de {0} abas de tell fixadas atingido. Desafixe uma primeiro ou use Promover para permanente.</value>
|
||||
<value>Limite máximo de {0} abas de tell fixadas atingido. Desafixe uma primeiro.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fixado: sobrevive ao relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Adiciona um botão clicável ao lado de cada aba de tell automática para marcar um parceiro de conversa como já cumprimentado: o nome da aba fica esmaecido. Útil para recepcionistas de clube que gerenciam muitas conversas em paralelo. Desativado por padrão.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Abrir novas abas de /tell diretamente como pop-outs</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Quando ativo, cada nova aba de /tell criada é aberta imediatamente como sua própria janela. Fechar a janela retorna a aba para a barra lateral.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>O número de tells pré-carregados pode ser configurado na aba Privacidade.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Som Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Fechar aba</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Desafixe esta aba antes de fechá-la.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Pelo menos uma aba precisa permanecer. Crie outra primeiro.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Um tell não pôde ser entregue.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Onde um tell abre quando chega.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Janela principal</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Janela pop-out</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Enquanto você digita, nenhuma janela é aberta. A aba espera na janela principal, para que o teclado não volte ao jogo.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Mudar para a aba a cada tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Largura da barra lateral de separadores em píxeis. A predefinição (44 px) é apenas ícone; aumenta para que cabeçalhos de secção como "Tells ativos (3)" não sejam cortados.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Máximo de {0} separadores de tell fixos atingido. Desfixa um primeiro, ou usa Promover a permanente.</value>
|
||||
<value>Máximo de {0} separadores de tell fixos atingido. Desafixa um primeiro.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fixado: sobrevive ao relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Adiciona um botão de clique junto a cada separador de tell automático para marcar um parceiro de conversa como já cumprimentado: o nome do separador fica então esbatido. Útil para greeters de clubes que gerem muitas conversas em paralelo. Desativado por predefinição.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Abrir novos separadores de /tell diretamente como janelas flutuantes</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Quando ativo, cada novo separador de /tell criado é imediatamente aberto como janela própria. Fechar a janela devolve o separador à barra lateral.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>O número de tells pré-carregados pode ser configurado no separador Privacidade.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Som Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Fechar separador</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Desafixa este separador antes de o fechares.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Tem de ficar pelo menos um separador. Cria primeiro outro.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Um tell não pôde ser entregue.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Onde um tell abre quando chega.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Janela principal</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Janela destacável</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Enquanto escreves, não abre nenhuma janela. O separador espera na janela principal, para que o teclado não volte ao jogo.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Mudar para o separador a cada tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Width of the tab sidebar in pixels. The default (44 px) is icon-only; widen it to fit the section headers like "Active Tells (3)" without truncation.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maximum of {0} pinned tell tabs reached. Unpin one first, or use Promote to permanent.</value>
|
||||
<value>Maximum of {0} pinned tell tabs reached. Unpin one first.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Pinned: survives relog.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Adds a click button next to each auto-tell tab to mark a conversation partner as already greeted. The tab name is then dimmed. Useful for club greeters managing many conversations in parallel. Off by default.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Open new /tell tabs directly as pop-outs</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>When active, each newly created /tell tab is immediately opened as its own window. Closing the window returns the tab to the sidebar.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>The number of preloaded tells can be configured in the Privacy tab.</value>
|
||||
</data>
|
||||
@@ -889,6 +883,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion sound</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Close Tab</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Unpin this tab before closing it.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>At least one tab has to remain. Create another one first.</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||
@@ -1198,6 +1201,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Where a tell opens when it arrives.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Main window</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Pop-out window</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>While you are typing, no window opens. The tab waits in the main window instead, so the keyboard does not jump back into the game.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Switch to the tab on every tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Lățimea barei laterale cu tab-uri în pixeli. Implicit (44 px) afișează doar icoane; mărește-o pentru a încăpea antetele de secțiuni precum „Tell-uri active (3)" fără trunchiere.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Numărul maxim de {0} tab-uri tell fixate a fost atins. Dezfixează unul mai întâi sau folosește Promovează la permanent.</value>
|
||||
<value>Numărul maxim de {0} tab-uri tell fixate a fost atins. Dezfixează unul mai întâi.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fixat: supraviețuiește relog-ului.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Adaugă un buton de clic lângă fiecare tab auto-tell pentru a marca un partener de conversație ca deja salutat: numele tab-ului devine mai estompat. Util pentru greeter-ii de club care gestionează mai multe conversații în paralel. Dezactivat implicit.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Deschide tab-urile /tell noi direct ca ferestre pop-out</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Când este activ, fiecare tab /tell nou creat este imediat deschis ca propria fereastră. Închiderea ferestrei returnează tab-ul în bara laterală.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Numărul de tell-uri preîncărcate poate fi configurat în tab-ul Confidențialitate.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Sunet Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Închide tab-ul</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Dezfixează acest tab înainte de a-l închide.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Trebuie să rămână cel puțin un tab. Creează mai întâi altul.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Un tell nu a putut fi livrat.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Unde se deschide un tell când sosește.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Fereastra principală</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Fereastră detașată</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Cât timp scrii, nu se deschide nicio fereastră. Tabul așteaptă în fereastra principală, ca tastatura să nu revină în joc.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Comută pe tab la fiecare tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Ширина боковой панели вкладок в пикселях. По умолчанию (44 пкс) — только иконки; увеличьте, чтобы заголовки разделов вида «Активные ЛС (3)» не обрезались.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Достигнут максимум закреплённых вкладок ЛС: {0}. Сначала открепите одну или используйте «Преобразовать в постоянную».</value>
|
||||
<value>Достигнут максимум закреплённых вкладок ЛС: {0}. Сначала открепите одну.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Закреплено — переживает релог.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Добавляет кнопку рядом с каждой авто-вкладкой ЛС для отметки собеседника как уже поприветствованного — имя вкладки будет затемнено. Полезно для приветствующих в клубе, ведущих много разговоров одновременно. По умолчанию выключено.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Открывать новые вкладки /tell сразу как всплывающие окна</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Когда активно, каждая вновь созданная вкладка /tell немедленно открывается в собственном окне. При закрытии окна вкладка возвращается на боковую панель.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Количество предзагружаемых ЛС можно настроить на вкладке Конфиденциальность.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Звук Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Закрыть вкладку</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Сначала открепите вкладку, потом её можно закрыть.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Должна остаться хотя бы одна вкладка. Сначала создайте другую.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Сообщение не было доставлено.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Где открывается tell при получении.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Главное окно</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Всплывающее окно</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Пока вы печатаете, окно не открывается. Вкладка ждёт в главном окне, чтобы клавиатура не вернулась в игру.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Переключаться на вкладку при каждом tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Bredden på fliksidofältet i pixlar. Standard (44 px) är bara ikoner. Gör det bredare för att sektionsrubriker som "Aktiva tells (3)" inte ska kapas.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Maximalt {0} fästa tell-flikar nått. Lossa en först, eller använd Uppgradera till permanent.</value>
|
||||
<value>Maximalt {0} fästa tell-flikar nått. Lossa en först.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Fäst: överlever omloggning.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Lägger till en klickknapp bredvid varje auto-tell-flik för att markera en konversationspartner som redan hälsad: fliknamnet tonas då ned. Användbart för klubbhälsare som hanterar många konversationer parallellt. Av som standard.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Öppna nya /tell-flikar direkt som pop-out-fönster</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>När aktivt öppnas varje nyskapat /tell-flik omedelbart som ett eget fönster. Att stänga fönstret återför fliken till sidofältet.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Antalet förladda tells kan konfigureras i fliken Sekretess.</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion-ljud</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Stäng flik</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Lossa den här fliken innan du stänger den.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Minst en flik måste finnas kvar. Skapa en annan först.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Ett tell kunde inte levereras.</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Var en tell öppnas när den kommer.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Huvudfönster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Utbrytningsfönster</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Medan du skriver öppnas inget fönster. Fliken väntar i huvudfönstret, så att tangentbordet inte hoppar tillbaka till spelet.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Byt till fliken vid varje tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Sekme kenar çubuğunun piksel cinsinden genişliği. Varsayılan (44 px) yalnızca ikon modundadır; "Aktif Tell'ler (3)" gibi bölüm başlıklarının kesilmeden görünmesi için genişlet.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>En fazla {0} sabitlenmiş tell sekmesi sınırına ulaşıldı. Önce birini serbest bırak ya da kalıcıya yükselt.</value>
|
||||
<value>En fazla {0} sabitlenmiş tell sekmesi sınırına ulaşıldı. Önce birini serbest bırak.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Sabitlenmiş: yeniden girişten sonra hayatta kalır.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Her otomatik tell sekmesinin yanına, konuşma ortağını zaten selamlananlar olarak işaretlemek için bir tıklama düğmesi ekler; sekme adı soluklaşır. Paralel olarak çok sayıda konuşmayı yöneten kulüp karşılayıcıları için kullanışlıdır. Varsayılan olarak kapalıdır.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Yeni /tell sekmelerini doğrudan pop-out olarak aç</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Etkinleştirildiğinde her yeni oluşturulan /tell sekmesi hemen kendi penceresi olarak açılır. Pencereyi kapatmak sekmeyi kenar çubuğuna geri döndürür.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Önceden yüklenen tell sayısı Gizlilik sekmesinden yapılandırılabilir.</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion sesi</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Sekmeyi kapat</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Kapatmadan önce sekmeyi serbest bırak.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>En az bir sekme kalmalı. Önce başka bir sekme oluştur.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Bir tell teslim edilemedi.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Bir tell geldiğinde nerede açılacağı.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Ana pencere</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Ayrılan pencere</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Yazarken pencere açılmaz. Sekme ana pencerede bekler, böylece klavye oyuna geri dönmez.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Her tell'de sekmeye geç</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>Ширина бокової панелі вкладок у пікселях. Стандартне значення (44 пкс) — лише іконки; розширте, щоб заголовки секцій на кшталт «Активні tells (3)» не обрізались.</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>Досягнуто максимум {0} закріплених tell-вкладок. Спочатку відкріпіть одну або скористайтесь «Перетворити на постійну».</value>
|
||||
<value>Досягнуто максимум {0} закріплених tell-вкладок. Спочатку відкріпіть одну.</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>Закріплено — виживає після релогу.</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>Додає кнопку поруч із кожною авто-tell-вкладкою для позначення партнера розмови як вже привітаного — назва вкладки стає приглушеною. Зручно для грітерів клубу, які паралельно ведуть багато розмов. За замовчуванням вимкнено.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>Відкривати нові /tell-вкладки відразу як спливаючі вікна</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>Коли активно, кожна нова /tell-вкладка негайно відкривається як власне вікно. Закриття вікна повертає вкладку на бокову панель.</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>Кількість попередньо завантажених tells можна налаштувати на вкладці «Конфіденційність».</value>
|
||||
</data>
|
||||
@@ -1031,6 +1025,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Звук Hellion</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>Закрити вкладку</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>Спочатку відкріпіть вкладку, потім її можна закрити.</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>Має залишитися хоча б одна вкладка. Спочатку створіть іншу.</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>Повідомлення не було доставлено.</value>
|
||||
</data>
|
||||
@@ -1186,6 +1189,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>Де відкривається tell, коли надходить.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>Головне вікно</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>Окреме вікно</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>Поки ви друкуєте, вікно не відкривається. Вкладка чекає в головному вікні, щоб клавіатура не повернулася до гри.</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>Перемикатися на вкладку за кожного tell</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>标签页侧边栏的宽度(像素)。默认值(44 px)仅显示图标;加宽后可完整显示"活跃密语 (3)"等分区标题而不被截断。</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>已达到最多 {0} 个固定密语标签页的上限。请先取消固定一个,或使用"提升为永久标签页"。</value>
|
||||
<value>已达到最多 {0} 个固定密语标签页的上限。请先取消固定一个。</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>已固定,重新登录后仍保留。</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>在每个自动密语标签页旁添加一个点击按钮,用于将对话伙伴标记为已打招呼,标记后标签页名称将变暗。适合同时处理多个对话的俱乐部接待员使用。默认关闭。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>将新 /tell 标签页直接作为弹出窗口打开</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>启用后,每个新建的 /tell 标签页将立即作为独立窗口打开。关闭窗口后标签页将返回侧边栏。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>预加载密语数量可在隐私标签页中设置。</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion 音效</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>关闭标签页</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>关闭前请先取消固定此标签页。</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>至少需要保留一个标签页。请先创建另一个。</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>悄悄话未能送达。</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>密语到达时在何处打开。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>主窗口</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>弹出窗口</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>输入时不会弹出窗口。标签页会在主窗口等待,以免键盘跳回游戏。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>每条密语都切换到标签</value>
|
||||
</data>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<value>標籤頁側邊欄的寬度(像素)。預設值(44 px)為僅顯示圖示;加寬可讓「進行中的悄悄話 (3)」等區段標題不被截斷。</value>
|
||||
</data>
|
||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||
<value>已達到最多 {0} 個釘選悄悄話標籤頁的上限。請先取消釘選一個,或使用升格為永久標籤頁。</value>
|
||||
<value>已達到最多 {0} 個釘選悄悄話標籤頁的上限。請先取消釘選一個。</value>
|
||||
</data>
|
||||
<data name="PinTab_PinnedTooltip" xml:space="preserve">
|
||||
<value>已釘選,重新登入後仍會保留。</value>
|
||||
@@ -514,12 +514,6 @@
|
||||
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
|
||||
<value>在每個 Auto-悄悄話 標籤頁旁新增一個點擊按鈕,用於將對話對象標記為已問候,標籤頁名稱將隨之變暗。適合同時管理多個對話的接待人員使用。預設為關閉。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Name" xml:space="preserve">
|
||||
<value>直接以彈出視窗開啟新的 /tell 標籤頁</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_OpenAsPopout_Description" xml:space="preserve">
|
||||
<value>啟用後,每個新建立的 /tell 標籤頁會立即以獨立視窗開啟。關閉視窗後,標籤頁會回到側邊欄。</value>
|
||||
</data>
|
||||
<data name="ChatLog_AutoTellTabs_PreloadHint" xml:space="preserve">
|
||||
<value>預載悄悄話的數量可在隱私標籤頁中設定。</value>
|
||||
</data>
|
||||
@@ -1032,6 +1026,15 @@
|
||||
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
|
||||
<value>Hellion 音效</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_MenuItem" xml:space="preserve">
|
||||
<value>關閉標籤頁</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_UnpinFirst" xml:space="preserve">
|
||||
<value>關閉前請先取消釘選此標籤頁。</value>
|
||||
</data>
|
||||
<data name="Tabs_Close_LastTab" xml:space="preserve">
|
||||
<value>至少需要保留一個標籤頁。請先建立另一個。</value>
|
||||
</data>
|
||||
<data name="FailedTell_Notification_Generic" xml:space="preserve">
|
||||
<value>悄悄話未能送達。</value>
|
||||
</data>
|
||||
@@ -1187,6 +1190,15 @@
|
||||
<data name="Settings_Channels_TellAutoOpenMode_Description" xml:space="preserve">
|
||||
<value>悄悄話到達時在何處開啟。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_MainWindow" xml:space="preserve">
|
||||
<value>主視窗</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_Popout" xml:space="preserve">
|
||||
<value>彈出視窗</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellAutoOpen_BusyHint" xml:space="preserve">
|
||||
<value>輸入時不會彈出視窗。分頁會在主視窗等待,以免鍵盤跳回遊戲。</value>
|
||||
</data>
|
||||
<data name="Settings_Channels_TellSwitchAlways_Name" xml:space="preserve">
|
||||
<value>每則悄悄話都切換到分頁</value>
|
||||
</data>
|
||||
|
||||
@@ -14,13 +14,18 @@ internal sealed class ConfigMigrationV27Step : ISelfTestStep
|
||||
_ = plugin;
|
||||
}
|
||||
|
||||
public string Name => "Hellion Chat - Config v27 migration";
|
||||
public string Name => "Hellion Chat - Config migration";
|
||||
|
||||
public SelfTestStepResult RunStep()
|
||||
{
|
||||
if (Plugin.Config.Version != 27)
|
||||
// Against LatestVersion, not a literal: this read 27 and went red the
|
||||
// moment the schema moved to 28, reporting a migration failure where the
|
||||
// only thing that had happened was a new migration step being added.
|
||||
if (Plugin.Config.Version != Configuration.LatestVersion)
|
||||
{
|
||||
ImGui.Text($"Config.Version is {Plugin.Config.Version}, expected 27");
|
||||
ImGui.Text(
|
||||
$"Config.Version is {Plugin.Config.Version}, expected {Configuration.LatestVersion}"
|
||||
);
|
||||
return SelfTestStepResult.Fail;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,14 @@ using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace HellionChat.Services;
|
||||
|
||||
// Routes an incoming tell to the configured TellAutoOpenMode (Off/Sidebar/
|
||||
// TopTab/Popout). Deliberately decoupled from AutoTellTabsService:
|
||||
// that service owns tab CREATION + lifecycle; this only REVEALS/pops the tab it
|
||||
// finds. Popout guards on pool.IsOpen so it never double-pops a tab the
|
||||
// AutoTellTabsOpenAsPopout path already opened. Subscribes to the resolved
|
||||
// Routes an incoming tell to the configured TellAutoOpenMode (Off/main window/
|
||||
// Popout). Deliberately decoupled from AutoTellTabsService: that service owns
|
||||
// tab CREATION + lifecycle; this is the SINGLE place that decides where a tell
|
||||
// becomes visible. Until v2.0.5 that service opened pop-outs too, off its own
|
||||
// AutoTellTabsOpenAsPopout flag, and won every race by firing at tab creation --
|
||||
// so this mode looked inert and the mid-sentence guard here could be walked
|
||||
// past. Popout still guards on pool.IsOpen for the already-open case.
|
||||
// Subscribes to the resolved
|
||||
// MessageManager.MessageProcessed stream (a resolved Message), not the raw
|
||||
// IChatGui event, and defers the reveal one tick so the tab exists regardless of
|
||||
// subscriber order. Wired by TellRouterServiceInitHostedService.
|
||||
@@ -84,24 +87,17 @@ internal sealed class TellRouterService : IDisposable
|
||||
var reveal = TabLifecycleHelpers.PlanTellReveal(
|
||||
mode,
|
||||
Plugin.Config.TellAutoOpenSwitchAlways,
|
||||
Plugin.Instance.ChannelPopoutPool.IsOpen(tab.Identifier)
|
||||
Plugin.Instance.ChannelPopoutPool.IsOpen(tab.Identifier),
|
||||
Util.ChatInputBusy.Any()
|
||||
);
|
||||
|
||||
switch (reveal)
|
||||
{
|
||||
case TabLifecycleHelpers.TellReveal.MainWindow:
|
||||
// The mode also picks the layout, so Sidebar vs TopTab are
|
||||
// actually distinct outcomes, not the same ActivateTab.
|
||||
var wantLayout =
|
||||
mode == TellAutoOpenMode.TopTab
|
||||
? MainWindowLayoutMode.TopTabs
|
||||
: MainWindowLayoutMode.Sidebar;
|
||||
if (Plugin.Config.MainWindowLayoutMode != wantLayout)
|
||||
{
|
||||
Plugin.Config.MainWindowLayoutMode = wantLayout;
|
||||
Plugin.Instance.SaveConfig();
|
||||
}
|
||||
|
||||
// Deliberately does NOT touch MainWindowLayoutMode. It used to
|
||||
// force the layout to match this mode and SAVE it, so a single
|
||||
// incoming tell permanently undid the tab placement the user
|
||||
// had chosen under Window -> Layout (Flo, 23.08.2026).
|
||||
Plugin.Instance.MainWindow?.ActivateTab(tab);
|
||||
break;
|
||||
|
||||
|
||||
@@ -203,6 +203,10 @@ internal sealed class SettingsWidgets
|
||||
|
||||
// One setting, n choices. The control fills the whole control column rather
|
||||
// than right-aligning, because segments need the room to stay readable.
|
||||
// Breathing room left and right of a segment's label. Chosen against the
|
||||
// control's own Inset/Chamfer so the chamfered corner never bites into text.
|
||||
private const float SegmentLabelPadX = 12f;
|
||||
|
||||
internal void SegmentRow<T>(
|
||||
uint id,
|
||||
string label,
|
||||
@@ -224,6 +228,29 @@ internal sealed class SettingsWidgets
|
||||
var picked = selected;
|
||||
var colors = _segmented;
|
||||
|
||||
// Measured, not the 200px default: the control splits its width evenly
|
||||
// across the segments, so the longest label in the CURRENT language sets
|
||||
// what fits. Three short English words fit the default; two long German
|
||||
// ones did not, and came out as "op-Out-Fenste". Which language is the
|
||||
// longest is not knowable up front -- 25 of them ship.
|
||||
//
|
||||
// Only a WISH: SettingRowSplit hands the label column its MinLabelWidth
|
||||
// first, so an extreme translation cannot push the label off the row.
|
||||
var widest = 0f;
|
||||
foreach (var text in labels)
|
||||
widest = MathF.Max(widest, ImGui.CalcTextSize(text).X);
|
||||
|
||||
// CalcTextSize is already scaled, PreferredControlWidth is scaled again
|
||||
// downstream -- back to design pixels before handing it over.
|
||||
var scale = StyleEngine.Metrics.Scale;
|
||||
var style = new SettingRowStyle
|
||||
{
|
||||
PreferredControlWidth = MathF.Max(
|
||||
200f,
|
||||
(widest / scale + SegmentLabelPadX * 2f) * labels.Length
|
||||
),
|
||||
};
|
||||
|
||||
SettingRow.Draw(
|
||||
id,
|
||||
label,
|
||||
@@ -233,7 +260,8 @@ internal sealed class SettingsWidgets
|
||||
{
|
||||
ImGui.SetCursorScreenPos(new Vector2(ctx.ControlOrigin.X, ctx.ControlOrigin.Y));
|
||||
picked = SegmentedControl.Draw(id, ctx.ControlWidth, labels, selected, colors);
|
||||
}
|
||||
},
|
||||
styleOverride: style
|
||||
);
|
||||
|
||||
if (picked == selected)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using Dalamud.Interface.Utility.Raii;
|
||||
using HellionChat.Resources;
|
||||
using HellionChat.Ui.StyleEngine;
|
||||
using HellionChat.Ui.StyleEngine.Widgets;
|
||||
|
||||
namespace HellionChat.Ui.Components.Settings.Tabs;
|
||||
|
||||
@@ -8,11 +10,31 @@ internal sealed class ChannelsTab
|
||||
{
|
||||
private readonly SettingsWidgets _w;
|
||||
private readonly TabEditor _editor;
|
||||
private readonly WidgetPalette _palette;
|
||||
|
||||
// Three offered values for a four-value enum. TopTab stays in the enum so no
|
||||
// saved config needs migrating, but it no longer differs from Sidebar: the
|
||||
// difference used to be that the router rewrote the window layout as a side
|
||||
// effect, which is exactly what got removed. Both read back as Main window.
|
||||
private static readonly TellAutoOpenMode[] TellOpenValues =
|
||||
[
|
||||
TellAutoOpenMode.Sidebar,
|
||||
TellAutoOpenMode.Popout,
|
||||
];
|
||||
|
||||
// Built per call, not cached: a runtime language switch has to reach these
|
||||
// (same reason as WindowTab.LayoutLabels).
|
||||
private static string[] TellOpenLabels =>
|
||||
[
|
||||
HellionStrings.Settings_Channels_TellAutoOpen_MainWindow,
|
||||
HellionStrings.Settings_Channels_TellAutoOpen_Popout,
|
||||
];
|
||||
|
||||
public ChannelsTab(Plugin plugin, TokenResolver resolver)
|
||||
{
|
||||
_w = new SettingsWidgets(plugin, new SettingsPalette(resolver));
|
||||
_editor = new TabEditor(plugin);
|
||||
_palette = new WidgetPalette(resolver);
|
||||
}
|
||||
|
||||
public void Draw()
|
||||
@@ -68,13 +90,6 @@ internal sealed class ChannelsTab
|
||||
() => Plugin.Config.AutoTellTabsShowGreetedToggle,
|
||||
v => Plugin.Config.AutoTellTabsShowGreetedToggle = v
|
||||
);
|
||||
_w.ToggleRow(
|
||||
ImGui.GetID("channels.autotell.popout"u8),
|
||||
HellionStrings.ChatLog_AutoTellTabs_OpenAsPopout_Name,
|
||||
HellionStrings.ChatLog_AutoTellTabs_OpenAsPopout_Description,
|
||||
() => Plugin.Config.AutoTellTabsOpenAsPopout,
|
||||
v => Plugin.Config.AutoTellTabsOpenAsPopout = v
|
||||
);
|
||||
|
||||
// Written for this screen and never shown until this cycle. It names
|
||||
// the one setting in a third-party plugin that silently stops
|
||||
@@ -91,14 +106,45 @@ internal sealed class ChannelsTab
|
||||
)
|
||||
)
|
||||
{
|
||||
_w.EnumComboRow(
|
||||
_w.SegmentRow(
|
||||
ImGui.GetID("channels.autoopen.mode"u8),
|
||||
HellionStrings.Settings_Channels_TellAutoOpenMode_Name,
|
||||
HellionStrings.Settings_Channels_TellAutoOpenMode_Description,
|
||||
() => Plugin.Config.TellAutoOpenMode,
|
||||
v => Plugin.Config.TellAutoOpenMode = v,
|
||||
v => v.Name()
|
||||
TellOpenValues,
|
||||
TellOpenLabels,
|
||||
// TopTab and Off are not in the offered set, and SegmentRow falls
|
||||
// back to index 0 on an unknown value. The v28 migration converts
|
||||
// both, so this only catches a config that skipped it.
|
||||
() =>
|
||||
Plugin.Config.TellAutoOpenMode == TellAutoOpenMode.Popout
|
||||
? TellAutoOpenMode.Popout
|
||||
: TellAutoOpenMode.Sidebar,
|
||||
v => Plugin.Config.TellAutoOpenMode = v
|
||||
);
|
||||
|
||||
// Only under Pop-out, because it is the only setting the guard can
|
||||
// visibly contradict: you picked "own window" and sometimes get a tab
|
||||
// instead. Said in the theme's danger colour rather than a raw red so
|
||||
// it stays legible on every palette.
|
||||
if (Plugin.Config.TellAutoOpenMode == TellAutoOpenMode.Popout)
|
||||
{
|
||||
ImGui.Spacing();
|
||||
// Scoped block, not `using var`: that pops at the END OF THE
|
||||
// METHOD, and every section drawn below this one would come out
|
||||
// in the danger colour.
|
||||
using (
|
||||
ImRaii.PushColor(
|
||||
ImGuiCol.Text,
|
||||
_palette.Abgr(
|
||||
Token.StatusDanger,
|
||||
Plugin.Instance.ThemeRegistry.Active.Colors
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
ImGui.TextWrapped(HellionStrings.Settings_Channels_TellAutoOpen_BusyHint);
|
||||
}
|
||||
}
|
||||
_w.ToggleRow(
|
||||
ImGui.GetID("channels.autoopen.switch"u8),
|
||||
HellionStrings.Settings_Channels_TellSwitchAlways_Name,
|
||||
|
||||
@@ -190,7 +190,17 @@ internal sealed class Sidebar
|
||||
unpinnedHeaderRendered = true;
|
||||
}
|
||||
|
||||
DrawRow(tab, expanded, accentRgba, textAbgr, mutedAbgr, dimAbgr, dl, ref activeTab);
|
||||
DrawRow(
|
||||
tab,
|
||||
tabs,
|
||||
expanded,
|
||||
accentRgba,
|
||||
textAbgr,
|
||||
mutedAbgr,
|
||||
dimAbgr,
|
||||
dl,
|
||||
ref activeTab
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,6 +225,7 @@ internal sealed class Sidebar
|
||||
|
||||
private void DrawRow(
|
||||
Tab tab,
|
||||
IReadOnlyList<Tab> tabs,
|
||||
bool expanded,
|
||||
uint accentRgba,
|
||||
uint textAbgr,
|
||||
@@ -454,7 +465,7 @@ internal sealed class Sidebar
|
||||
LastRenderedUnreadDotCount++;
|
||||
}
|
||||
|
||||
TabContextMenu.Draw(tab, "ctx", _pool);
|
||||
TabContextMenu.Draw(tab, "ctx", _pool, tabs);
|
||||
|
||||
if (hasPopOut)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,12 @@ internal static class TabContextMenu
|
||||
// popup; the open trigger is a right-click on the LAST submitted item
|
||||
// (g.LastItemData via IsItemHovered) — any interactive item in between
|
||||
// would steal the trigger. Only DrawList ops may sit between.
|
||||
public static void Draw(Tab tab, string popupId, Windows.ChannelPopoutPool pool)
|
||||
public static void Draw(
|
||||
Tab tab,
|
||||
string popupId,
|
||||
Windows.ChannelPopoutPool pool,
|
||||
IReadOnlyList<Tab> tabs
|
||||
)
|
||||
{
|
||||
if (!ImGui.BeginPopupContextItem(popupId))
|
||||
{
|
||||
@@ -54,13 +59,13 @@ internal static class TabContextMenu
|
||||
)
|
||||
)
|
||||
{
|
||||
DrawBody(tab, pool);
|
||||
DrawBody(tab, pool, tabs);
|
||||
}
|
||||
|
||||
ImGui.EndPopup();
|
||||
}
|
||||
|
||||
private static void DrawBody(Tab tab, Windows.ChannelPopoutPool pool)
|
||||
private static void DrawBody(Tab tab, Windows.ChannelPopoutPool pool, IReadOnlyList<Tab> tabs)
|
||||
{
|
||||
// Rename: focus the field the first frame the popup appears.
|
||||
if (ImGui.IsWindowAppearing())
|
||||
@@ -95,10 +100,14 @@ internal static class TabContextMenu
|
||||
if (tab.EnableNotificationSound)
|
||||
DrawSoundPicker(tab);
|
||||
|
||||
if (ImGui.MenuItem("Pop Out"))
|
||||
if (ImGui.MenuItem(Language.ChatLog_Tabs_PopOut))
|
||||
pool.TryOpen(tab);
|
||||
|
||||
// One separator for the whole lifecycle block below, so a normal tab
|
||||
// (no pin controls) still gets the rule above its close entry.
|
||||
ImGui.Separator();
|
||||
DrawPinControls(tab);
|
||||
DrawCloseControl(tab, tabs, pool);
|
||||
}
|
||||
|
||||
// Pinning has been complete since v1.4.7 -- pools, cap, persistence, logout
|
||||
@@ -123,8 +132,6 @@ internal static class TabContextMenu
|
||||
if (service is null)
|
||||
return;
|
||||
|
||||
ImGui.Separator();
|
||||
|
||||
if (tab.IsPinned)
|
||||
{
|
||||
if (ImGui.MenuItem(HellionStrings.PinTab_MenuUnpin))
|
||||
@@ -156,6 +163,70 @@ internal static class TabContextMenu
|
||||
);
|
||||
}
|
||||
|
||||
// Closing a tab was lost in the v2.0.0 window rebuild: the trash entry lived
|
||||
// in ChatLogWindow's menu, which cf4705e retired, and the rebuilt menu only
|
||||
// restored rename, sound, pop-out and pinning.
|
||||
//
|
||||
// For tell tabs that left no way out at all. TabLifecycleHelpers.IsEditable
|
||||
// keeps temp tabs out of the settings editor on purpose and says the context
|
||||
// menu is where their gestures live -- so the editor was pointing at a menu
|
||||
// that could not close them either.
|
||||
//
|
||||
// Blocked states stay visible and disabled rather than absent: both are
|
||||
// states the user can undo, and the tooltip is what says how.
|
||||
private static void DrawCloseControl(
|
||||
Tab tab,
|
||||
IReadOnlyList<Tab> tabs,
|
||||
Windows.ChannelPopoutPool pool
|
||||
)
|
||||
{
|
||||
var closeability = TabLifecycleHelpers.GetCloseability(tab, tabs);
|
||||
var allowed = closeability == TabLifecycleHelpers.TabCloseability.Allowed;
|
||||
|
||||
// A tell tab is closed, a layout tab is deleted. Same gesture, different
|
||||
// promise: the conversation goes on without its tab, the layout entry does not.
|
||||
var label = tab.IsTempTab
|
||||
? HellionStrings.Tabs_Close_MenuItem
|
||||
: Language.ChatLog_Tabs_Delete;
|
||||
|
||||
if (ImGui.MenuItem(label, enabled: allowed) && allowed)
|
||||
{
|
||||
CloseTab(tab, pool);
|
||||
ImGui.CloseCurrentPopup();
|
||||
return;
|
||||
}
|
||||
|
||||
if (allowed || !ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
|
||||
return;
|
||||
|
||||
ImGuiUtil.Tooltip(
|
||||
closeability == TabLifecycleHelpers.TabCloseability.BlockedByPin
|
||||
? HellionStrings.Tabs_Close_UnpinFirst
|
||||
: HellionStrings.Tabs_Close_LastTab
|
||||
);
|
||||
}
|
||||
|
||||
// Removal order mirrors TabEditor.Delete, which already does this from a draw
|
||||
// frame: drop the tab, release the pool slot bound to its identifier, then
|
||||
// re-anchor the main window if this was the active tab. Safe here because the
|
||||
// strip iterates a frame snapshot, not the live list, and TryClose only
|
||||
// releases a fixed slot instead of mutating a window collection.
|
||||
private static void CloseTab(Tab tab, Windows.ChannelPopoutPool pool)
|
||||
{
|
||||
// Draw will never run for this tab again, so a pending rename can no
|
||||
// longer flush -- and leaving the guard armed would make the NEXT tab's
|
||||
// Draw see a stale owner. Drop it before the tab goes.
|
||||
if (_renamingTab == tab.Identifier)
|
||||
ClearPendingRename();
|
||||
|
||||
lock (Plugin.Instance.TabsListLock)
|
||||
Plugin.Config.Tabs.RemoveAll(t => t.Identifier == tab.Identifier);
|
||||
|
||||
pool.TryClose(tab.Identifier);
|
||||
Plugin.Instance.MainWindow?.ResetActiveTabIfRemoved(tab);
|
||||
Plugin.Instance.SaveConfig();
|
||||
}
|
||||
|
||||
// The flush depends on Draw running once more for this tab. If it never does —
|
||||
// LRU eviction, logout, window closed or collapsed, plugin unload, game exit —
|
||||
// the name only lives in memory until some other SaveConfig happens to run.
|
||||
|
||||
@@ -138,7 +138,7 @@ internal sealed class TopTabBar
|
||||
TabBadge
|
||||
);
|
||||
|
||||
TabContextMenu.Draw(tab, $"toptab_ctx_{tab.Identifier}", _pool);
|
||||
TabContextMenu.Draw(tab, $"toptab_ctx_{tab.Identifier}", _pool, tabs);
|
||||
}
|
||||
|
||||
LineDivider.Draw(null, borderAbgr, mutedAbgr);
|
||||
|
||||
@@ -64,9 +64,12 @@ internal static class Metrics
|
||||
if (frame == _cachedFrame)
|
||||
return _cachedScale;
|
||||
|
||||
// Safe variant: GlobalScale throws while the interface manager is
|
||||
// still coming up, and Metrics reaches more call sites than it did.
|
||||
_cachedScale = ImGuiHelpers.GlobalScaleSafe;
|
||||
// GlobalScale is what the retired GlobalScaleSafe alias forwarded to;
|
||||
// it falls back to the Dalamud config scale when ImGui is not up yet.
|
||||
// That does not make this property pre-init safe on its own -- the
|
||||
// GetFrameCount above would fault first -- but every Metrics caller
|
||||
// sits under Ui/ and only runs while drawing.
|
||||
_cachedScale = ImGuiHelpers.GlobalScale;
|
||||
_cachedFrame = frame;
|
||||
return _cachedScale;
|
||||
}
|
||||
|
||||
@@ -106,6 +106,9 @@ internal sealed class ChannelPopoutWindow : Window, IFocusableChatWindow
|
||||
// the keybind tail checks when deciding whether to route at this surface.
|
||||
public bool HasFocusedInput => _input.IsFocused;
|
||||
|
||||
// See IFocusableChatWindow.IsInputBusy.
|
||||
public bool IsInputBusy => _input.IsFocused || _input.PendingLength > 0;
|
||||
|
||||
// Arm-and-hold the one-frame Activate flag; the pop-out's Draw applies the
|
||||
// ImGui focus next frame. Framework-thread safe (field write only).
|
||||
public void RequestInputFocus()
|
||||
|
||||
@@ -10,5 +10,12 @@ internal interface IFocusableChatWindow
|
||||
{
|
||||
bool HasFocusedInput { get; }
|
||||
|
||||
// "The user is mid-sentence here." Focus alone is not enough: a typed line
|
||||
// survives a click elsewhere, and stealing the tab out from under it is how
|
||||
// half a message ends up addressed to whoever just said hello -- the input
|
||||
// buffer belongs to the WINDOW, but the send target comes from whichever tab
|
||||
// is active at Enter.
|
||||
bool IsInputBusy { get; }
|
||||
|
||||
void RequestInputFocus();
|
||||
}
|
||||
|
||||
@@ -149,9 +149,19 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
|
||||
|
||||
// Framework thread, not the draw frame: needs the current truth, so it takes
|
||||
// its own lock instead of using the frame snapshot.
|
||||
//
|
||||
// Through PickMainActiveTab rather than Tabs[0]: Tabs[0] may be popped out,
|
||||
// and anchoring on it ran OnTabActivated over a tab that is live in its own
|
||||
// window -- stripping the tell binding of a conversation the user is in the
|
||||
// middle of. The next frame's PickMainActiveTab then re-anchored anyway, so
|
||||
// the strip bought nothing. Passing null asks for the first VISIBLE tab.
|
||||
Tab? next;
|
||||
lock (Plugin.Instance.TabsListLock)
|
||||
next = Plugin.Config.Tabs.Count > 0 ? Plugin.Config.Tabs[0] : null;
|
||||
next = TabLifecycleHelpers.PickMainActiveTab(
|
||||
null,
|
||||
Plugin.Config.Tabs,
|
||||
t => _pool.IsOpen(t.Identifier)
|
||||
);
|
||||
_activeTab = next;
|
||||
if (next is not null)
|
||||
TabLifecycleHelpers.OnTabActivated(next, removed);
|
||||
@@ -243,6 +253,9 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
|
||||
// input focus before routing a channel-set/REPLY/prefill at it.
|
||||
public bool HasFocusedInput => _input.IsFocused;
|
||||
|
||||
// See IFocusableChatWindow.IsInputBusy.
|
||||
public bool IsInputBusy => _input.IsFocused || _input.PendingLength > 0;
|
||||
|
||||
// Arm-and-hold: field writes only, safe from the framework thread; the draw
|
||||
// path applies the actual ImGui focus next frame (same path as ActivateChat).
|
||||
public void RequestInputFocus()
|
||||
@@ -290,21 +303,41 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
|
||||
lock (Plugin.Instance.TabsListLock)
|
||||
tabs = Plugin.Config.Tabs.ToList();
|
||||
|
||||
// First-frame seed: the active tab defaults to the first persisted
|
||||
// tab so the message list isn't empty on a clean session.
|
||||
// First-frame seed: the active tab defaults to the first VISIBLE tab so
|
||||
// the message list isn't empty on a clean session.
|
||||
//
|
||||
// Through PickMainActiveTab, not tabs[0]. With every tab popped out this
|
||||
// seeded tabs[0] and the re-anchor below immediately set it back to null,
|
||||
// every single frame -- 60 pointless OnTabActivated runs a second, each
|
||||
// one stripping tell state off a tab that is live in its own window. Null
|
||||
// here means "nothing to show", which is the state the re-anchor settles
|
||||
// on anyway, so the oscillation just stops.
|
||||
if (_activeTab is null && tabs.Count > 0)
|
||||
{
|
||||
var seeded = tabs[0];
|
||||
_activeTab = seeded;
|
||||
// The seeded Tabs[0] is the likeliest legacy stale-tell carrier
|
||||
// (pre-coupling the detour wrote here); strip it like any activation.
|
||||
TabLifecycleHelpers.OnTabActivated(seeded, null);
|
||||
var seeded = TabLifecycleHelpers.PickMainActiveTab(
|
||||
null,
|
||||
tabs,
|
||||
t => _pool.IsOpen(t.Identifier)
|
||||
);
|
||||
if (seeded is not null)
|
||||
{
|
||||
_activeTab = seeded;
|
||||
// The seeded tab is the likeliest legacy stale-tell carrier
|
||||
// (pre-coupling the detour wrote here); strip it like any activation.
|
||||
TabLifecycleHelpers.OnTabActivated(seeded, null);
|
||||
}
|
||||
}
|
||||
else if (_activeTab is { } active && !tabs.Contains(active))
|
||||
{
|
||||
// Active tab is no longer in the list (e.g. a wholesale config import
|
||||
// the service repair paths never see). Re-seed on the Draw thread.
|
||||
var reseed = tabs.Count > 0 ? tabs[0] : null;
|
||||
// the service repair paths never see). Re-seed on the Draw thread --
|
||||
// same visible-tab rule as the seed above, so this cannot hand the
|
||||
// window a popped-out tab and strip its tell state on the way.
|
||||
var reseed = TabLifecycleHelpers.PickMainActiveTab(
|
||||
null,
|
||||
tabs,
|
||||
t => _pool.IsOpen(t.Identifier)
|
||||
);
|
||||
_activeTab = reseed;
|
||||
if (reseed is not null)
|
||||
TabLifecycleHelpers.OnTabActivated(reseed, active);
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace HellionChat.Util;
|
||||
|
||||
// "The user is mid-sentence somewhere." Asked before a tell is revealed, in any
|
||||
// mode. Its own file because the answer has to be identical everywhere it is
|
||||
// asked: this started as a guard inside the reveal plan, and a SECOND pop-out
|
||||
// path walked straight past it -- the window opened anyway, took the keyboard
|
||||
// with it, and in this game the next typed sentence walks the character around.
|
||||
// The paths are one now, but a shared answer is what keeps it that way.
|
||||
internal static class ChatInputBusy
|
||||
{
|
||||
// Reads two fields the draw path wrote; no ImGui call, so it is safe from the
|
||||
// framework thread. Call it THERE, not from the message worker: the worker
|
||||
// runs ahead of the frame and would sample a stale answer.
|
||||
internal static bool Any()
|
||||
{
|
||||
if (Plugin.Instance.MainWindow is { IsInputBusy: true })
|
||||
return true;
|
||||
|
||||
foreach (var window in Plugin.Instance.ChannelPopoutPool.Instances)
|
||||
if (window is { IsOpen: true, IsInputBusy: true })
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -68,6 +68,51 @@ internal static class TabLifecycleHelpers
|
||||
return editable > 1;
|
||||
}
|
||||
|
||||
// Why a tab may or may not be closed from the tab strip's context menu.
|
||||
// The menu needs the REASON, not just a bool: a blocked close stays visible
|
||||
// and disabled with the matching tooltip, because both blocks are states the
|
||||
// user can undo (unpin the tab / create a second one).
|
||||
internal enum TabCloseability
|
||||
{
|
||||
Allowed,
|
||||
|
||||
// Temp tab is pinned. Pinning is the "keep this" gesture, so closing
|
||||
// takes the deliberate two-step (Flo, 2026-08-22) rather than undoing
|
||||
// it silently on one misclick.
|
||||
BlockedByPin,
|
||||
|
||||
// Last editable tab. Same reason CanDelete guards the editor: the window
|
||||
// would be left with nothing to draw and the message list has no empty
|
||||
// state.
|
||||
BlockedLastTab,
|
||||
}
|
||||
|
||||
// Closing a tab from the context menu, for both tab kinds.
|
||||
//
|
||||
// Temp tabs are deliberately NOT routed through CanDelete: IsEditable
|
||||
// excludes them, so CanDelete would answer "no" for every tell tab and the
|
||||
// conversation would have no way out at all. That was the actual v2.0.0
|
||||
// regression -- the editor sends temp tabs to the context menu, and the
|
||||
// context menu had no close.
|
||||
//
|
||||
// Pure + Dalamud-free.
|
||||
// TEST-MIRROR: ../../../Hellion Build test/_Helpers/TabCloseabilityTests.cs
|
||||
internal static TabCloseability GetCloseability(Tab tab, IReadOnlyList<Tab> tabs)
|
||||
{
|
||||
if (tab.IsTempTab)
|
||||
return tab.IsPinned ? TabCloseability.BlockedByPin : TabCloseability.Allowed;
|
||||
|
||||
// Counted over the whole list rather than via an index: the caller draws
|
||||
// from a frame snapshot in render order, so a positional index would not
|
||||
// survive the sectioning.
|
||||
var editable = 0;
|
||||
foreach (var t in tabs)
|
||||
if (IsEditable(t))
|
||||
editable++;
|
||||
|
||||
return editable > 1 ? TabCloseability.Allowed : TabCloseability.BlockedLastTab;
|
||||
}
|
||||
|
||||
public static bool ShouldStripOnLoad(Tab t) => IsInUnpinnedPool(t);
|
||||
|
||||
public static bool ShouldStripOnSave(Tab t) => IsInUnpinnedPool(t);
|
||||
@@ -217,9 +262,10 @@ internal static class TabLifecycleHelpers
|
||||
|
||||
// Returns the tab the main window should display — the current tab if it
|
||||
// is not popped out, else the FIRST non-popped tab in list order, else null when
|
||||
// every tab is popped. NOTE: deliberately NOT ResetActiveTabIfRemoved's
|
||||
// unconditional Tabs[0] — Tabs[0] may itself be popped and would re-trigger the
|
||||
// re-anchor every frame. Pure + Dalamud-free.
|
||||
// every tab is popped. Skipping popped tabs is the whole point: an unconditional
|
||||
// Tabs[0] would re-trigger the re-anchor every frame when Tabs[0] is itself
|
||||
// popped. ResetActiveTabIfRemoved passes null to reach the same rule from its
|
||||
// own entry point. Pure + Dalamud-free.
|
||||
// TEST-MIRROR: ../../../Hellion Build test/_Helpers/PickMainActiveTabTests.cs
|
||||
internal static Tab? PickMainActiveTab(
|
||||
Tab? current,
|
||||
@@ -243,7 +289,17 @@ internal static class TabLifecycleHelpers
|
||||
Popout,
|
||||
}
|
||||
|
||||
// The alreadyPopped case is the whole reason this is a function.
|
||||
// Two reasons this is a function, and inputBusy is the second one.
|
||||
//
|
||||
// A tell arriving while the user is mid-sentence used to yank the active tab
|
||||
// away (tester report, Carla, 23.08.2026). The interruption is the visible
|
||||
// half; the sharp half is that InputBar's buffer belongs to the WINDOW while
|
||||
// the send target is read off whatever tab is active at Enter -- so a line
|
||||
// typed at one person could leave addressed to the one who just wrote. When
|
||||
// an input is busy, nothing is revealed at all: the tab still appears and
|
||||
// still carries its unread mark, the user just walks over on their own.
|
||||
//
|
||||
// The alreadyPopped case is the older reason.
|
||||
//
|
||||
// Revealing a popped-out tab in the main window looks like it does nothing,
|
||||
// and then does something worse: PickMainActiveTab re-anchors on the next
|
||||
@@ -259,14 +315,20 @@ internal static class TabLifecycleHelpers
|
||||
internal static TellReveal PlanTellReveal(
|
||||
TellAutoOpenMode mode,
|
||||
bool switchAlways,
|
||||
bool alreadyPopped
|
||||
bool alreadyPopped,
|
||||
bool inputBusy
|
||||
) =>
|
||||
mode switch
|
||||
{
|
||||
TellAutoOpenMode.Off => TellReveal.None,
|
||||
TellAutoOpenMode.Popout => alreadyPopped ? TellReveal.None : TellReveal.Popout,
|
||||
_ => switchAlways && !alreadyPopped ? TellReveal.MainWindow : TellReveal.None,
|
||||
};
|
||||
inputBusy
|
||||
? TellReveal.None
|
||||
: mode switch
|
||||
{
|
||||
TellAutoOpenMode.Off => TellReveal.None,
|
||||
TellAutoOpenMode.Popout => alreadyPopped ? TellReveal.None : TellReveal.Popout,
|
||||
// Sidebar and TopTab both land here: they used to pick the window
|
||||
// LAYOUT as a side effect, which overwrote a setting the user made
|
||||
// somewhere else entirely. Reveal is reveal; layout is the user's.
|
||||
_ => switchAlways && !alreadyPopped ? TellReveal.MainWindow : TellReveal.None,
|
||||
};
|
||||
|
||||
// Popout-aware sibling of WrapTabIndex for the ChatTabForward/Backward
|
||||
// keybind. Steps from current by delta's sign (±1), wrapping, and returns the
|
||||
|
||||
@@ -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 @@
|
||||
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
|
||||
</p>
|
||||
|
||||
**Version 2.0.4** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally
|
||||
**Version 2.0.5** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally
|
||||
forked from [Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
|
||||
|
||||
Hellion Chat is a privacy-first chat plugin that began as a fork of Chat 2. The core it grew from
|
||||
|
||||
@@ -11,6 +11,43 @@ releases as an overview and links to the release pages for details.
|
||||
|
||||
---
|
||||
|
||||
## [2.0.5] — 2026-08-23
|
||||
|
||||
Two tester reports about the same corner of the plugin: what an incoming tell does
|
||||
to what you were doing, and what you can do about a tab once it exists.
|
||||
|
||||
### Fixed
|
||||
|
||||
- A tell arriving while you were typing took the keyboard focus, which in this game
|
||||
means the next keystrokes reach the character rather than the chat. It could also
|
||||
send the half-typed line to the wrong person: the text belongs to the window, the
|
||||
recipient is read off whichever tab is active at Enter. Nothing is revealed now
|
||||
while an input is in use, in any mode.
|
||||
- Tell tabs could not be closed at all. The context menu lost its close entry in the
|
||||
2.0.0 window rebuild, and the settings editor excludes tell tabs by design.
|
||||
- Closing a tab re-anchored on the first tab in the list even when that tab was open
|
||||
in a pop-out, stripping its tell binding. With every tab popped out, the seed and
|
||||
the re-anchor contradicted each other on every frame.
|
||||
- The pinned-tab limit message pointed at a feature removed in May. Spanish carried a
|
||||
non-existent word, Greek an untranslated one, and European Portuguese used a verb
|
||||
that contradicted its own button.
|
||||
- Segmented settings rows measured a flat 200px and cut off longer labels.
|
||||
|
||||
### Changed
|
||||
|
||||
- Where a tell opens is one setting now. "Open new /tell tabs as a pop-out" and the
|
||||
tell-open mode both decided it, and the former won every time because it fired at
|
||||
tab creation. Config schema 28 carries the existing choice forward.
|
||||
- The tell-open mode dropped its "Off" option, which never prevented tell tabs — that
|
||||
is the auto-tell switch — and only suppressed the jump to them, which the switch
|
||||
below it already does.
|
||||
- "Pop Out" in the tab context menu and the tell-open mode names were hardcoded
|
||||
English on every client. They are translated into all 25 languages.
|
||||
- `Metrics.Scale` no longer calls the obsolete `GlobalScaleSafe`. The project builds
|
||||
without compiler warnings.
|
||||
|
||||
---
|
||||
|
||||
## [2.0.4] — 2026-08-20
|
||||
|
||||
Housekeeping. Nothing changes in how the plugin behaves.
|
||||
|
||||
+18
-2
@@ -12,6 +12,16 @@ be a poor fit for the plugin's privacy-first scope during brainstorming.
|
||||
|
||||
## Released
|
||||
|
||||
**v2.0.5 — Focus, and a way out (2026-08-23)** came out of two tester reports about
|
||||
the same corner. A tell arriving mid-sentence took the keyboard, which in this game
|
||||
sends the next keystrokes to the character; worse, it could address a half-typed line
|
||||
to the wrong person, since the input buffer belongs to the window while the recipient
|
||||
is read off whichever tab is active at Enter. Tell tabs, separately, could not be
|
||||
closed at all — the entry was lost in the 2.0.0 rebuild, and the settings editor
|
||||
excludes them on purpose. Where a tell opens is one setting now rather than two that
|
||||
raced each other, and the tell-open modes plus the context menu's Pop Out entry were
|
||||
the last hardcoded English strings in the plugin.
|
||||
|
||||
**v2.0.2 — Emotes out, placeholders fixed (2026-08-19)** removed BetterTTV emote
|
||||
support entirely. Its shared-emote endpoint went behind authentication and that was
|
||||
where nearly all of them came from; what remained was 54 mostly static images, one
|
||||
@@ -94,8 +104,14 @@ a later pass rather than rushed into a patch:
|
||||
- **An orphaned `EmoteCacheV1/` directory** stays on disk for anyone who ran a
|
||||
version before 2.0.2. Nothing reads or writes it. A one-time cleanup on load
|
||||
would be tidier than asking people to delete it by hand.
|
||||
- **`Metrics.Scale` uses the deprecated `ImGuiHelpers.GlobalScaleSafe`**, which is
|
||||
the only compiler warning left in the build.
|
||||
- **`PopoutSlotMap` is unsynchronised.** A plain dictionary plus a bool array,
|
||||
written from the draw thread and from the framework thread. Reading a dictionary
|
||||
while another thread writes it can hang or return the wrong slot. Found during the
|
||||
2.0.5 review and deliberately left out of a patch release: a lock here needs its
|
||||
ordering against `TabsListLock` worked out first.
|
||||
- **The database viewer and the symbol picker are still English.** The symbol picker
|
||||
alone carries 90 Unicode character names, which is a cycle of its own rather than
|
||||
an addition to a patch.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user