Compare commits

..

35 Commits

Author SHA1 Message Date
JonKazama-Hellion d4bcbc93e2 Merge branch 'feature/v1.5.5'
Security / scan (push) Successful in 23s
Build / Build (Release) (push) Successful in 29s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 6s
Release / Build and attach release ZIP (push) Successful in 36s
2026-05-21 21:27:57 +02:00
JonKazama-Hellion ca801a006a release(v1.5.5): manifest bump, changelog and forge post 2026-05-21 20:43:54 +02:00
JonKazama-Hellion cc1c05add0 feat(ui): add bundled custom notification sounds
Adds three embedded WAV files as additional notification sound choices
(ids 17-19) alongside the existing 16 game sounds. Playback via NAudio
WaveOutEvent/WinMM, which works correctly on Wine/Linux.
2026-05-21 20:07:09 +02:00
JonKazama-Hellion 969d5e6aa6 feat(ui): add a preview button for the per-tab notification sound 2026-05-21 19:01:45 +02:00
JonKazama-Hellion aaeca76bfd fix(branding): enlarge fox banner and add a contrast card 2026-05-21 19:01:42 +02:00
JonKazama-Hellion 4f6c916bd9 feat(branding): replace ASCII fox banner with embedded image 2026-05-21 18:47:25 +02:00
JonKazama-Hellion ce7dda9e48 fix(ui): null-guard agent access and refocus input after token insert
AgentMap.Instance() and AgentChatLog.Instance() can return null during
zone transitions. Capture pointers into locals and short-circuit the
FlagMarkerCount/LinkedItem deref when null so the entries are correctly
greyed out without faulting. Add Activate/ActivatePos after each append
so the input box regains focus and the caret lands after the token,
matching the SymbolPicker and AutoComplete insert paths.
2026-05-21 18:15:12 +02:00
JonKazama-Hellion 80699b27e4 feat(ui): insert map-flag and item-link tokens from chat input 2026-05-21 18:08:49 +02:00
JonKazama-Hellion 3296a12516 style: drop task references from cycle code comments 2026-05-21 14:52:58 +02:00
JonKazama-Hellion 81123ccddf style: apply csharpier formatting to cycle files 2026-05-21 14:46:19 +02:00
JonKazama-Hellion 636a62814f fix(ui): isolate scroll-button state from pop-outs and tidy toolbar
Guard _childScrolledUp writes behind updateScrollState param so pop-out
windows no longer contaminate the main window's scroll state. Widen the
honorific title slot budget when the scroll button is visible, fix stale
comment, and apply csharpier formatting.
2026-05-21 14:43:26 +02:00
JonKazama-Hellion b5aebaad35 fix(ui): keep scroll-to-bottom button on the toolbar row 2026-05-21 14:32:25 +02:00
JonKazama-Hellion bd75f2453c fix(ui): move scroll-to-bottom button into the chat header toolbar
Drop the three-attempt floating overlay entirely. The button now lives in
the chat header toolbar (DrawScrollToBottomToolbarButton), visible only when
the user is scrolled above the live end. Toolbar layout: honorific slot,
scroll button, pop-out button flush-right -- pop-out position unchanged.
2026-05-21 14:22:58 +02:00
JonKazama-Hellion c909d1646b fix(ui): draw scroll-to-bottom button in a standalone overlay window
Button drawn in the parent window over the ##chat2-messages child was never
clickable: ImGui resolves g.HoveredWindow to the child for that screen rect, so
ItemHoverable rejects any item submitted in the parent. A top-level Begin/End
window is a sibling in the window list and wins the hit-test for its own rect.
ownerId parameter keeps the window name distinct between the main window and
each pop-out, preventing Begin/End collisions when both render in the same frame.
2026-05-21 14:10:01 +02:00
JonKazama-Hellion 5781be2e41 feat(ui): pin failed-tell log-message ids and drop discovery logging 2026-05-21 13:46:42 +02:00
JonKazama-Hellion 65fea0e5f5 fix(ui): render scroll-to-bottom button as a parent overlay
The button was drawn inside the ##chat2-messages child via SetCursorPos,
which inflated ContentSize.y / ScrollMaxY each frame (causing positional
drift) and was clipped by the scrollbar's inner clip rect (causing right-
edge cutoff). Move it to the parent window using screen-space coordinates
captured before the child opens; the scroll state is cached inside the
child while GetScrollMaxY/Y still refer to the child's scroll context.
2026-05-21 13:46:42 +02:00
JonKazama-Hellion 3de6e4a3cb feat(ui): add scroll-to-bottom button to the chat log 2026-05-21 13:03:36 +02:00
JonKazama-Hellion e0289962b1 style: remove em-dashes from new code comments 2026-05-21 12:10:17 +02:00
JonKazama-Hellion 95375c8516 feat(ui): auto-focus tab rename and raise buffer to 512 2026-05-21 11:16:53 +02:00
JonKazama-Hellion 36ea8ddcfc feat(ui): add per-tab notification sound for inactive tabs 2026-05-21 10:39:09 +02:00
JonKazama-Hellion 246f0e2511 feat(ui): notify on failed tell via RaptureLogModule hook 2026-05-21 10:00:53 +02:00
JonKazama-Hellion 2e81c42e3b feat(config): bump schema v17 to v18 2026-05-21 09:20:21 +02:00
JonKazama-Hellion a46d89c197 Merge branch 'feature/v1.5.4'
Security / scan (push) Successful in 20s
Build / Build (Release) (push) Successful in 27s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 6s
Release / Build and attach release ZIP (push) Successful in 36s
2026-05-20 16:42:39 +02:00
JonKazama-Hellion 57b6ead003 release(v1.5.4): manifest bump and forge post
Bumps csproj, yaml, repo.json, CHANGELOG, ROADMAP and README in
lock-step to 1.5.4. Forge-post DE-body added with the Polish & Motion
versionsnatur. Slim-rule applied to the yaml and repo.json changelog
blocks (keeps v1.5.4 + v1.5.3 + v1.5.2 + v1.5.1, drops v1.5.0).

A csharpier reflow of two v1.5.4 source files (ChatLogWindow,
HellionStyle) is folded in. preflight.sh blocks A-F all green.
2026-05-20 16:32:42 +02:00
JonKazama-Hellion a42cc2a97e test(selftest): pin v1.5.4 crossfade and quick-picker contracts
ThemeCrossfadeSelfTestStep walks Switch -> crossfade-observed ->
mid-crossfade-switch -> crossfade-end -> restore using
TryGetActiveCrossfade, returns Waiting frame-by-frame and Pass after
the restore concludes. The mid-switch phase fires a second Switch
within ~100ms of the first observed crossfade and asserts the lerped
value is neither identity-from nor identity-to, exercising the
ArmCrossfade mid-flight-origin override.

QuickPickerSelfTestStep verifies the three new resource strings, the
built-in theme floor (>=10), and Config.Tabs non-empty.
2026-05-20 16:21:29 +02:00
JonKazama-Hellion 96ff4ddfd8 feat(ui): lerp sidebar-icon and card-mode-border hover alphas
Sidebar icons ease from 40% to 100% alpha on hover-in via FrameLerp
plus ApplyAlpha. Card-mode borders aggregate row-hover per tab and
lift the border alpha by up to ~+0x70 across every row in that tab.
borderColorAbgr moves into the loop so the per-iteration boost can
apply. ReduceMotion snaps both paths instantly.

Card-hover detection uses IsMouseHoveringRect over the row bounds --
IsItemHovered would only see the 2px spacer dummy below each row.
2026-05-20 14:42:21 +02:00
JonKazama-Hellion 0bfe3a62cb feat: add FrameLerp helper and per-tab hover-alpha fields
FrameLerp.Smooth is the framerate-independent smoothing path -- a
Umbra-style v += (target - v) * factor with the factor clamped to 1
so a stalled frame snaps cleanly instead of overshooting. Tab gets
two NonSerialized fields (_hoverAlpha, _cardHoverAlpha) that the
v1.5.4 render loops drive.
2026-05-20 13:26:16 +02:00
JonKazama-Hellion 01a7f9b4ec feat(ui): add header quick-picker for themes and tabs
Palette button left of the cog opens a two-section popup. The themes
section enumerates AllBuiltIns + AllCustom; the tabs section
enumerates Config.Tabs. The active entry gets a leading check-glyph,
inactive rows a same-width blank so labels stay aligned. Click
selects without closing the popup (DontClosePopups).

Theme click triggers the PM-1 crossfade via ThemeRegistry.Switch;
tab click routes through ChangeTab so LastActivityTime stays
consistent with the sidebar and top-bar click paths.

The header input-width reservation now counts the new button plus
the per-button SameLine spacing -- the old formula dropped the
spacing term and overflowed the row once a third button appeared.
2026-05-20 12:48:31 +02:00
JonKazama-Hellion 0237602ab7 feat(util): add ColourUtil.ApplyAlpha for hover-lerp modulation
Alpha-only modulator for ABGR colors -- RGB stays intact, factor
clamped to [0, 1]. Used by the v1.5.4 PM-3 hover-lerp path.
2026-05-20 11:20:48 +02:00
JonKazama-Hellion a600f014eb i18n: add quick-picker strings and reduce-motion settings toggle
Five new keys across the EN source plus 24 locale variants (DE plus
23 AI-assisted, each carrying the pending-review marker): the header
quick-picker tooltip and two section headers, plus name and
description for a new ReduceMotion checkbox.

ReduceMotion was a config field with no UI -- the checkbox lands in
the Theme & Layout tab's window-style section. Designer.cs hand-edited
as a v1.5.4 block matching the v1.4.8 convention.
2026-05-20 11:07:45 +02:00
JonKazama-Hellion a35067f80a feat(ui): wire ThemeRegistry crossfade into PushGlobal
Switch picks a lerped AbgrCache during the 300ms crossfade window
(ReduceMotion bypass keeps the snap path). Plugin-load init path
switches to SwitchSilent so opening the plugin no longer fades from
the default theme. WindowBg/ChildBg RGBA path stays bound to the
user's per-window opacity override and never fades.

PushGlobal takes the ThemeRegistry as a parameter -- it is an instance
member on Plugin, not static, so the single Plugin.Draw call-site
threads it through alongside the active theme.
2026-05-20 10:36:33 +02:00
JonKazama-Hellion 74b07519f5 feat(themes): arm crossfade state in ThemeRegistry.Switch
Three new private fields plus TryGetActiveCrossfade entry-point, plus
SwitchSilent variant for the plugin-load init path. ArmCrossfade
captures a value-copy of the active AbgrCache and stamps TickCount64;
mid-crossfade Switch composes the current lerped state as the next
fade origin so back-to-back theme switches stay smooth.

Same-slug Switch is a no-op (no identity-crossfade).
2026-05-20 09:26:51 +02:00
JonKazama-Hellion 8dade8c4b2 feat(themes): add ThemeAbgrCacheLerp pure-helper for crossfade
Per-slot ABGR byte-lerp between two cache value-records, stack-allocated
output, t clamped. Pattern anchor: imgui.cpp ImAlphaBlendColors.
2026-05-20 08:57:33 +02:00
JonKazama-Hellion 35e8d3a7fe fix(font): bundled font now actually renders, ship Inter Light, +CJK fallback
Security / scan (push) Successful in 19s
Build / Build (Release) (push) Successful in 29s
Forge Announce / Post changelog to Hellion Forge (push) Successful in 5s
Release / Build and attach release ZIP (push) Successful in 49s
Plugin.cs:937 only pushed RegularFont when Config.FontsEnabled was true.
  FontsAndColours.cs:50 forces FontsEnabled=false whenever UseHellionFont is
  enabled (to hide the chooser UI), so the bundled-font path was silently
  dead and the FFXIV Axis game-font took over. Exo 2 looked "almost right"
  because it overlaps Axis on basic Latin, so the regression went unnoticed
  for the entire v1.5.x series.

  The fix routes RegularFont through draw whenever either FontsEnabled or
  UseHellionFont is on. First-frame HITCH dropped from ~74 ms to ~20 ms
  median (5-reload Linux/Wine sample 17.9-23.6 ms) as a side effect — the
  v1.5.1 "too optimistic" defer-pattern hypothesis was actually a symptom
  of this bug, not bad math.

  Font-stack overhaul on top:
  - Inter Light (Static 18pt-Light, 343 KB, SIL OFL 1.1) replaces Exo 2 as
    the bundled font. Inter ships full Latin Extended-A/B, Greek polytonic
    and Cyrillic Supplement coverage.
  - NotoSansCjkRegular added as a third merge layer for Hangul,
    Simplified-Chinese-specific Han glyphs, and CJK fallbacks the FFXIV
    Japanese font does not ship.
  - Two new ExtraGlyphRanges flags (LatinExtended, Greek) implemented via
    AddChar pair lists in SetUpRanges.
  - Settings.Apply auto-activates the matching ExtraGlyphRanges flag on
    language change. Plugin.LoadAsync runs a one-shot migration that ORs
    in the required flag for an already-selected language.
  - ExtraGlyphRanges CollapsingHeader reachable regardless of
    UseHellionFont (was hidden in the early-return branch).
  - New WarningText below the language combo: FFXIV's chat engine only
    fully supports EN/DE/FR/JA. Other scripts render in the HellionChat
    UI but may garble in in-game chat input/send.

  Localisation wave (originally a FR-only cycle):
  - 24 selectable UI languages. LanguageOverride enum gains 10 new locales
    plus 3 previously commented-out (Italian, Korean, Norwegian with ISO
    code `nb` instead of `no`). All new values append to keep existing
    user-config integer serialisation stable.
  - Resource bundle split: HellionStrings.resx (24 locales, 328 keys) for
    fork-added strings, Language.resx (24 locales, 456 keys) for the
    ChatTwo-Crowdin-heritage. 4 post-sync Crowdin keys backfilled into
    13 legacy locales with per-key AI-assisted comment marker.
  - Em-dash sweep on EN source plus 18 translations. Russian and Ukrainian
    keep their typographic norm.

  Old HellionFont.ttf + HellionFont-OFL.txt removed; Inter-Light.ttf +
  Inter-OFL.txt take their place. Configuration field UseHellionFont keeps
  its name for backwards-compat. Migration v17 stays.
2026-05-19 17:28:48 +02:00
JonKazama-Hellion 38586db9d8 fix(l10n): em-dash sweep across EN source and translations, backfill Crowdin gap
- HellionStrings.resx: 10 in-prose em-dashes -> period/colon per style guide
- 18 HellionStrings.<lang>.resx: 114 mechanical em-dash edits via heuristic
    (period before capital, colon otherwise). Skipped: fr (already clean),
    zh-Hans/zh-Hant (already clean), ru/uk (em-dash is orthographic norm)
- HellionStrings.de.resx: fix substantive-heuristic miss in Wizard_Cancel_Label
- Language.de.resx: add Hellion Forge maintainer header (native-maintained)
- Backfill the 4 post-Crowdin keys (Options_ColorSelectedInputChannelButton_*,
    Options_HideInNewGamePlusMenu_*) into 13 legacy Crowdin locales with
    per-key AI-assisted comment marker. All 23 Language.*.resx now at 456 keys.
2026-05-19 13:52:18 +02:00
101 changed files with 5948 additions and 656 deletions
+9
View File
@@ -0,0 +1,9 @@
---
subtitle: "24 Sprachen, Inter Light statt Exo 2, HITCH 74 → 20 ms"
versionsnatur: "Localisation + Font-Stack"
---
- **24 wählbare UI-Sprachen.** Aus dem ursprünglich nur als FR-Lokalisierung geplanten Cycle ist eine breite Welle geworden: Catalan, Czech, Danish, Dutch, English, Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese (BR), Portuguese (PT), Romanian, Russian, Spanish, Swedish, Turkish, Ukrainian, Simplified Chinese, Traditional Chinese. Dropdown sortiert alphabetisch nach Endonym, „None" oben angepinnt. Nicht-native Übersetzungen sind AI-assisted und für Community-Review im Forge-Discord markiert.
- **Inter Light statt Exo 2 als bundled Schrift.** Plus NotoSansCjkRegular als dritte Merge-Schicht. Damit deckt der Stack Latin Extended-A/B, Greek polytonic, Cyrillic Supplement und CJK (inkl. Hangul, Simplified-Han nach Reform) ab — die nicht-vanilla-FFXIV-Sprachen waren mit Exo 2 nicht lesbar.
- **HITCH 74 → ~20 ms als Side-Effect.** Der UiBuilder-First-Frame-Lag lag seit v1.4.x stabil bei 74 ms; v1.5.1 wollte ihn in Richtung 7 ms ziehen, fiel als „Hypothese zu optimistisch" durch. Echter Grund: `Plugin.cs:937` push'te `RegularFont` nur wenn `FontsEnabled` true war — die „Mitgelieferte Schrift verwenden"-Logik setzte `FontsEnabled = false` mit, der bundled-Pfad war die ganze v1.5.x-Reihe tot, FFXIVs Axis-Font übernahm und kostete ~50 ms extra. Fix routet `RegularFont` jetzt auch über `UseHellionFont`. Median ~20 ms im 5-Reload-Stresstest (17.9-23.6 ms, Linux/Wine; Windows-Baseline steht aus).
- **Glyph-Ranges aktivieren sich automatisch beim Sprachwechsel** plus eine One-Shot-Migration für User die schon eine non-Latin-Sprache eingestellt hatten. Neue WarningText unter dem Sprach-Dropdown weist darauf hin, dass FFXIVs Chat-Engine offiziell nur EN/DE/FR/JA-Glyphen rendert — andere Schriften können in der Game-Eingabe Garbled-Output zeigen.
- **Unter der Haube.** Drei-Layer-Font-Stack, zwei neue ExtraGlyphRanges-Flags (`LatinExtended`, `Greek`), `LanguageOverride`-Enum wächst um zehn Locales plus drei reaktivierte (Italian, Korean, Norwegian mit `nb`). Append-only damit User-Configs stabil bleiben. Migration v17 bleibt.
+9
View File
@@ -0,0 +1,9 @@
---
subtitle: "Theme-Crossfade, Quick-Picker, Hover-Animationen"
versionsnatur: "Polish & Motion"
---
- **Theme-Crossfade.** Theme-Wechsel blenden jetzt sanft über rund 300 ms ineinander, statt hart umzuschalten. Alle Hellion-Flächen gleiten mit: Sidebar, Titel, Buttons, Tabs, Scrollbar, Trennlinien. Der Fenster-Hintergrund snappt bewusst weiter, damit das Per-Window-Deckkraft-Setting aus Dalamuds Pinning-Menü unangetastet bleibt.
- **Header-Quick-Picker.** Neuer Paletten-Button links vom Zahnrad im Chat-Header. Ein Klick öffnet ein kompaktes Popup mit zwei Sektionen: alle Built-in- und Custom-Themes sowie alle Tabs. Der aktive Eintrag trägt ein Häkchen, ein Klick wechselt ohne das Popup zu schließen. So lassen sich mehrere Wechsel hintereinander erledigen, ohne den Umweg über die Einstellungen.
- **Sanfte Hover-Animationen.** Sidebar-Icons faden bei Hover sanft von gedimmt auf volle Deckkraft. Card-Mode-Trennlinien heben sich beim Überfahren einer Zeile für den ganzen Tab dezent ab. Beides framerate-unabhängig gerechnet, also auch bei Wine-Stall-Frames stabil.
- **Bewegung reduzieren.** Neuer Toggle im Tab für Theme und Layout. Er deaktiviert Crossfade, Hover-Animationen und das Pulsieren ungelesener Tabs für alle, die eine statische Oberfläche bevorzugen.
- Drei P3-Items plus der Accessibility-Toggle, kein Schema-Bump, keine Migration. Eine kleine Polish-Welle vor den größeren Cycles.
+11
View File
@@ -0,0 +1,11 @@
---
subtitle: "Backlog-Sync Tab-Features"
versionsnatur: "Bundle-Patch (Hälfte 1 von 2)"
---
- **Fehlgeschlagener Tell.** Geht ein gesendeter Tell nicht durch (Empfänger offline, in einer Instanz oder blockiert), erscheint jetzt ein Warn-Toast statt dass die Systemmeldung durchrauscht. Abschaltbar in den Einstellungen unter Chat.
- **Ton pro Tab.** Jeder Chat-Tab kann einen Benachrichtigungston spielen, wenn eine Nachricht eintrifft, während ein anderer Tab aktiv ist. Zur Wahl stehen die 16 Spiel-Chat-Sounds oder drei mitgelieferte Hellion-Sounds, mit einem Vorhör-Knopf. Standardmäßig aus, hört auf den globalen Sound-Schalter.
- **Tab umbenennen.** Das Umbenennen-Feld im Rechtsklick-Menü fokussiert sich beim Öffnen von selbst und nimmt jetzt bis zu 512 Zeichen.
- **Sprung ans Ende.** In der Chat-Kopfleiste erscheint ein Knopf, sobald man vom aktuellen Ende weggescrollt ist. Ein Klick springt zurück zur jüngsten Nachricht.
- **Karten- und Item-Links.** Kartenmarkierung und verlinktes Item lassen sich aus dem Rechtsklick-Menü der Chat-Eingabe einfügen.
- **Fuchs-Banner.** Das Hellion-Forge-Fuchs-Motiv im Einrichtungs-Assistenten und im Informations-Tab ist jetzt ein echtes Bild statt ASCII-Kunst.
- Schema-Bump auf v18, rein additiv.
+22
View File
@@ -0,0 +1,22 @@
using Dalamud.Interface.Textures;
namespace HellionChat.Branding;
// UI sibling of HellionForgeAscii.FoxMini: the embedded Hellion Forge fox
// banner PNG. Uses ITextureProvider.GetFromManifestResource, a "Get" shared
// texture, so Dalamud owns the cache and lifetime. No manual dispose, no async
// handling in the plugin. Static to mirror HellionForgeAscii (zero injectable
// deps; Plugin.TextureProvider is a static [PluginService]).
internal static class FoxBannerTexture
{
private const string ResourceName = "HellionChat.Branding.fox-banner.png";
// Resolved fresh on every access. Dalamud keeps the shared texture cached
// internally and decodes it asynchronously, so GetWrapOrDefault() returns
// null for the first few frames until the decode finishes.
public static ISharedImmediateTexture Shared =>
Plugin.TextureProvider.GetFromManifestResource(
typeof(FoxBannerTexture).Assembly,
ResourceName
);
}
+3 -10
View File
@@ -1,25 +1,18 @@
namespace HellionChat.Branding;
// Lazy-loaded provenance art that ships embedded with the DLL. Two
// variants:
// Lazy-loaded ASCII art that ships embedded with the DLL.
//
// - FoxBanner: the full-size silhouette with "Hellion Forge" inside
// the body — rendered in the first-run wizard and the Information
// tab as a small "about the makers" anchor.
// - FoxMini: the four-line fox-head + curly-tail that gets stitched
// into the DI-logger bootstrap line so an xllog reader sees the
// same signature on every plugin load.
//
// Both files live as embedded resources under HellionChat.Branding.* so
// the plugin DLL is self-contained no on-disk asset lookup that could
// The file lives as an embedded resource under HellionChat.Branding.* so
// the plugin DLL is self-contained; no on-disk asset lookup that could
// silently miss after a partial deploy.
internal static class HellionForgeAscii
{
private static string? _foxBanner;
private static string? _foxMini;
public static string FoxBanner => _foxBanner ??= Load("HellionChat.Branding.fox-banner.txt");
public static string FoxMini => _foxMini ??= Load("HellionChat.Branding.fox-mini.txt");
private static string Load(string resourceName)
+101 -12
View File
@@ -34,7 +34,7 @@ public class ConfigKeyBind
[Serializable]
public class Configuration : IPluginConfiguration
{
private const int LatestVersion = 17;
private const int LatestVersion = 18;
public int Version { get; set; } = LatestVersion;
@@ -187,6 +187,9 @@ public class Configuration : IPluginConfiguration
public bool CollapseKeepUniqueLinks;
public bool SymbolPickerEnabled = true;
public bool PlaySounds = true;
// Toast when a tell the user sent could not be delivered.
public bool NotifyFailedTell = true;
public bool KeepInputFocus = true;
public int MaxLinesToRender = 2_500; // 1-10000
public bool Use24HourClock = true;
@@ -282,6 +285,7 @@ public class Configuration : IPluginConfiguration
CollapseKeepUniqueLinks = other.CollapseKeepUniqueLinks;
SymbolPickerEnabled = other.SymbolPickerEnabled;
PlaySounds = other.PlaySounds;
NotifyFailedTell = other.NotifyFailedTell;
KeepInputFocus = other.KeepInputFocus;
MaxLinesToRender = other.MaxLinesToRender;
Use24HourClock = other.Use24HourClock;
@@ -443,6 +447,10 @@ public class Tab
public bool AllSenderMessages;
public TellTarget TellTarget = TellTarget.Empty();
// Per-tab notification sound for messages arriving in an inactive tab.
public bool EnableNotificationSound;
public uint NotificationSoundId = 1;
[NonSerialized]
public uint Unread;
@@ -485,6 +493,17 @@ public class Tab
[NonSerialized]
internal string? _cachedTellIcon;
// PM-3 hover-lerp state. Default 0f means "not hovered". Sidebar
// path animates per tab; card-mode-border path is tab-aggregate
// (any card-row hover ramps the alpha for all cards in this tab).
// Lerp speed lives in the render loop, not here, so the same field
// serves both sites at the same animation curve.
[NonSerialized]
internal float _hoverAlpha;
[NonSerialized]
internal float _cardHoverAlpha;
public bool Matches(Message message)
{
if (!message.Matches(SelectedChannels, ExtraChatAll, ExtraChatChannels))
@@ -550,6 +569,8 @@ public class Tab
IsPinned = IsPinned,
AllSenderMessages = AllSenderMessages,
TellTarget = TellTarget.Clone(),
EnableNotificationSound = EnableNotificationSound,
NotificationSoundId = NotificationSoundId,
IsGreeted = IsGreeted,
};
}
@@ -833,17 +854,27 @@ public enum LanguageOverride
French,
German,
Greek,
// Italian,
Japanese,
// Korean,
// Norwegian,
PortugueseBrazil,
Romanian,
Russian,
Spanish,
Swedish,
// v1.5.3: Crowdin-heritage activated and Forge-maintained additions.
// Append-only to preserve serialized integer values of existing user configs.
Italian,
Korean,
Norwegian,
Catalan,
Czech,
Danish,
Finnish,
Hungarian,
Polish,
PortuguesePortugal,
Turkish,
Ukrainian,
}
public static class LanguageOverrideExt
@@ -859,15 +890,24 @@ public static class LanguageOverrideExt
LanguageOverride.French => "Français",
LanguageOverride.German => "Deutsch",
LanguageOverride.Greek => "Ελληνικά",
// LanguageOverride.Italian => "Italiano",
LanguageOverride.Italian => "Italiano",
LanguageOverride.Japanese => "日本語",
// LanguageOverride.Korean => "한국어 (Korean)",
// LanguageOverride.Norwegian => "Norsk",
LanguageOverride.Korean => "한국어",
LanguageOverride.Norwegian => "Norsk bokmål",
LanguageOverride.PortugueseBrazil => "Português do Brasil",
LanguageOverride.Romanian => "Română",
LanguageOverride.Russian => "Русский",
LanguageOverride.Spanish => "Español",
LanguageOverride.Swedish => "Svenska",
LanguageOverride.Catalan => "Català",
LanguageOverride.Czech => "Čeština",
LanguageOverride.Danish => "Dansk",
LanguageOverride.Finnish => "Suomi",
LanguageOverride.Hungarian => "Magyar",
LanguageOverride.Polish => "Polski",
LanguageOverride.PortuguesePortugal => "Português (Portugal)",
LanguageOverride.Turkish => "Türkçe",
LanguageOverride.Ukrainian => "Українська",
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};
@@ -882,17 +922,47 @@ public static class LanguageOverrideExt
LanguageOverride.French => "fr",
LanguageOverride.German => "de",
LanguageOverride.Greek => "el",
// LanguageOverride.Italian => "it",
LanguageOverride.Italian => "it",
LanguageOverride.Japanese => "ja",
// LanguageOverride.Korean => "ko",
// LanguageOverride.Norwegian => "no",
LanguageOverride.Korean => "ko",
LanguageOverride.Norwegian => "nb",
LanguageOverride.PortugueseBrazil => "pt-br",
LanguageOverride.Romanian => "ro",
LanguageOverride.Russian => "ru",
LanguageOverride.Spanish => "es",
LanguageOverride.Swedish => "sv",
LanguageOverride.Catalan => "ca",
LanguageOverride.Czech => "cs",
LanguageOverride.Danish => "da",
LanguageOverride.Finnish => "fi",
LanguageOverride.Hungarian => "hu",
LanguageOverride.Polish => "pl",
LanguageOverride.PortuguesePortugal => "pt-pt",
LanguageOverride.Turkish => "tr",
LanguageOverride.Ukrainian => "uk",
_ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null),
};
// Maps a language to the ExtraGlyphRanges flag required for full UI
// rendering in that locale. The settings save path ORs this into
// Mutable.ExtraGlyphRanges so users do not need to know which range
// to tick manually. Returns 0 for locales fully covered by the default
// ImGui glyph range (Latin-1) or by the separate Japanese font handle.
public static ExtraGlyphRanges RequiredGlyphRanges(this LanguageOverride mode) =>
mode switch
{
LanguageOverride.Korean => ExtraGlyphRanges.Korean,
LanguageOverride.ChineseSimplified => ExtraGlyphRanges.ChineseSimplifiedCommon,
LanguageOverride.ChineseTraditional => ExtraGlyphRanges.ChineseFull,
LanguageOverride.Ukrainian => ExtraGlyphRanges.Cyrillic,
LanguageOverride.Greek => ExtraGlyphRanges.Greek,
LanguageOverride.Czech
or LanguageOverride.Polish
or LanguageOverride.Romanian
or LanguageOverride.Hungarian
or LanguageOverride.Turkish => ExtraGlyphRanges.LatinExtended,
_ => 0,
};
}
[Serializable]
@@ -906,10 +976,23 @@ public enum ExtraGlyphRanges
Korean = 1 << 4,
Thai = 1 << 5,
Vietnamese = 1 << 6,
// v1.5.3: Custom ranges for languages with Latin Extended-A glyphs (Czech,
// Polish, Romanian, Turkish, Hungarian) and Greek polytonic accents.
LatinExtended = 1 << 7,
Greek = 1 << 8,
}
public static class ExtraGlyphRangesExt
{
// Custom (start, end) inclusive pair lists for ranges that ImGui does
// not ship a built-in helper for. SetUpRanges() feeds these into
// ImFontGlyphRangesBuilder.AddChar via the `chars` parameter of
// BuildRange so we avoid the lifetime/pinning question that the native
// GetGlyphRanges*-pointer pathway papers over.
internal static readonly ushort[] LatinExtendedPairs = { 0x0100, 0x024F };
internal static readonly ushort[] GreekPairs = { 0x0370, 0x03FF, 0x1F00, 0x1FFF };
public static string Name(this ExtraGlyphRanges ranges) =>
ranges switch
{
@@ -921,6 +1004,8 @@ public static class ExtraGlyphRangesExt
ExtraGlyphRanges.Korean => Language.ExtraGlyphRanges_Korean_Name,
ExtraGlyphRanges.Thai => Language.ExtraGlyphRanges_Thai_Name,
ExtraGlyphRanges.Vietnamese => Language.ExtraGlyphRanges_Vietnamese_Name,
ExtraGlyphRanges.LatinExtended => Language.ExtraGlyphRanges_LatinExtended_Name,
ExtraGlyphRanges.Greek => Language.ExtraGlyphRanges_Greek_Name,
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
};
@@ -935,6 +1020,10 @@ public static class ExtraGlyphRangesExt
ExtraGlyphRanges.Korean => (nint)ImGui.GetIO().Fonts.GetGlyphRangesKorean(),
ExtraGlyphRanges.Thai => (nint)ImGui.GetIO().Fonts.GetGlyphRangesThai(),
ExtraGlyphRanges.Vietnamese => (nint)ImGui.GetIO().Fonts.GetGlyphRangesVietnamese(),
// LatinExtended and Greek are applied via builder.AddChar in
// FontManager.SetUpRanges, not through a native pointer range.
ExtraGlyphRanges.LatinExtended => 0,
ExtraGlyphRanges.Greek => 0,
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
};
}
+73 -17
View File
@@ -9,7 +9,7 @@ using Dalamud.Plugin;
namespace HellionChat;
// Two LogProxy sites live in static methods (TryGetHellionFontBytes,
// Two LogProxy sites live in static methods (TryGetBundledFontBytes,
// AddFontWithFallback); a ctor-injected ILogger would not be reachable
// from those scopes, so the class stays on Plugin.LogProxy.
//
@@ -62,8 +62,8 @@ public sealed class FontManager : IDisposable
90f,
];
// Hellion font bytes (Exo 2, OFL-1.1); lazily loaded from manifest resources
private static byte[]? HellionFontBytes;
// Bundled UI font bytes (Inter Light, OFL-1.1); lazily loaded from manifest resources
private static byte[]? BundledFontBytes;
public FontManager(IDalamudPluginInterface pluginInterface)
{
@@ -122,7 +122,7 @@ public sealed class FontManager : IDisposable
e.OnPreBuild(tk =>
{
// UseHellionFont swaps the source font but keeps the size
// selector tied to FontSizeV2 (the Hellion font ships as
// selector tied to FontSizeV2 (the bundled font ships as
// a single weight).
var basePt = Plugin.Config.UseHellionFont
? Plugin.Config.FontSizeV2
@@ -130,15 +130,28 @@ public sealed class FontManager : IDisposable
var config = new SafeFontConfig { SizePt = basePt, GlyphRanges = Ranges };
// Missing embedded resource falls back to the configured
// system font instead of taking the whole UiBuilder down.
var hellionBytes = Plugin.Config.UseHellionFont ? TryGetHellionFontBytes() : null;
config.MergeFont = hellionBytes is not null
? tk.AddFontFromMemory(hellionBytes, config, "Hellion-Exo2")
var bundledBytes = Plugin.Config.UseHellionFont ? TryGetBundledFontBytes() : null;
config.MergeFont = bundledBytes is not null
? tk.AddFontFromMemory(bundledBytes, config, "Inter-Light")
: AddFontWithFallback(tk, Plugin.Config.GlobalFontV2.FontId, config, "global");
config.SizePt = Plugin.Config.JapaneseFontV2.SizePt;
config.GlyphRanges = JpRange;
AddFontWithFallback(tk, Plugin.Config.JapaneseFontV2.FontId, config, "japanese");
// v1.5.3: NotoSansCjk fallback covers Hangul, Simplified-Chinese
// -specific Han (e.g. 简) and other CJK glyphs that the primary
// (Inter Light / global font) and the FFXIV Japanese font do not
// ship. Merged last so earlier fonts win for shared codepoints.
config.SizePt = basePt;
config.GlyphRanges = Ranges;
AddFontWithFallback(
tk,
new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
config,
"noto-cjk-fallback"
);
config.SizePt = Plugin.Config.SymbolsFontSizeV2;
tk.AddGameSymbol(config);
@@ -166,6 +179,16 @@ public sealed class FontManager : IDisposable
config.GlyphRanges = JpRange;
AddFontWithFallback(tk, Plugin.Config.JapaneseFontV2.FontId, config, "japanese");
// v1.5.3: NotoSansCjk fallback (see BuildRegularFontHandle).
config.SizePt = Plugin.Config.ItalicFontV2.SizePt;
config.GlyphRanges = Ranges;
AddFontWithFallback(
tk,
new DalamudAssetFontAndFamilyId(DalamudAsset.NotoSansCjkRegular),
config,
"noto-cjk-fallback"
);
config.SizePt = Plugin.Config.SymbolsFontSizeV2;
tk.AddGameSymbol(config);
@@ -187,26 +210,26 @@ public sealed class FontManager : IDisposable
// happen on a signed release build, but a broken csproj or hand-rolled
// dev build can land here. Caller falls back to the system font path
// so the plugin still loads instead of crashing the whole UiBuilder.
private static byte[]? TryGetHellionFontBytes()
private static byte[]? TryGetBundledFontBytes()
{
if (HellionFontBytes is not null)
return HellionFontBytes;
if (BundledFontBytes is not null)
return BundledFontBytes;
using var stream = typeof(FontManager).Assembly.GetManifestResourceStream(
"HellionFont.ttf"
"Inter-Light.ttf"
);
if (stream is null)
{
Plugin.LogProxy.Warning(
"Hellion font resource missing falling back to system default font."
"Bundled Inter Light font resource missing, falling back to system default font."
);
return null;
}
using var ms = new MemoryStream();
stream.CopyTo(ms);
HellionFontBytes = ms.ToArray();
return HellionFontBytes;
BundledFontBytes = ms.ToArray();
return BundledFontBytes;
}
private unsafe void SetUpRanges()
@@ -239,6 +262,18 @@ public sealed class FontManager : IDisposable
builder.AddText("Œœ");
builder.AddText("ĂăÂâÎîȘșȚț");
// v1.5.3: language-dropdown endonyms. The dropdown renders
// with the currently active font range; without these glyphs
// a user on an English UI cannot read non-Latin language names
// before switching. Auto-activation in Settings.Apply then
// pulls in the full ExtraGlyphRange for the chosen locale.
builder.AddText(
"Català Čeština Dansk Deutsch Ελληνικά English Español Suomi"
+ " Français Magyar Italiano 日本語 한국어 Norsk bokmål Nederlands"
+ " Polski Português Brasil (Portugal) Română Русский Svenska"
+ " Türkçe Українська 简体中文 繁體中文"
);
// "Enclosed Alphanumerics" (partial) https://www.compart.com/en/unicode/block/U+2460
for (var i = 0x2460; i <= 0x24B5; i++)
builder.AddChar((char)i);
@@ -248,11 +283,32 @@ public sealed class FontManager : IDisposable
}
var ranges = new List<nint> { (nint)ImGui.GetIO().Fonts.GetGlyphRangesDefault() };
var customChars = new List<ushort>();
foreach (var extraRange in Enum.GetValues<ExtraGlyphRanges>())
if (Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange))
ranges.Add(extraRange.Range());
{
if (!Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange))
continue;
Ranges = BuildRange(null, ranges.ToArray());
// LatinExtended and Greek use AddChar pairs because they have no
// built-in ImGui range helper; everything else points to a native
// ImGui glyph-range table.
switch (extraRange)
{
case ExtraGlyphRanges.LatinExtended:
customChars.AddRange(ExtraGlyphRangesExt.LatinExtendedPairs);
break;
case ExtraGlyphRanges.Greek:
customChars.AddRange(ExtraGlyphRangesExt.GreekPairs);
break;
default:
var ptr = extraRange.Range();
if (ptr != 0)
ranges.Add(ptr);
break;
}
}
Ranges = BuildRange(customChars.Count > 0 ? customChars : null, ranges.ToArray());
JpRange = BuildRange(GlyphRangesJapanese.GlyphRanges);
}
+24 -9
View File
@@ -1,7 +1,7 @@
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
<PropertyGroup>
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
<Version>1.5.2</Version>
<Version>1.5.5</Version>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- Use lock file to pin exact versions -->
@@ -14,7 +14,7 @@
<ItemGroup>
<!-- Closed ranges prevent surprise major bumps during lock file regeneration -->
<PackageReference Include="MessagePack" Version="[3.1.4, 4.0.0)" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.8" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.7" />
<!-- v1.5.0 DI-container foundation; matches Lightless pin (Hosting 10.0.7) -->
<PackageReference
Include="Microsoft.Extensions.DependencyInjection"
@@ -26,6 +26,11 @@
<!-- SQLitePCLRaw override for CVE-2025-6965, CVE-2025-7709 (SQLite >= 3.50.3) -->
<PackageReference Include="SQLitePCLRaw.lib.e_sqlite3" Version="3.50.3" />
<PackageReference Include="morelinq" Version="4.4.0" />
<!-- NAudio.WinMM 2.2.1 MIT - WaveOutEvent/WinMM path is Wine-safe (WaveOut works under Wine,
Media-Foundation-based codecs do not). Using the sub-package avoids pulling in
NAudio.WinForms (which requires WindowsDesktop and does not build on Linux hosts).
WaveOutEvent and WaveFileReader both live in NAudio.WinMM + NAudio.Core. -->
<PackageReference Include="NAudio.WinMM" Version="2.2.1" />
<PackageReference Include="Pidgin" Version="[3.5.1, 4.0.0)" />
<PackageReference Include="SixLabors.ImageSharp" Version="[3.1.12, 4.0.0)" />
</ItemGroup>
@@ -50,16 +55,26 @@
</EmbeddedResource>
</ItemGroup>
<!-- Embedded resources: Hellion font (Exo 2, OFL-1.1) + manifest resource -->
<!-- Embedded resources: bundled UI font (Inter Light, OFL-1.1) + manifest resource -->
<ItemGroup>
<EmbeddedResource Include="Resources\HellionFont.ttf">
<LogicalName>HellionFont.ttf</LogicalName>
<EmbeddedResource Include="Resources\Inter-Light.ttf">
<LogicalName>Inter-Light.ttf</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\HellionFont-OFL.txt">
<LogicalName>HellionFont-OFL.txt</LogicalName>
<EmbeddedResource Include="Resources\Inter-OFL.txt">
<LogicalName>Inter-OFL.txt</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Branding\fox-banner.txt">
<LogicalName>HellionChat.Branding.fox-banner.txt</LogicalName>
<EmbeddedResource Include="Resources\Branding\fox-banner.png">
<LogicalName>HellionChat.Branding.fox-banner.png</LogicalName>
</EmbeddedResource>
<!-- Bundled custom notification sounds, Mono 44.1 kHz 16-bit PCM WAV (Wine-safe) -->
<EmbeddedResource Include="Resources\Sounds\notification-1.wav">
<LogicalName>HellionChat.Sounds.notification-1.wav</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Sounds\notification-2.wav">
<LogicalName>HellionChat.Sounds.notification-2.wav</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Sounds\notification-3.wav">
<LogicalName>HellionChat.Sounds.notification-3.wav</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Branding\fox-mini.txt">
<LogicalName>HellionChat.Branding.fox-mini.txt</LogicalName>
+130 -144
View File
@@ -15,8 +15,8 @@ description: |-
- Per-channel retention with a daily background sweep
- Retroactive cleanup (Ctrl+Shift confirm)
- Export to Markdown, JSON or CSV
- First-run wizard with three preset profiles
- Bilingual UI (EN/DE) with live language switching
- First-run wizard with four preset profiles
- Multi-language UI (24 locales) with live language switching
- Own config and database — no shared state with other plugins
Based on Chat 2 by Infi and Anna (EUPL-1.2).
@@ -35,6 +35,134 @@ tags:
- Replacement
- Privacy
changelog: |-
**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**
A backlog-sync cycle: inherited tab-feature items plus a new fox
banner image and custom notification sounds.
User-visible:
- Failed tells now raise a warning toast when a message you sent
could not be delivered (recipient offline, in an instance, or
blocking you). Toggle in Settings, Chat tab.
- Per-tab notification sound: each tab can play a sound when a
message arrives while you are looking at a different tab. Pick
one of the 16 game chat sounds or one of three bundled Hellion
sounds, with a preview button to hear it. Off by default,
respects the global sound toggle.
- The tab rename field in the right-click menu now focuses
itself when the menu opens and accepts up to 512 characters,
matching the settings-tab rename.
- A jump-to-latest button appears in the chat log header while
you are scrolled up from the live end.
- Map flags and item links can be inserted into the chat input
from its right-click menu.
- The Hellion Forge fox banner in the first-run wizard and the
Information tab is now a real image instead of ASCII art.
Schema bumped to v18 (additive fields only, no data migration).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.5.4 — Polish and Motion (2026-05-20)**
A polish cycle: smoother theme switching, faster theme and tab
access, and subtle hover motion. Three P3 items plus an
accessibility toggle.
User-visible:
- Theme switches now crossfade smoothly over ~300 ms across every
Hellion-rendered surface — sidebar, title, buttons, tabs,
scrollbar, separators. The window background snaps deliberately
so the per-window opacity override from Dalamud's pinning menu
stays untouched.
- New header quick-picker: a palette button left of the cog opens
a compact popup with two sections — every built-in and custom
theme, and every tab. The active entry carries a check glyph;
clicking another switches without closing the popup.
- Sidebar icons ease their opacity on hover, and card-mode message
borders highlight per tab while the cursor is over their rows.
Framerate-independent, so a stalled Wine frame cannot overshoot
the animation.
- New "Reduce motion" toggle in Theme & Layout disables the
crossfade, the hover animations and the unread-tab pulse for
users who prefer a static UI.
Under the hood:
- Two pure-helper lerp paths (ThemeAbgrCacheLerp, FrameLerp) with
xUnit coverage in the Build Suite, plus a ColourUtil.ApplyAlpha
alpha modulator. Two new /xlperf self-test steps pin the
crossfade and quick-picker contracts.
No schema bump, no migration. Migration v17 stays.
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)**
Multi-language pass plus a long-standing first-frame HITCH lands
as a side effect of a font-stack rewrite.
User-visible:
- 24 selectable UI languages (was 2). Catalan, Czech, Danish,
Dutch, English, Finnish, French, German, Greek, Hungarian,
Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese
(BR + PT), Romanian, Russian, Spanish, Swedish, Turkish,
Ukrainian, Simplified + Traditional Chinese. Sorted by endonym,
"None" pinned first. Non-native locales are AI-assisted and
flagged for native-speaker review via the Forge Discord.
- Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The
Inter font ships Latin Extended-A/B, Greek polytonic and
Cyrillic Supplement coverage; NotoSansCjkRegular joins as a
third merge layer for Hangul and Simplified-Han glyphs the
FFXIV Japanese game font does not ship.
- First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that
held since v1.4.x) to a median of ~20 ms (5-reload sample
17.9-23.6 ms, Linux/Wine). The bundled-font path silently
fell back to the FFXIV Axis font for the entire v1.5.x series
because of an early-return in the draw loop. The fix that
routes RegularFont through draw also lands the defer-pattern
win the v1.5.1 cycle was reaching for.
- ExtraGlyphRanges auto-activates on language change. Korean,
ChineseFull and the two new flags (LatinExtended, Greek) toggle
on without a manual visit to Fonts and Colours.
- New WarningText under the language dropdown notes FFXIV's
chat input only fully supports EN/DE/FR/JA character sets.
Other languages render in HellionChat but may garble when
typed into in-game chat.
Under the hood:
- Three-layer font stack: Inter Light primary, FFXIV
JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular
merge 2 for everything else CJK.
- LanguageOverride enum gains ten locales plus three previously
commented out (Italian, Korean, Norwegian as `nb`). New
values append to the enum so existing config integers stay
stable across update.
- Crowdin gap closed: four post-sync ChatTwo keys backfilled
into 13 legacy locales with per-key AI markers.
- Plugin.LoadAsync runs a one-shot migration that ORs in the
matching ExtraGlyphRanges flag for users already on a
non-default language. Settings.Apply auto-activates on
change going forward.
- Em-dash sweep across the EN source and 18 translations to the
house style. Russian and Ukrainian keep the typographic norm.
Migration v17 stays. UseHellionFont users transition from Exo 2
to Inter Light transparently on first reload.
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.5.2 — First-Run Wizard Rework (2026-05-18)**
UX patch. The first-run wizard becomes a four-step flow with a
@@ -85,146 +213,4 @@ changelog: |-
---
**v1.5.1 — FontAtlas Refactor and Hellion Forge Signature (2026-05-17)**
Hybrid FontManager refactor plus an embedded provenance mark.
What changes under the hood:
- FontManager handle creation moves into the ctor inside a single
atlas.SuppressAutoRebuild() block. The font atlas now builds once
per plugin load instead of four to five times — less CPU and GPU
pressure in the first seconds after a reload, less atlas texture
memory churn.
- Hybrid property model: Axis, AxisItalic and FontAwesome become
init-only handles. RegularFont and ItalicFont stay mutable because
the eight font settings still need to replace them at runtime —
that path is funnelled through RebuildDelegateFonts() now and
runs without a plugin reload.
- FontAwesome reuses Dalamud's UiBuilder.IconFontFixedWidthHandle
instead of building its own atlas slot. One delegate-build step
less in the ctor.
- BuildFontsAsync and BuildFonts are removed; the live mutation
path is RebuildDelegateFonts() now.
- Two FontManager self-test steps registered with /xlperf: ctor
smoke (every handle non-null after Phase-1 resolve, no atlas
load-exception) and push smoke (Push() returns without throwing).
Honorific full-gradient port (originally the v1.5.1 main item) was
dropped: Honorific 3.2 exposes no IPC for the rendered gradient
frame, and an in-plugin port of the colour palette was declined.
The integration stays at the v1.4.7 glow-only shape.
User-visible:
- Hellion Forge signature: a small fox-head ASCII silhouette is
emitted to /xllog on every plugin load, and a full fox banner
with "Hellion Forge" set inside the body is available as a
folded TreeNode in the First-Run Wizard and Settings ->
Information tab. Drawn by Julia Moon, embedded in the plugin DLL.
- No settings changes, no migration. v17 stays.
Note on performance: the cross-plugin baseline target from v1.5.0
(matching Lightless and XIVInstantMessenger at ~7 ms HITCH) did
not land this cycle. HITCH stays around 80 ms because the cost is
in the UiBuilder first-frame render path, not in the atlas build
(which this cycle did reduce from 4-5 builds per load to 1). A
first-frame render investigation is reserved for a later cycle.
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.5.0 — DI Foundation and Service Refactor (2026-05-17)**
Major architecture cycle. The plugin bootstrap moves to a
generic-host DI container (Microsoft.Extensions.Hosting +
IServiceCollection) modelled on Lightless Sync. Service logging
moves from a static Plugin.LogProxy locator to typed
Microsoft.Extensions.Logging.ILogger<T> via constructor injection,
bridged over Dalamud's IPluginLog by a custom DalamudLogger trio.
What changes under the hood:
- 18 instance-class services migrate to ILogger<T> via constructor
injection across four slices: data layer (MessageStore,
MessageManager, AutoTellTabsService), IPC and integrations
(HonorificService, IpcManager, TypingIpc, ExtraChat, the three
GameFunctions classes), UI window layer (ChatLogWindow,
DbViewer, Popout, three settings tabs), and root (Commands,
ThemeRegistry, PayloadHandler).
- Plugin.LogProxy stays in place for the eight buckets ctor
injection cannot reach: static helpers (EmoteCache,
AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-reflected
types (Configuration), the Message data class, and instance
classes that only log from static methods (FontManager, one
GameFunctions site).
- Plugin.cs finishes at 1012 lines — virtually identical to the
pre-cycle 1013. The new Phase-1 host build and Plugin.X bridge
wiring trade out exactly the service and window allocations
that previously lived in LoadAsync.
- Cross-plugin baseline confirms no performance penalty against
Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2
74 ms median. Lightless and XIVInstantMessenger sit around
7 ms by deferring their font-atlas build past Finished
loading — that pattern is the v1.5.1 follow-up.
User-visible:
- Slash-command insert fix: pasting a slash command into the
chat input (Friend List "/tell" action, plugin-driven inserts
from Artisan, AllaganTools etc.) now replaces the existing
input instead of concatenating. Cherry-picked from ChatTwo
upstream ee7768ac with namespace adaptation.
Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)**
Eleventh and final sub-patch of the v1.4.x polish-sweep series.
Symbol picker for the chat input, a tell-history reload fix for
users with many active partners, and a closing cleanup sweep
before v1.5.0 picks up the DI-container adoption.
- Symbol picker: a small smile-icon button left of the channel
indicator opens a popup with two tabs. The first lists all 161
FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second
carries 97 server-verified BMP symbols (latin marks, currency,
the full Greek alphabet, geometric shapes, suits, notes) —
every one of them round-tripped through /echo and /say in a
four-round probe so the in-channel render matches what the
picker shows. Click drops the glyph at the caret, multi-insert
keeps the popup open, and a recent-used strip floats the last
sixteen picks across both tabs. Toggle in Settings → Chat →
Message behaviour, default on.
- Pinned auto-tell tabs reload their full history again: a
hidden 500-row scan cap in PreloadHistory used to override the
user-configurable AutoTellTabsHistoryPreload setting, so
less-frequent pinned partners (rare /tell sessions in an
otherwise busy week) lost their backlog. The cap is removed;
the (Receiver, Date) index keeps SQL fast, the client-side
loop still respects your setting as the upper bound.
- Slash-command teardown: /hellion, /hellionView,
/hellionDebugger (and #if DEBUG /hellionSeString) wrappers are
now cached as private fields. Plugin teardown detaches the
live registration instead of re-Register'ing with identical
args — closes a latent maintenance hazard from v1.4.9.
- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render
refactor that was on the v1.4.10 reserve list got dropped
after cross-platform smoke showed the scroll rubber-band is a
Wine / Linux render-pipeline quirk, not universal — Windows
users never saw it. It will get its own platform-targeted
spike in a later patch. Next major cycle is v1.5.0 with the
DI-container adoption (Microsoft.Extensions.Hosting +
ILogger<T>) modelled on Lightless.
- Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
@@ -1,4 +1,5 @@
using Dalamud.Plugin;
using HellionChat.Integrations;
using HellionChat.Ipc;
using HellionChat.Themes;
using Microsoft.Extensions.Hosting;
@@ -19,7 +20,7 @@ internal sealed class ThemeRegistryInitHostedService(ThemeRegistry registry) : I
// warm cache; otherwise the first Switch falls through to the built-in
// default when Config.Theme points at a custom slug.
foreach (var _ in registry.AllCustom()) { }
registry.Switch(Plugin.Config.Theme);
registry.SwitchSilent(Plugin.Config.Theme);
return Task.CompletedTask;
}
@@ -85,3 +86,18 @@ internal sealed class AutoTellTabsServiceInitHostedService(AutoTellTabsService s
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
// Eager-resolve trigger: resolving FailedTellNotifier in this adapter's ctor
// enables its game hook during host startup. StartAsync itself is a no-op.
internal sealed class FailedTellNotifierInitHostedService(FailedTellNotifier notifier)
: IHostedService
{
// No-op adapter: the ctor dependency above is the actual eager-resolve
// trigger. Field kept to match the IpcManager/TypingIpc/ExtraChat no-op
// adapters and to avoid the CS9113 unread-parameter warning.
private readonly FailedTellNotifier _notifier = notifier;
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
@@ -0,0 +1,146 @@
using System;
using System.IO;
using Microsoft.Extensions.Logging;
using NAudio.Wave;
namespace HellionChat.Integrations;
// Plays the three bundled WAV notification sounds via NAudio WaveOutEvent.
// WaveOutEvent/WinMM is the correct backend for FFXIV on Wine: it works
// without Media Foundation (which Wine does not support for MP3/AAC).
//
// Volume is fixed at 0.8. No per-user slider in this iteration so we can
// ship quickly and gather feedback before adding UX complexity.
internal sealed class CustomAudioPlayer : IDisposable
{
// Sound bytes are read once at construction so each Play() wraps a fresh
// MemoryStream rather than re-reading the manifest stream (which becomes
// unreadable after the first read and would require Seek support).
private readonly byte[][] _soundData;
private readonly ILogger<CustomAudioPlayer> _logger;
private WaveOutEvent? _outputDevice;
private WaveFileReader? _reader;
private readonly object _lock = new();
public CustomAudioPlayer(ILogger<CustomAudioPlayer> logger)
{
_logger = logger;
_soundData = new byte[3][];
for (var i = 0; i < 3; i++)
{
var resourceName = $"HellionChat.Sounds.notification-{i + 1}.wav";
using var stream = typeof(CustomAudioPlayer).Assembly.GetManifestResourceStream(
resourceName
);
if (stream is null)
{
_logger.LogWarning(
"Embedded sound resource not found: {Resource}. "
+ "Custom sound {Index} will be silent.",
resourceName,
i + 1
);
_soundData[i] = Array.Empty<byte>();
continue;
}
using var ms = new MemoryStream();
stream.CopyTo(ms);
_soundData[i] = ms.ToArray();
}
}
// customIndex is 1, 2, or 3, matching the sound file suffix.
// Stops any currently playing sound before starting the new one.
// NAudio playback runs on its own thread; this method returns immediately.
public void Play(int customIndex)
{
if (customIndex < 1 || customIndex > 3)
{
_logger.LogWarning(
"CustomAudioPlayer.Play called with out-of-range index {Index}",
customIndex
);
return;
}
var data = _soundData[customIndex - 1];
if (data.Length == 0)
{
_logger.LogWarning(
"Sound data for index {Index} is empty; skipping playback",
customIndex
);
return;
}
lock (_lock)
{
try
{
StopCurrent();
var ms = new MemoryStream(data, writable: false);
_reader = new WaveFileReader(ms);
_outputDevice = new WaveOutEvent();
// Init opens the device and creates the WinMM handle. Volume
// must be set after Init, otherwise waveOutSetVolume fails with
// InvalidHandle.
_outputDevice.Init(_reader);
_outputDevice.Volume = 0.8f;
_outputDevice.Play();
}
catch (Exception ex)
{
_logger.LogWarning(
ex,
"Failed to play custom notification sound {Index}",
customIndex
);
StopCurrent();
}
}
}
// Stops and tears down the active WaveOutEvent + WaveFileReader without
// throwing. Called on Play (to interrupt previous sound) and from Dispose.
// Guards Stop() with a PlaybackState check because waveOutReset blocks even
// when playback already finished; under Wine this can stall the WinMM
// callback thread if many sounds arrive in quick succession.
private void StopCurrent()
{
try
{
if (_outputDevice?.PlaybackState == PlaybackState.Playing)
_outputDevice.Stop();
_outputDevice?.Dispose();
_outputDevice = null;
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Exception while stopping current WaveOutEvent");
}
try
{
_reader?.Dispose();
_reader = null;
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Exception while disposing WaveFileReader");
}
}
// At plugin unload the PendingMessageThread is already cancelled and the
// draw loop is gone, so _lock is uncontended here. Calling StopCurrent
// outside the lock avoids holding it across the blocking waveOutReset /
// WaveOutEvent.Dispose, which can freeze on Wine during unload.
public void Dispose()
{
StopCurrent();
}
}
@@ -0,0 +1,74 @@
using System;
using Dalamud.Hooking;
using Dalamud.Interface.ImGuiNotification;
using FFXIVClientStructs.FFXIV.Client.System.String;
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
using HellionChat._Helpers;
using HellionChat.Resources;
using HellionChat.Util;
using Microsoft.Extensions.Logging;
namespace HellionChat.Integrations;
// A minimal, failed-tell-specific game hook. A locale-robust "tell failed"
// signal is not reachable over the processed message stream (Message carries
// no LogMessage row id, ChatCode 60 is too broad). This hooks the one
// ShowLogMessageString overload and toasts on a pinned id set. It is NOT the
// broad ad-block hook layer.
internal sealed class FailedTellNotifier : IDisposable
{
private readonly ILogger<FailedTellNotifier> _logger;
private readonly Hook<RaptureLogModule.Delegates.ShowLogMessageString>? _hook;
public unsafe FailedTellNotifier(ILogger<FailedTellNotifier> logger)
{
_logger = logger;
// Creating/enabling a hook is safe off the framework thread (the
// ctor runs during host startup on the framework thread,
// eager-resolved via FailedTellNotifierInitHostedService).
_hook =
Plugin.GameInteropProvider.HookFromAddress<RaptureLogModule.Delegates.ShowLogMessageString>(
RaptureLogModule.MemberFunctionPointers.ShowLogMessageString,
ShowLogMessageStringDetour
);
_hook.Enable();
}
private unsafe void ShowLogMessageStringDetour(
RaptureLogModule* module,
uint logMessageId,
Utf8String* value
)
{
try
{
if (
FailedTellMatcher.ShouldNotify(
logMessageId,
Plugin.Config.NotifyFailedTell,
FailedTellMatcher.FailedTellLogMessageIds
)
)
{
var recipient = value is null ? string.Empty : value->ToString();
var content = string.IsNullOrEmpty(recipient)
? HellionStrings.FailedTell_Notification_Generic
: string.Format(HellionStrings.FailedTell_Notification_Named, recipient);
WrapperUtil.AddNotification(content, NotificationType.Warning);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "FailedTellNotifier detour threw");
}
_hook!.Original(module, logMessageId, value);
}
public void Dispose()
{
_hook?.Disable();
_hook?.Dispose();
}
}
+45
View File
@@ -7,7 +7,9 @@ using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Hooking;
using Dalamud.Interface.ImGuiNotification;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
using HellionChat._Helpers;
using HellionChat.Code;
using HellionChat.Resources;
using HellionChat.Util;
@@ -330,6 +332,7 @@ internal class MessageManager : IAsyncDisposable
Store.UpsertMessage(message);
var currentMatches = Plugin.CurrentTab.Matches(message);
uint? notificationSound = null;
foreach (var tab in Plugin.Config.Tabs)
{
var unread = !(
@@ -337,7 +340,49 @@ internal class MessageManager : IAsyncDisposable
);
if (tab.Matches(message))
{
tab.AddMessage(message, unread);
// Per-tab notification sound. Fire once for the first inactive
// tab that wants it, keeping a message matching several
// background tabs from stacking sounds.
// TEST-MIRROR: ../_Helpers/TabSoundDecision.cs
if (
notificationSound is null
&& TabSoundDecision.ShouldPlay(
Plugin.CurrentTab == tab,
tab.EnableNotificationSound,
Plugin.Config.PlaySounds
)
)
{
notificationSound = tab.NotificationSoundId;
}
}
}
if (notificationSound is { } soundId)
{
if (soundId is >= 1 and <= 16)
{
// ProcessMessage runs on the PendingMessageThread worker; the native
// UIGlobals.PlaySoundEffect must be marshalled onto the framework
// thread (reference_dalamud_framework_thread).
Plugin.Framework.RunOnFrameworkThread(() =>
{
unsafe
{
UIGlobals.PlaySoundEffect(soundId);
}
});
}
else if (soundId >= 17)
{
// Custom bundled sounds (ids 17-19) go through NAudio WaveOutEvent.
// NAudio manages its own playback thread, so no framework marshalling needed.
Plugin.CustomAudioPlayer.Play((int)soundId - 16);
}
// soundId == 0 (hand-edited config) falls through: plays nothing.
}
MessageProcessed?.Invoke(message);
+30 -6
View File
@@ -115,6 +115,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
internal Themes.ThemeRegistry ThemeRegistry { get; private set; } = null!;
internal Ui.StatusBar StatusBar { get; private set; } = null!;
internal Integrations.HonorificService HonorificService { get; private set; } = null!;
internal Integrations.CustomAudioPlayer CustomAudioPlayer { get; private set; } = null!;
// Platform indirection over Dalamud.Utility.Util. Wired in Phase-1 ctor so
// any service allocated in LoadAsync can read Plugin.PlatformUtil.
@@ -198,10 +199,12 @@ public sealed class Plugin : IAsyncDalamudPlugin
// point (MigrateFromChatTwoLayout, LanguageChanged, ImGuiUtil.Initialize)
// do not touch either static, so the brief null-window is safe.
// Schema gate: v1.4.x requires config v16+. Users on older schemas
// must install v1.4.2 first to run the migration chain. v17 adds
// Tab.IsPinned (additive, no data migration needed) so v16 configs
// load cleanly and get their Version stamp bumped after the gate.
// Schema gate: v1.4.x+ requires config v16+. Users on older schemas
// must install v1.4.2 first to run the migration chain. v18 adds the
// per-tab EnableNotificationSound + NotificationSoundId fields and the
// top-level NotifyFailedTell flag, all additive with defaults, so
// v16/v17 configs load cleanly and get their Version stamp bumped
// after the gate.
if (Config.Version < 16)
{
throw new InvalidOperationException(
@@ -209,13 +212,24 @@ public sealed class Plugin : IAsyncDalamudPlugin
+ "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.10."
);
}
Config.Version = 17;
Config.Version = 18;
// Unpinned TempTabs are session-only and dropped on every load. Pinned
// TempTabs survive reload — Jin's tester feedback (v1.4.7).
Config.Tabs.RemoveAll(TabLifecycleHelpers.ShouldStripOnLoad);
LanguageChanged(Interface.UiLanguage);
// v1.5.3 migration: Settings.Apply auto-activates the matching
// ExtraGlyphRanges flag on a language CHANGE; a config that already
// has e.g. Czech selected from a previous version never goes through
// that path. ORing in the required flag here lets the first atlas
// build pick it up, so an upgrade from v1.5.2 renders correctly
// without forcing the user to toggle the language twice.
var requiredRanges = Config.LanguageOverride.RequiredGlyphRanges();
if (requiredRanges != 0 && !Config.ExtraGlyphRanges.HasFlag(requiredRanges))
Config.ExtraGlyphRanges |= requiredRanges;
ImGuiUtil.Initialize(this);
DeferredSaveFrames = -1;
@@ -273,6 +287,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
TypingIpc = _host.Services.GetRequiredService<TypingIpc>();
ExtraChat = _host.Services.GetRequiredService<ExtraChat>();
HonorificService = _host.Services.GetRequiredService<Integrations.HonorificService>();
CustomAudioPlayer = _host.Services.GetRequiredService<Integrations.CustomAudioPlayer>();
StatusBar = _host.Services.GetRequiredService<Ui.StatusBar>();
MessageManager = _host.Services.GetRequiredService<MessageManager>();
AutoTellTabsService = _host.Services.GetRequiredService<AutoTellTabsService>();
@@ -319,9 +334,12 @@ public sealed class Plugin : IAsyncDalamudPlugin
SelfTestRegistry.RegisterTestSteps([
new SelfTests.ThemeSwitchSelfTestStep(this),
new SelfTests.ThemeCrossfadeSelfTestStep(this),
new SelfTests.FontManagerCtorSmokeStep(this),
new SelfTests.FontPushSmokeStep(this),
new SelfTests.WizardStateSmokeStep(this),
new SelfTests.QuickPickerSelfTestStep(this),
new SelfTests.FoxBannerTextureSmokeStep(this),
]);
// Re-surface the wizard for existing users when a major UX
@@ -901,6 +919,7 @@ public sealed class Plugin : IAsyncDalamudPlugin
// Theme engine is always active; Classic is a theme, not a disabled state.
using IDisposable _style = HellionStyle.PushGlobal(
ThemeRegistry.Active,
ThemeRegistry,
Config.WindowOpacity
);
@@ -934,7 +953,12 @@ public sealed class Plugin : IAsyncDalamudPlugin
// RegularFont is nullable only because the live rebuild path
// disposes it before reassigning; both ends of that swap happen on
// this same draw thread, so it cannot be null here.
using ((Config.FontsEnabled ? FontManager.RegularFont! : FontManager.Axis).Push())
// v1.5.3 fix: also push RegularFont when the bundled Inter Light is
// selected. Without this, UseHellionFont=true silently fell back to
// the FFXIV Axis font because FontsAndColours forces FontsEnabled
// off in that branch, and the bundled font never made it into draw.
var useRegularFont = Config.FontsEnabled || Config.UseHellionFont;
using ((useRegularFont ? FontManager.RegularFont! : FontManager.Axis).Push())
WindowSystem.Draw();
ChatLogWindow.FinalizeFrame();
+11
View File
@@ -107,6 +107,12 @@ internal static class PluginHostFactory
sp.GetRequiredService<ILogger<Integrations.HonorificService>>(),
sp.GetRequiredService<IFramework>()
));
services.AddSingleton(sp => new Integrations.FailedTellNotifier(
sp.GetRequiredService<ILogger<Integrations.FailedTellNotifier>>()
));
services.AddSingleton(sp => new Integrations.CustomAudioPlayer(
sp.GetRequiredService<ILogger<Integrations.CustomAudioPlayer>>()
));
services.AddSingleton(sp => new MessageManager(
sp.GetRequiredService<Plugin>(),
@@ -172,6 +178,11 @@ internal static class PluginHostFactory
services.AddHostedService(sp => new AutoTellTabsServiceInitHostedService(
sp.GetRequiredService<AutoTellTabsService>()
));
services.AddHostedService(
sp => new Infrastructure.Hosting.FailedTellNotifierInitHostedService(
sp.GetRequiredService<Integrations.FailedTellNotifier>()
)
);
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 419 KiB

@@ -1,68 +0,0 @@
.:;+xXXX$$$$$$$$XXx+;:
.X$+ .;+X$$$$$$$$$$$$$$$$$$$$$$$$$$$x:
;$xx$$X+:... .....::+X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;.
X$; .:+xXXX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X:
$$; :++xX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X;
$$x. .+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X.
x$$; ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+;::::::;x$$$$$:
:$$$; .+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+:. .+$$$$$$$$$X+;;:
;$$$+. :X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X;: :$$$$$$$$$$$$$$$$X;.
.+$$$X: ..;X$$$$$$$$$$$$$$$$$$$$$$$$$$X;.. :$$$$$$$$$$$$$$$$$$$$X:
;$$$$$X+::::+X$$$$$$$$$$$$$$$$$$$$$X;. .$$$$$$$$$$$$$$$$$$$$$$$X;
+$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+: Hellion Forge x$$$$$$$$$$$$$$$$$$$$$$$$$X:
.;x$$$$$$$$$$$$$$$$$$$$$x;: .X$$$$$$$$$$$$$$$$$$$$$$$$$$$+
.;+$$$$$$$$$$X+;:.. .X$$$$$$$$$$$$$$$$$$$$$$$$$$$$+
.X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;
.X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X
x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X
;$$$$$$xx$$$$$$$$$$$$$$$$$$$$$x
.$$$$$$x+$$$$$$$$$$$$$$$$$$$$$x
:+X$$$$$$X;$$$$$$$$$$$$$$$$$$$$$$:
;$$$$$$$$$$;$$$$$$$$$$$$$$$$$$$$$$X.
+$$$$$$$$$$;x$$$$$$$$$$$$$$$$$$$$$$+
x$$$$$$$$$$:$$$$$$$$$$$$$$$$$$$$$$X:
.X$$$$$$$$$.:$$$$$$$$$$$$$$$$$$$$$$;
:X$$X;;;;: .$$$$$$$$$$$$$$$$$$$$$$X.
.$$$$X .$$$$$$$$$$$$$$$$$$$$$$$:
.$$$$+ .X$$$$$$$$$$$$$$$$$$$$$$;
;$$$$: .X$$$$$$$$$$$$$$$$$$$$$$x
:X$$$+ .$$$$$$$$$$$$$$$$$$$$$$$X
+$$$x :$$$$$$$$$$$$$$$$$$$$$$$X
;$$X: $$$$$$$$$$$$$$$$$$$$$$$$X
x$$$$$$$$$$$$$$$$$$$$$$$$X
+$$$$$$$$$$$$$$$$$$$$$$$$$+
.+$$$$$$$$$$$$$$$$$$$$$$$$$$;
. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$:
:X$x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.XX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+$;
.. ++X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$:+$:
:$$+. ;$$$$$$$$$$$$$$X$$$$$$$$$$$$$$$$$$$$$;:$$+
.x+X$X: X$$$$$$$$$$x::;:;$$$$$$$$$$$$$$$$$$X: ;$X.
:X.x$$$:.::::::;x+:X$$$$;$$$$$$$$$$$$$$$$$$: :X;
:x.x$$$$$$$$$$$$$$$$$;;$:$$$$$$$$$$$$$$$$$: :$+
:Xx$$$$$$$$$$$$$$$$$: ;X;$$$$$$$$$$$$$$$$: .+$$;
;$$$$$$$$$$$$$$$$$$; .X+X$$$$$$$$$$$$$$$+ .+$+.
+$$$$$$$$$$$$$$$$$$$$$$$;+$$$$$$$$$$$$$$X: .+X:
+$$$$$$$$$$$$$$$$$$$$$$$$$+:$$$$$$$$$$$$$+.+$+.
;$$$$$$$$$$$$$$$$$$$$$$$$$$$X;$$$$$$$$$$$$$$X:
+X: .:X$$$$$$$$x+++x$$$$$$$$;:X$$$$$$$$$$$X:
:x.;$;+$$$$$:. :X$$$$X :$$$$$$$$$$X:
;x :X$$$; .x$$x X$$; .:+.$$$$$$$$$$x
xx.X$$X: X$;.:$X:.X$$$$$$$$$:
+$$$$X. ;$;::: .$$$$$$$$$:
;$$$; :+X$$$$XX$; X$$$$$$$$:
;$$X: .:x$x$$$$$X. x$$$$$$$$:
:X$X: :+x; :$$$$$: +$$$$$$$X:
:++$X+xXX;. +$$$$. +$$$$$$$+.
... .X$$$X. +$$$$$$$:
;$$$$; .X$$$$$$x.
;$$X; :X$$$$$$;
;$$$$$$x.
.X$$$$$$;
;$$$$$$+
+$$$$$;
:X$$$$;.
;$$$$+.
.x$$$X:
.+$$X;
Binary file not shown.
+26
View File
@@ -283,6 +283,7 @@ internal class HellionStrings
internal static string Settings_General_Audio_Heading => Get(nameof(Settings_General_Audio_Heading));
internal static string Settings_General_Performance_Heading => Get(nameof(Settings_General_Performance_Heading));
internal static string Settings_General_Language_Heading => Get(nameof(Settings_General_Language_Heading));
internal static string Settings_Language_FFXIVCoverage_Warning => Get(nameof(Settings_Language_FFXIVCoverage_Warning));
// Hellion Chat — Appearance-Tab section headings
internal static string Settings_Appearance_Theme_Heading => Get(nameof(Settings_Appearance_Theme_Heading));
@@ -443,4 +444,29 @@ internal class HellionStrings
internal static string DbViewer_FullTextToggle => Get(nameof(DbViewer_FullTextToggle));
internal static string DbViewer_FullTextToggle_Hint_Indexing => Get(nameof(DbViewer_FullTextToggle_Hint_Indexing));
internal static string DbViewer_FullTextToggle_Hint_PhraseMode => Get(nameof(DbViewer_FullTextToggle_Hint_PhraseMode));
// Hellion Chat — v1.5.4 header quick-picker + reduce-motion toggle
internal static string Settings_QuickPicker_Tooltip => Get(nameof(Settings_QuickPicker_Tooltip));
internal static string Settings_QuickPicker_Themes_Header => Get(nameof(Settings_QuickPicker_Themes_Header));
internal static string Settings_QuickPicker_Tabs_Header => Get(nameof(Settings_QuickPicker_Tabs_Header));
internal static string Settings_ThemeAndLayout_ReduceMotion_Name => Get(nameof(Settings_ThemeAndLayout_ReduceMotion_Name));
internal static string Settings_ThemeAndLayout_ReduceMotion_Description => Get(nameof(Settings_ThemeAndLayout_ReduceMotion_Description));
// Failed-tell notification
internal static string FailedTell_Notification_Generic => Get(nameof(FailedTell_Notification_Generic));
internal static string FailedTell_Notification_Named => Get(nameof(FailedTell_Notification_Named));
internal static string Settings_Chat_NotifyFailedTell_Name => Get(nameof(Settings_Chat_NotifyFailedTell_Name));
internal static string Settings_Chat_NotifyFailedTell_Description => Get(nameof(Settings_Chat_NotifyFailedTell_Description));
// Per-tab notification sound
internal static string Tabs_NotificationSound_Enable_Name => Get(nameof(Tabs_NotificationSound_Enable_Name));
internal static string Tabs_NotificationSound_Description => Get(nameof(Tabs_NotificationSound_Description));
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));
// Scroll-to-bottom and item/flag linking
internal static string ChatLog_ScrollToBottom_Tooltip => Get(nameof(ChatLog_ScrollToBottom_Tooltip));
internal static string ChatLog_Insert_MapFlag => Get(nameof(ChatLog_Insert_MapFlag));
internal static string ChatLog_Insert_ItemLink => Get(nameof(ChatLog_Insert_ItemLink));
}
+27 -3
View File
@@ -223,7 +223,7 @@
<value>Torna a mostrar l'assistent</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Més tard conserva els valors per defecte</value>
<value>Més tard: conserva els valors per defecte</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Tanca l'assistent sense seleccionar cap perfil. Els valors per defecte del plugin seguiran actius i l'assistent tornarà a aparèixer en la propera càrrega del plugin.</value>
@@ -385,10 +385,10 @@
<value>Quant d'opaques són les finestres del plugin. Valors més baixos deixen veure el joc per darrere; els camps de formulari i els diàlegs es mantenen completament opacs i llegibles al damunt.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Utilitza la font Hellion inclosa (Exo 2)</value>
<value>Usa Inter Light inclòs</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderitza el xat i la interfície en Exo 2 (SIL Open Font License 1.1), que s'inclou amb el plugin. Desactiva-ho per tornar a la font seleccionada a Configuració → Font.</value>
<value>Mostra el xat i la interfície en Inter Light (llicència SIL Open Font 1.1), inclosa al connector. Desactiva per tornar al tipus de lletra seleccionat a Configuració → Tipus de lletra.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Cerca la frase exacta. Les consultes de diverses paraules coincideixen només quan les paraules apareixen juntes en ordre. Per utilitzar la sintaxi MATCH de FTS5 directament, posa el terme entre cometes dobles tu mateix.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat mostra les 24 llengües, però l'entrada de xat de FFXIV només admet completament EN, DE, FR i JA. Altres alfabets poden mostrar-se com a caràcters incorrectes en escriure al xat del joc o en enviar missatges.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Selector ràpid de temes i pestanyes</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temes</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Pestanyes</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Redueix el moviment</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Desactiva la transició de temes, les animacions en passar el cursor per la barra lateral i les targetes, i la pulsació de pestanyes no llegides. Els canvis de tema i els estats de cursor s'apliquen a l'instant.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+34 -11
View File
@@ -19,7 +19,7 @@
<value>Zapnout filtr soukromí</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>Když je zapnutý, do databáze se ukládají jen zprávy z povolených kanálů. Když je vypnutý, platí výchozí chování ukládá se vše kromě bojových logů.</value>
<value>Když je zapnutý, do databáze se ukládají jen zprávy z povolených kanálů. Když je vypnutý, platí výchozí chování: ukládá se vše kromě bojových logů.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>Filtr ovlivňuje jen to, co se zapíše do lokální databáze. V chatu se pořád zobrazují všechny zprávy živě, vyloučené kanály se prostě přestanou ukládat. Chceš-li kanály odstranit i z viditelného zobrazení, použij normální filtry chat-záložek ve hře.</value>
@@ -82,7 +82,7 @@
<value>Ruční spuštění používá tvoji ULOŽENOU zásadu uchovávání, ne hodnoty posuvníků výše. Klikni nejdřív na Uložit, chceš-li použít aktuální změny.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Náhled je zastaralý tvoje whitelist se od posledního obnovení změnila. Klikni na Obnovit a přepočítej.</value>
<value>Náhled je zastaralý: tvoje whitelist se od posledního obnovení změnila. Klikni na Obnovit a přepočítej.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Obnovit náhled</value>
@@ -133,7 +133,7 @@
<value>Automaticky mazat zprávy po vypršení doby uchovávání kanálu</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Když je zapnuté, zprávy starší než nastavené okno se mažou při každém spuštění pluginu (nejvýše jednou za 24 hodin). Výchozí stav je VYPNUTO plugin bez tvého výslovného souhlasu nic nesmaže.</value>
<value>Když je zapnuté, zprávy starší než nastavené okno se mažou při každém spuštění pluginu (nejvýše jednou za 24 hodin). Výchozí stav je VYPNUTO: plugin bez tvého výslovného souhlasu nic nesmaže.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Výchozí uchovávání (dny, 0 = nikdy)</value>
@@ -223,7 +223,7 @@
<value>Znovu zobrazit průvodce</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Později ponechat výchozí</value>
<value>Později: ponechat výchozí</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Zavře průvodce bez výběru profilu. Výchozí nastavení pluginu zůstane aktivní a průvodce se znovu zobrazí při příštím načtení pluginu.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Jako Privacy First, navíc Say a oba typy emote pro záznamy tvých příběhů. Shout a Yell zůstávají venku hluk na dálku od cizích hráčů není obsah příběhu. Uchovávání: Say 30 dní, emoty 90 dní.</value>
<value>Jako Privacy First, navíc Say a oba typy emote pro záznamy tvých příběhů. Shout a Yell zůstávají venku: hluk na dálku od cizích hráčů není obsah příběhu. Uchovávání: Say 30 dní, emoty 90 dní.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Použít roleplay</value>
@@ -385,10 +385,10 @@
<value>Jak neprůhledná jsou okna pluginu. Nižší hodnoty nechávají hru prosvítat, formuláře a dialogy zůstávají plně neprůhledné a čitelné nahoře.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Použít přibalenou Hellion font (Exo 2)</value>
<value>Použít vestavěné Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Vykresluje chat a UI v Exo 2 (SIL Open Font License 1.1), která je součástí pluginu. Vypni, chceš-li se vrátit k fontu nastavenému v Nastavení → Font.</value>
<value>Vykresluje chat a UI v Inter Light (licence SIL Open Font 1.1), které je součástí pluginu. Vypněte pro návrat k písmu vybranému v Nastavení → Písmo.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -489,7 +489,7 @@
<value>Povýšit na trvalou záložku</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Přemění tento TempTell na normální záložku. Vazba na partnera přes tell se zruší záložka od té doby zachytává zprávy podle filtrů kanálů. Chceš-li „záložka přežije relog a zůstane svázaná s tímto partnerem", použij raději Připnout záložku.</value>
<value>Přemění tento TempTell na normální záložku. Vazba na partnera přes tell se zruší: záložka od té doby zachytává zprávy podle filtrů kanálů. Chceš-li „záložka přežije relog a zůstane svázaná s tímto partnerem", použij raději Připnout záložku.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Připnuté záložky přeživají relog a zůstávají svázané s tímto konverzačním partnerem.</value>
@@ -507,7 +507,7 @@
<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>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Připnuto přežívá relog.</value>
<value>Připnuto: přežívá relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Zobrazit tlačítko „Označit jako pozdraveno"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Průhlednost okna</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Jak průhledné je pozadí okna. Nižší hodnoty nechávají více hry prosvítat. Tip: nabídka Dalamud pro každé okno (hamburger v záhlaví) nabízí přepsání průhlednosti, rozostření pozadí, kliknutí skrz a připnutí pro konkrétní okno ta mají přednost před tímto posuvníkem pro dané okno.</value>
<value>Jak průhledné je pozadí okna. Nižší hodnoty nechávají více hry prosvítat. Tip: nabídka Dalamud pro každé okno (hamburger v záhlaví) nabízí přepsání průhlednosti, rozostření pozadí, kliknutí skrz a připnutí pro konkrétní okno: ta mají přednost před tímto posuvníkem pro dané okno.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Písma</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Vyhledává přesnou frázi. Dotazy s více slovy se shodují pouze tehdy, když slova stojí pohromadě ve správném pořadí. Chceš-li použít syrovou syntaxi FTS5 MATCH, obal svůj výraz do uvozovek ručně.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat zobrazuje všech 24 jazyků, ale chatovací vstup FFXIV plně podporuje pouze EN, DE, FR a JA. Ostatní písma se mohou zobrazovat jako poškozené znaky při psaní do herního chatu nebo při odesílání zpráv.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Rychlý výběr motivů a karet</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Motivy</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Karty</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Omezit pohyb</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Vypne prolínání motivů, animace najetí myší na postranní panel a karty a pulzování nepřečtených karet. Změny motivu a stavy najetí myší se použijí okamžitě.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+32 -9
View File
@@ -82,7 +82,7 @@
<value>Den manuelle kørsel bruger din GEMTE opbevaringspolitik, ikke skyderknapværdierne ovenfor. Klik Gem først, hvis kørslen skal anvende dine aktuelle ændringer.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Forhåndsvisning er forældet din hvidliste er ændret siden sidste opdatering. Klik Opdater for at genberegne.</value>
<value>Forhåndsvisning er forældet: din hvidliste er ændret siden sidste opdatering. Klik Opdater for at genberegne.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Opdater forhåndsvisning</value>
@@ -133,7 +133,7 @@
<value>Slet automatisk beskeder der er ældre end kanalens opbevaringsvindue</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Når aktiveret slettes beskeder ældre end det konfigurerede vindue ved hvert plugin-opstart (højst én gang i døgnet). Standard er FRA plugin'et sletter aldrig noget uden din udtrykkelige samtykke.</value>
<value>Når aktiveret slettes beskeder ældre end det konfigurerede vindue ved hvert plugin-opstart (højst én gang i døgnet). Standard er FRA: plugin'et sletter aldrig noget uden din udtrykkelige samtykke.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Standard opbevaring (dage, 0 = aldrig)</value>
@@ -223,7 +223,7 @@
<value>Vis guiden igen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Senere behold standarder</value>
<value>Senere: behold standarder</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Luk guiden uden at vælge en profil. Plugin-standarderne forbliver aktive, og guiden vises igen ved næste plugin-indlæsning.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Som Privacy First, plus Say og begge emote-typer til dine story-logge. Shout og Yell er udelukket støj fra fremmede på lang afstand er ikke story-indhold. Opbevaring: Say 30 dage, emotes 90 dage.</value>
<value>Som Privacy First, plus Say og begge emote-typer til dine story-logge. Shout og Yell er udelukket: støj fra fremmede på lang afstand er ikke story-indhold. Opbevaring: Say 30 dage, emotes 90 dage.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Anvend roleplay</value>
@@ -385,10 +385,10 @@
<value>Hvor uigennemsigtige plugin-vinduerne er. Lavere værdier lader spillet skinne igennem. Formfelter og dialoger forbliver fuldt uigennemsigtige og læselige ovenpå.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Brug medfølgende Hellion-skrifttype (Exo 2)</value>
<value>Brug indlejret Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Gengiver chat og brugergrænseflade i Exo 2 (SIL Open Font License 1.1), som følger med plugin'et. Deaktivér for at falde tilbage til skrifttypen valgt under Indstillinger → Skrifttype.</value>
<value>Gengiver chat og UI i Inter Light (SIL Open Font License 1.1), som følger med pluginnet. Deaktiver for at vende tilbage til skrifttypen valgt i Indstillinger → Skrifttype.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>Maksimum på {0} fastgjorte tell-tabs nået. Frigør én først, eller brug Konvertér til permanent.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fastgjort overlever genlog.</value>
<value>Fastgjort: overlever genlog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Vis knappen "Markér som hilset på"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Vinduesgennemsigtighed</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Hvor gennemsigtigt vinduesbaggrunden er. Lavere værdier lader mere af spillet skinne igennem. Tip: Dalamud's per-vindue-menu (hamburger i titellinjen) tilbyder per-vindue-tilsidesættelser for opacitet, baggrundssløring, klik-igennem og fastgørelse de har forrang over denne skyderknap for det pågældende vindue.</value>
<value>Hvor gennemsigtigt vinduesbaggrunden er. Lavere værdier lader mere af spillet skinne igennem. Tip: Dalamud's per-vindue-menu (hamburger i titellinjen) tilbyder per-vindue-tilsidesættelser for opacitet, baggrundssløring, klik-igennem og fastgørelse: de har forrang over denne skyderknap for det pågældende vindue.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Skrifttyper</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Søger efter den præcise sætning. Forespørgsler med flere ord matcher kun, når ordene optræder sammen i rækkefølge. For at bruge rå FTS5 MATCH-syntaks, sæt selv dit søgeterm i anførselstegn.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat viser alle 24 sprog, men FFXIV's chatinput understøtter kun EN, DE, FR og JA fuldt ud. Andre skrifter kan vises som forvrængede tegn, når de skrives i spillets chat eller sendes som beskeder.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Hurtigvælger til temaer og faner</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temaer</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Faner</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reducér bevægelse</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Deaktiverer temaovergangen, hover-animationer for sidepanel og kort samt pulseringen af ulæste faner. Temaskift og hover-tilstande anvendes i stedet med det samme.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+25 -7
View File
@@ -223,7 +223,7 @@
<value>Wizard erneut zeigen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Später Defaults behalten</value>
<value>Später: Defaults behalten</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Schließt den Wizard ohne Profil-Auswahl. Die Plugin-Defaults bleiben aktiv und der Wizard erscheint beim nächsten Plugin-Reload erneut.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Wie Datensparsamkeit, plus Sagen und beide Emote-Typen für deine Story-Logs. Schreien und Rufen bleiben außen vor Public-Distance-Lärm von Fremden ist kein Story-Inhalt. Aufbewahrung: Sagen 30 Tage, Emotes 90 Tage.</value>
<value>Wie Datensparsamkeit, plus Sagen und beide Emote-Typen für deine Story-Logs. Schreien und Rufen bleiben außen vor. Public-Distance-Lärm von Fremden ist kein Story-Inhalt. Aufbewahrung: Sagen 30 Tage, Emotes 90 Tage.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Roleplay übernehmen</value>
@@ -385,10 +385,10 @@
<value>Wie deckend die Plugin-Fenster sind. Niedrigere Werte lassen das Spiel durchscheinen, Form-Felder und Dialoge bleiben oben drauf deckend und gut lesbar.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Mitgelieferte Hellion-Schrift (Exo 2) verwenden</value>
<value>Mitgelieferte Inter Light verwenden</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Rendert Chat und UI in Exo 2 (SIL Open Font License 1.1), die mit dem Plugin ausgeliefert wird. Deaktivieren, um auf die unter Einstellungen → Schrift gewählte Schriftart zurückzufallen.</value>
<value>Stellt Chat und UI in Inter Light (SIL Open Font License 1.1) dar, die mit dem Plugin geliefert wird. Deaktivieren, um zur Schrift aus Einstellungen → Schriftart zurückzukehren.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -495,7 +495,7 @@
<value>Maximal {0} angepinnte Tell-Tabs erreicht. Erst einen lösen oder dauerhaft behalten.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Angepinnt überlebt Relog.</value>
<value>Angepinnt: überlebt Relog.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Angepinnte Tabs überleben Relog und behalten die Bindung an die Tell-Person.</value>
@@ -536,7 +536,7 @@
<value>„Als begrüßt markieren"-Button anzeigen</value>
</data>
<data name="ChatLog_AutoTellTabs_GreetedToggle_Description" xml:space="preserve">
<value>Fügt neben jedem Auto-Tell-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>
<value>Fügt neben jedem Auto-Tell-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>
@@ -905,7 +905,7 @@
<value>Fenster-Transparenz</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Wie durchsichtig der Fensterhintergrund ist. Niedrigere Werte lassen mehr vom Spiel durchscheinen. Tipp: Dalamud's Per-Window-Menü (Hamburger in der Titelleiste) bietet pro Fenster eigene Overrides für Deckkraft, Hintergrund-Blur, Durchklick und Anpinnen die haben Vorrang über diesen Slider für das jeweilige Fenster.</value>
<value>Wie durchsichtig der Fensterhintergrund ist. Niedrigere Werte lassen mehr vom Spiel durchscheinen. Tipp: Dalamud's Per-Window-Menü (Hamburger in der Titelleiste) bietet pro Fenster eigene Overrides für Deckkraft, Hintergrund-Blur, Durchklick und Anpinnen: die haben Vorrang über diesen Slider für das jeweilige Fenster.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Schriftarten</value>
@@ -1030,4 +1030,22 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Sucht nach der exakten Wortfolge. Mehrere Wörter werden nur gefunden, wenn sie zusammen und in dieser Reihenfolge stehen. Wer rohe FTS5-MATCH-Syntax nutzen will, setzt eigene Anführungszeichen um den Suchbegriff.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat zeigt alle 24 Sprachen, aber FFXIVs Chat-Eingabe unterstützt nur EN, DE, FR und JA vollständig. Andere Schriften können beim Tippen in den Spiel-Chat oder beim Senden von Nachrichten als unleserliche Zeichen erscheinen.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Schnellauswahl für Themes und Tabs</value>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Themes</value>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Tabs</value>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Bewegung reduzieren</value>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Deaktiviert die Theme-Überblendung, die Hover-Animationen von Seitenleiste und Karten sowie das Pulsieren ungelesener Tabs. Theme-Wechsel und Hover-Zustände greifen dann sofort.</value>
</data>
</root>
File diff suppressed because it is too large Load Diff
+28 -4
View File
@@ -223,7 +223,7 @@
<value>Mostrar asistente de nuevo</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Más tarde mantener predeterminados</value>
<value>Más tarde: mantener predeterminados</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Cierra el asistente sin seleccionar un perfil. Los valores predeterminados del plugin siguen activos y el asistente vuelve a aparecer en la próxima carga del plugin.</value>
@@ -385,10 +385,10 @@
<value>Qué tan opacas son las ventanas del plugin. Valores más bajos dejan ver el juego por detrás; los campos de formulario y los diálogos permanecen completamente opacos y legibles encima.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Usar la fuente Hellion incluida (Exo 2)</value>
<value>Usar Inter Light incluido</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderiza el chat y la interfaz en Exo 2 (SIL Open Font License 1.1), que se incluye con el plugin. Desactívalo para volver a la fuente seleccionada en Ajustes → Fuente.</value>
<value>Muestra el chat y la interfaz en Inter Light (licencia SIL Open Font 1.1), incluida en el plugin. Desactiva para volver a la fuente seleccionada en Configuración → Fuente.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>Se alcanzó el máximo de {0} pestañas de tell fijadas. Desija una primero o usa Convertir en permanente.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fijada sobrevive al relog.</value>
<value>Fijada: sobrevive al relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Busca la frase exacta. Las consultas de varias palabras solo coinciden cuando las palabras aparecen juntas en orden. Para usar la sintaxis FTS5 MATCH sin procesar, encierra tu término entre comillas dobles tú mismo.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat muestra los 24 idiomas, pero la entrada de chat de FFXIV solo admite completamente EN, DE, FR y JA. Otros alfabetos pueden mostrarse como caracteres ilegibles al escribir en el chat del juego o al enviar mensajes.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Selector rápido de temas y pestañas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Pestañas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reducir movimiento</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Desactiva la transición de temas, las animaciones al pasar el cursor por la barra lateral y las tarjetas, y el parpadeo de pestañas no leídas. Los cambios de tema y los estados del cursor se aplican al instante.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+35 -12
View File
@@ -82,7 +82,7 @@
<value>Manuaalinen ajo käyttää TALLENNETTUA säilytyskäytäntöäsi, ei yllä olevia liukusäätimen arvoja. Napsauta Tallenna ensin, jos haluat ajon soveltavan nykyiset muutoksesi.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Esikatselu on vanhentunut sallittujen listasi on muuttunut viimeisen päivityksen jälkeen. Napsauta Päivitä laskeaksesi uudelleen.</value>
<value>Esikatselu on vanhentunut: sallittujen listasi on muuttunut viimeisen päivityksen jälkeen. Napsauta Päivitä laskeaksesi uudelleen.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Päivitä esikatselu</value>
@@ -133,7 +133,7 @@
<value>Poista automaattisesti viestit, jotka ylittävät kanavan säilytysajan</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Kun käytössä, määritettyä aikaikkunaa vanhemmat viestit poistetaan jokaisella lisäosan käynnistyksellä (enintään kerran 24 tunnissa). Oletuksena POIS lisäosa ei poista mitään ilman nimenomaista suostumustasi.</value>
<value>Kun käytössä, määritettyä aikaikkunaa vanhemmat viestit poistetaan jokaisella lisäosan käynnistyksellä (enintään kerran 24 tunnissa). Oletuksena POIS: lisäosa ei poista mitään ilman nimenomaista suostumustasi.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Oletussäilytys (päivää, 0 = ei koskaan)</value>
@@ -223,7 +223,7 @@
<value>Näytä ohjattu toiminto uudelleen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Myöhemmin säilytä oletukset</value>
<value>Myöhemmin: säilytä oletukset</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Sulje ohjattu toiminto ilman profiilin valintaa. Lisäosan oletukset pysyvät aktiivisina ja ohjattu toiminto palaa seuraavalla lisäosan latauksella.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Kuten Privacy First, lisäksi Say ja molemmat emote-tyypit tarinaasi varten. Shout ja Yell jäävät pois tuntemattomien julkinen häly ei ole tarinan sisältöä. Säilytys: Say 30 päivää, emotet 90 päivää.</value>
<value>Kuten Privacy First, lisäksi Say ja molemmat emote-tyypit tarinaasi varten. Shout ja Yell jäävät pois: tuntemattomien julkinen häly ei ole tarinan sisältöä. Säilytys: Say 30 päivää, emotet 90 päivää.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Käytä roleplay-profiilia</value>
@@ -385,10 +385,10 @@
<value>Kuinka peittäviä lisäosan ikkunat ovat. Pienemmät arvot näyttävät pelin läpi; lomakekentät ja valintaikkunat pysyvät täysin peittävinä ja luettavina päällä.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Käytä mukana tulevaa Hellion-fonttia (Exo 2)</value>
<value>Käytä mukana toimitettua Inter Light -fonttia</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderöi chatin ja käyttöliittymän Exo 2:ssa (SIL Open Font License 1.1), joka toimitetaan lisäosan mukana. Poista käytöstä palataksesi Asetukset → Fontti -kohdassa valittuun fonttiin.</value>
<value>Renderöi keskustelun ja käyttöliittymän Inter Light -fontilla (SIL Open Font License 1.1), joka toimitetaan lisäosan mukana. Poista käytöstä palataksesi fonttiin, joka on valittu kohdassa Asetukset → Fontti.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>Hellion Chat on haarautuma Chat 2:sta, jonka tekijät ovat Infi ja Anna (ascclemens). Chat-korvaava ikkuna, IPC-integraatio, renderöintimoottori ja koko tallennusydin tulevat alkuperäisestä.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>Verkkoliittymä on ainoa merkittävä osa, jonka poistin. Se on rakennettu chattiin pääsemiseksi etänä toiselta laitteelta erilainen painopiste kuin tämän haarautuman tavoittelema pienempi oletusjalanjälki. Sen mukauttaminen näihin oletuksiin olisi vaatinut merkittävää uudelleentyöstämistä, joten poistaminen oli siisti ratkaisu juuri tälle haarautumalle.</value>
<value>Verkkoliittymä on ainoa merkittävä osa, jonka poistin. Se on rakennettu chattiin pääsemiseksi etänä toiselta laitteelta: erilainen painopiste kuin tämän haarautuman tavoittelema pienempi oletusjalanjälki. Sen mukauttaminen näihin oletuksiin olisi vaatinut merkittävää uudelleentyöstämistä, joten poistaminen oli siisti ratkaisu juuri tälle haarautumalle.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Upstream-repositorio:</value>
@@ -489,7 +489,7 @@
<value>Muuta pysyväksi välilehdeksi</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Muuttaa tämän TempTell-välilehden tavalliseksi välilehdeksi. Tell-sidonta kumppaniin poistetaan välilehti poimii viestit kanavasuodattimiensa perusteella tästä eteenpäin. Jos haluat "välilehti selviää relogista sidottuna tähän kumppaniin", käytä sen sijaan Kiinnitä välilehti -toimintoa.</value>
<value>Muuttaa tämän TempTell-välilehden tavalliseksi välilehdeksi. Tell-sidonta kumppaniin poistetaan: välilehti poimii viestit kanavasuodattimiensa perusteella tästä eteenpäin. Jos haluat "välilehti selviää relogista sidottuna tähän kumppaniin", käytä sen sijaan Kiinnitä välilehti -toimintoa.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Kiinnitetyt välilehdet selviävät relogista ja pysyvät sidottuina tähän keskustelukumppaniin.</value>
@@ -507,7 +507,7 @@
<value>Kiinnitettyjen tell-välilehtien enimmäismäärä {0} saavutettu. Irrota ensin yksi tai muuta pysyväksi välilehdeksi.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Kiinnitetty selviää relogista.</value>
<value>Kiinnitetty: selviää relogista.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Näytä "Merkitse tervehdytyksi" -painike</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Ikkunan läpinäkyvyys</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Kuinka läpinäkyvä ikkunan tausta on. Pienemmät arvot näyttävät enemmän peliä läpi. Vinkki: Dalamud-ikkunakohtainen valikko (hampurilaisvalikko otsikkopalkissa) tarjoaa ikkunakohtaiset ohitukset läpinäkyvyydelle, taustan sumenteelle, läpinapsautukselle ja kiinnittämiselle ne ohittavat tämän liukusäätimen kyseisessä ikkunassa.</value>
<value>Kuinka läpinäkyvä ikkunan tausta on. Pienemmät arvot näyttävät enemmän peliä läpi. Vinkki: Dalamud-ikkunakohtainen valikko (hampurilaisvalikko otsikkopalkissa) tarjoaa ikkunakohtaiset ohitukset läpinäkyvyydelle, taustan sumenteelle, läpinapsautukselle ja kiinnittämiselle: ne ohittavat tämän liukusäätimen kyseisessä ikkunassa.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Fontit</value>
@@ -965,7 +965,7 @@
<value>Renderöi hehkuääriviivat (Honorific)</value>
</data>
<data name="Settings_Integrations_Honorific_Glow_Hint" xml:space="preserve">
<value>Voi heikentää kuvataajuutta heikommilla laitteistoilla. Renderöi hehkuääriviivat Honorific-titteleille, jotka niitä käyttävät. Liukuvärvälianimaatiota ei vielä tueta se renderöidään ensisijaisena värinä.</value>
<value>Voi heikentää kuvataajuutta heikommilla laitteistoilla. Renderöi hehkuääriviivat Honorific-titteleille, jotka niitä käyttävät. Liukuvärvälianimaatiota ei vielä tueta: se renderöidään ensisijaisena värinä.</value>
</data>
<data name="Settings_Integrations_Honorific_LinkRepo" xml:space="preserve">
<value>Honorific GitHubissa</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Etsii tarkkaa lauseketta. Monisanaiset kyselyt löytyvät vain, kun sanat esiintyvät yhdessä järjestyksessä. Käyttääksesi raakaa FTS5 MATCH -syntaksia, aseta hakutermi itse lainausmerkkeihin.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat näyttää kaikki 24 kieltä, mutta FFXIV:n chat-syöte tukee täysin vain EN, DE, FR ja JA. Muut kirjoitusjärjestelmät voivat näkyä virheellisinä merkkeinä, kun ne kirjoitetaan pelin chattiin tai lähetetään viesteinä.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Teemojen ja välilehtien pikavalitsin</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Teemat</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Välilehdet</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Vähennä liikettä</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Poistaa käytöstä teeman ristihäivytyksen, sivupalkin ja korttien osoitinanimaatiot sekä lukemattomien välilehtien sykkeen. Teeman vaihdot ja osoitintilat tulevat voimaan välittömästi.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+26 -2
View File
@@ -385,10 +385,10 @@
<value>Niveau d'opacité des fenêtres du plugin. Des valeurs basses laissent transparaître le jeu ; les champs de formulaire et les boîtes de dialogue restent entièrement opaques et lisibles par-dessus.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Utiliser la police Hellion fournie (Exo 2)</value>
<value>Utiliser Inter Light fourni</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Affiche le chat et l'interface en Exo 2 (licence SIL Open Font 1.1), fournie avec le plugin. Désactivez pour revenir à la police sélectionnée dans Paramètres → Police.</value>
<value>Affiche le chat et l'interface en Inter Light (licence SIL Open Font 1.1), fournie avec le plugin. Désactivez pour revenir à la police sélectionnée dans Paramètres → Police.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Recherche l'expression exacte. Les requêtes à plusieurs mots ne correspondent que lorsque les mots apparaissent ensemble et dans l'ordre. Pour utiliser la syntaxe MATCH brute de FTS5, encadrez vous-même votre terme par des guillemets droits.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat affiche les 24 langues, mais la saisie de chat de FFXIV ne prend en charge intégralement que EN, DE, FR et JA. Les autres scripts peuvent apparaître comme des caractères illisibles lors de la saisie dans le chat du jeu ou lors de l'envoi de messages.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Sélecteur rapide de thèmes et d'onglets</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Thèmes</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Onglets</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Réduire les animations</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Désactive le fondu enchaîné des thèmes, les animations de survol de la barre latérale et des cartes, ainsi que la pulsation des onglets non lus. Les changements de thème et les états de survol s'appliquent alors instantanément.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+34 -11
View File
@@ -82,7 +82,7 @@
<value>A kézi futtatás a MENTETT megőrzési szabályzatot használja, nem a fenti csúszkák értékeit. Először kattints a Mentés gombra, ha a futtatásban az aktuális változtatásokat szeretnéd alkalmazni.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Az előnézet elavult a fehérlistád megváltozott az utolsó frissítés óta. Kattints a Frissítés gombra az újraszámításhoz.</value>
<value>Az előnézet elavult: a fehérlistád megváltozott az utolsó frissítés óta. Kattints a Frissítés gombra az újraszámításhoz.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Előnézet frissítése</value>
@@ -133,7 +133,7 @@
<value>Csatorna megőrzési időablakán túli üzenetek automatikus törlése</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Ha be van kapcsolva, a beállított időablagnál régebbi üzenetek minden plugin-indításkor törlődnek (legfeljebb 24 óránként egyszer). Az alapértelmezés KI a plugin az explicit beleegyezésed nélkül semmit sem töröl.</value>
<value>Ha be van kapcsolva, a beállított időablagnál régebbi üzenetek minden plugin-indításkor törlődnek (legfeljebb 24 óránként egyszer). Az alapértelmezés KI: a plugin az explicit beleegyezésed nélkül semmit sem töröl.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Alapértelmezett megőrzés (napokban, 0 = soha)</value>
@@ -223,7 +223,7 @@
<value>Varázsló újra megnyitása</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Később alapértelmezések megtartása</value>
<value>Később: alapértelmezések megtartása</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Bezárja a varázslót profil kiválasztása nélkül. A plugin alapértelmezései aktívak maradnak, és a varázsló a következő plugin-betöltéskor újra megjelenik.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Mint a Privacy First, plusz Say és mindkét emote-típus a story-naplóidhoz. Shout és Yell kívül marad a távolabb lévő idegenek zaja nem story-tartalom. Megőrzés: Say 30 nap, emote-ok 90 nap.</value>
<value>Mint a Privacy First, plusz Say és mindkét emote-típus a story-naplóidhoz. Shout és Yell kívül marad: a távolabb lévő idegenek zaja nem story-tartalom. Megőrzés: Say 30 nap, emote-ok 90 nap.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Roleplay alkalmazása</value>
@@ -385,10 +385,10 @@
<value>Mennyire átlátszatlanok a plugin-ablakok. Alacsonyabb értékeknél a játék átlátszik a háttérben; az űrlapmezők és párbeszédablakok teljesen átlátszatlanok és jól olvashatók maradnak felül.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Beépített Hellion betűtípus (Exo 2) használata</value>
<value>Mellékelt Inter Light használata</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>A chatet és a felhasználói felületet Exo 2-ben jeleníti meg (SIL Open Font License 1.1), amely a pluginnel érkezik. Kapcsold ki, ha vissza szeretnél térni a Beállítások → Betűtípus alatt kiválasztott betűhöz.</value>
<value>A csevegést és a UI-t Inter Light betűtípussal (SIL Open Font License 1.1) jeleníti meg, amely a bővítményhez van mellékelve. Letiltva visszaáll a Beállítások → Betűtípus alatt kiválasztott betűtípusra.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>A Hellion Chat az Infi és Anna (ascclemens) által készített Chat 2 forkja. A chat-csere ablak, az IPC-integráció, a renderelő motor és a teljes tárolási mag mind az eredetiből származik.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>A webes felület az egyetlen nagyobb rész, amelyet eltávolítottam. Távoli hozzáférésre készült a chathez egy második eszközről ez eltérő fókusz attól a kisebb alapértelmezett lábnyomtól, amelyet ez a fork követ. Az alapértelmezésekhez való igazítása jelentős átdolgozást igényelt volna, így az eltávolítás volt a legtisztább megoldás ehhez a forkhoz.</value>
<value>A webes felület az egyetlen nagyobb rész, amelyet eltávolítottam. Távoli hozzáférésre készült a chathez egy második eszközről: ez eltérő fókusz attól a kisebb alapértelmezett lábnyomtól, amelyet ez a fork követ. Az alapértelmezésekhez való igazítása jelentős átdolgozást igényelt volna, így az eltávolítás volt a legtisztább megoldás ehhez a forkhoz.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Upstream repository:</value>
@@ -489,7 +489,7 @@
<value>Előléptetés állandó füllé</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Ezt a TempTell-t normál füllé alakítja. A partnerhez való tell-kötés megszűnik a fül ezentúl a csatornaszűrők alapján fogja az üzeneteket. Ha azt szeretnéd, hogy „a fül túlélje az újrabejelentkezést és kötve maradjon a partnerhez", inkább a Fül rögzítése funkciót használd.</value>
<value>Ezt a TempTell-t normál füllé alakítja. A partnerhez való tell-kötés megszűnik: a fül ezentúl a csatornaszűrők alapján fogja az üzeneteket. Ha azt szeretnéd, hogy „a fül túlélje az újrabejelentkezést és kötve maradjon a partnerhez", inkább a Fül rögzítése funkciót használd.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>A rögzített fülek túlélik az újrabejelentkezést, és kötve maradnak a beszélgető partnerhez.</value>
@@ -507,7 +507,7 @@
<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>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Rögzített túléli az újrabejelentkezést.</value>
<value>Rögzített: túléli az újrabejelentkezést.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>„Üdvözöltként megjelöl" gomb megjelenítése</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Ablak átlátszósága</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Mennyire átlátszó az ablak háttere. Alacsonyabb értékeknél több játék látszik át. Tipp: A Dalamud ablakmenüje (hamburger-ikon a fejlécen) ablakokként kínál felülbírálási lehetőséget az átlátszósághoz, háttér-homályosításhoz, átkattintáshoz és rögzítéshez ezek felülírják ezt a csúszkát az adott ablaknál.</value>
<value>Mennyire átlátszó az ablak háttere. Alacsonyabb értékeknél több játék látszik át. Tipp: A Dalamud ablakmenüje (hamburger-ikon a fejlécen) ablakokként kínál felülbírálási lehetőséget az átlátszósághoz, háttér-homályosításhoz, átkattintáshoz és rögzítéshez: ezek felülírják ezt a csúszkát az adott ablaknál.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Betűtípusok</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>A pontos kifejezést keresi. Többszavas lekérdezések csak akkor illeszkednek, ha a szavak egymás után, sorban szerepelnek. A nyers FTS5 MATCH szintaxis használatához tedd a keresőkifejezést saját idézőjelek közé.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>A HellionChat mind a 24 nyelvet megjeleníti, de a FFXIV csevegési bemenete csak az EN, DE, FR és JA nyelveket támogatja teljes mértékben. Más írásrendszerek torzított karakterekként jelenhetnek meg a játék csevegésébe írva vagy üzenetként elküldve.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Témák és lapok gyorsválasztója</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Témák</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Lapok</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Mozgás csökkentése</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Letiltja a témák áttűnését, az oldalsáv és a kártyák rámutatási animációit, valamint az olvasatlan lapok pulzálását. A témaváltások és a rámutatási állapotok ehelyett azonnal érvénybe lépnek.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+30 -6
View File
@@ -82,7 +82,7 @@
<value>L'esecuzione manuale usa la tua policy di conservazione SALVATA, non i valori degli slider sopra. Clicca Salva prima se vuoi che l'esecuzione applichi le modifiche attuali.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Anteprima non aggiornata la whitelist è cambiata dall'ultimo aggiornamento. Clicca Aggiorna per ricalcolare.</value>
<value>Anteprima non aggiornata: la whitelist è cambiata dall'ultimo aggiornamento. Clicca Aggiorna per ricalcolare.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Aggiorna anteprima</value>
@@ -223,7 +223,7 @@
<value>Mostra wizard di nuovo</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Dopo mantieni predefiniti</value>
<value>Dopo: mantieni predefiniti</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Chiude il wizard senza selezionare un profilo. I valori predefiniti del plugin rimangono attivi e il wizard torna al prossimo caricamento del plugin.</value>
@@ -385,10 +385,10 @@
<value>Quanto sono opache le finestre del plugin. Valori più bassi lasciano trasparire il gioco; i campi modulo e i dialoghi rimangono completamente opachi e leggibili in primo piano.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Usa il font Hellion incluso (Exo 2)</value>
<value>Usa Inter Light incluso</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Visualizza la chat e l'interfaccia in Exo 2 (SIL Open Font License 1.1), incluso nel plugin. Disattiva per tornare al font selezionato in Impostazioni → Font.</value>
<value>Mostra la chat e l'interfaccia in Inter Light (licenza SIL Open Font 1.1), inclusa nel plugin. Disattiva per tornare al font selezionato in Impostazioni → Font.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>Raggiunto il massimo di {0} tab tell fissi. Sblocca prima uno o usa Converti in permanente.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fisso sopravvive al relog.</value>
<value>Fisso: sopravvive al relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -905,7 +905,7 @@
<value>Trasparenza finestra</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Quanto è trasparente lo sfondo della finestra. Valori più bassi lasciano trasparire più gioco. Suggerimento: il menu per finestra di Dalamud (hamburger nella barra del titolo) offre sovrascritture per finestra per opacità, sfocatura sfondo, click-through e blocco queste hanno la precedenza su questo slider per la rispettiva finestra.</value>
<value>Quanto è trasparente lo sfondo della finestra. Valori più bassi lasciano trasparire più gioco. Suggerimento: il menu per finestra di Dalamud (hamburger nella barra del titolo) offre sovrascritture per finestra per opacità, sfocatura sfondo, click-through e blocco: queste hanno la precedenza su questo slider per la rispettiva finestra.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Font</value>
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Cerca la frase esatta. Le query con più parole corrispondono solo quando le parole appaiono insieme nell'ordine indicato. Per usare la sintassi FTS5 MATCH grezza, racchiudi il termine tra virgolette doppie.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat mostra tutte le 24 lingue, ma l'input chat di FFXIV supporta completamente solo EN, DE, FR e JA. Altre scritture potrebbero apparire come caratteri illeggibili durante la digitazione nella chat di gioco o l'invio di messaggi.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Selettore rapido di temi e schede</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temi</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Schede</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Riduci movimento</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Disattiva la dissolvenza dei temi, le animazioni al passaggio del mouse su barra laterale e schede e la pulsazione delle schede non lette. I cambi di tema e gli stati al passaggio del mouse vengono applicati immediatamente.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+28 -4
View File
@@ -223,7 +223,7 @@
<value>ウィザードを再表示</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>後で デフォルトのまま</value>
<value>後で: デフォルトのまま</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>プロファイルを選択せずにウィザードを閉じます。プラグインのデフォルト設定が引き続き有効です。次回プラグイン読み込み時にウィザードが再度表示されます。</value>
@@ -385,10 +385,10 @@
<value>プラグインウィンドウの不透明度です。値を下げるとゲームが透けて見えます。フォームフィールドとダイアログは常に完全に不透明で読みやすい状態を保ちます。</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>同梱の Hellion フォント(Exo 2を使用する</value>
<value>同梱の Inter Light を使用</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>プラグインに同梱された Exo 2SIL Open Font License 1.1)でチャットと UI を表示します。無効にすると、設定 → フォントで選択されたフォントにフォールバックします。</value>
<value>チャットとUIをプラグインに同梱されている Inter Light (SIL Open Font License 1.1) で表示します。無効にすると、設定 → フォント で選択たフォントに戻ります。</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>ピン留めテルタブの上限 {0} 件に達しました。先に1件解除するか、「永続タブに昇格」をご利用ください。</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>ピン留め済み 再ログイン後も残ります。</value>
<value>ピン留め済み: 再ログイン後も残ります。</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>完全なフレーズを検索します。複数の単語は同じ順序で並んで出現する場合にのみ一致します。生の FTS5 MATCH 構文を使用するには、検索語を自分でダブルクォートで囲んでください。</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat は 24 言語すべてを表示しますが、FFXIV のチャット入力が完全に対応しているのは EN、DE、FR、JA のみです。他のスクリプトはゲーム内チャットへの入力時やメッセージ送信時に文字化けする可能性があります。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>テーマとタブのクイックピッカー</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>テーマ</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>タブ</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>モーションを減らす</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>テーマのクロスフェード、サイドバーとカードのホバーアニメーション、未読タブのパルスを無効にします。テーマの切り替えとホバー状態は即座に適用されます。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+28 -4
View File
@@ -223,7 +223,7 @@
<value>마법사 다시 표시</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>나중에 기본값 유지</value>
<value>나중에: 기본값 유지</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>프로필을 선택하지 않고 마법사를 닫습니다. 플러그인 기본값이 유지되며 다음 플러그인 로드 시 마법사가 다시 표시됩니다.</value>
@@ -385,10 +385,10 @@
<value>플러그인 창의 불투명도입니다. 값이 낮을수록 게임이 배경으로 비쳐 보이며, 폼 필드와 대화 상자는 위에서 완전히 불투명하게 표시됩니다.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>내장 Hellion 글꼴 (Exo 2) 사용</value>
<value>내장된 Inter Light 사용</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>채팅과 UI를 Exo 2 (SIL Open Font License 1.1)로 렌더링합니다. 이 글꼴은 플러그인에 포함되어 있습니다. 비활성화하면 설정 → 글꼴에서 선택한 글꼴로 돌아갑니다.</value>
<value>플러그인에 포함된 Inter Light (SIL Open Font License 1.1)로 채팅과 UI를 표시합니다. 비활성화하면 설정 → 글꼴에서 선택한 글꼴로 돌아갑니다.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>고정 귓속말 탭의 최대 개수 {0}에 도달했습니다. 먼저 하나를 해제하거나 영구 탭으로 변환하세요.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>고정됨 재접속 후에도 유지됩니다.</value>
<value>고정됨: 재접속 후에도 유지됩니다.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>정확한 구문을 검색합니다. 여러 단어 쿼리는 단어들이 순서대로 함께 나타날 때만 일치합니다. 원시 FTS5 MATCH 구문을 사용하려면 검색어를 직접 큰따옴표로 감싸세요.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat은 24개 언어 모두를 표시하지만, FFXIV의 채팅 입력은 EN, DE, FR, JA만 완전히 지원합니다. 다른 문자 체계는 게임 내 채팅에 입력하거나 메시지로 보낼 때 깨진 문자로 표시될 수 있습니다.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>테마 및 탭 빠른 선택기</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>테마</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>탭</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>모션 줄이기</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>테마 크로스페이드, 사이드바 및 카드 호버 애니메이션, 읽지 않은 탭의 펄스 효과를 비활성화합니다. 테마 전환과 호버 상태가 즉시 적용됩니다.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+31 -8
View File
@@ -82,7 +82,7 @@
<value>Den manuelle kjøringen bruker den LAGREDE oppbevaringspolicyen din, ikke skyveknappverdiene ovenfor. Klikk Lagre først om du vil at kjøringen skal bruke de nåværende endringene.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Forhåndsvisningen er utdatert hvitelisten din har endret seg siden siste oppdatering. Klikk Oppdater for å beregne på nytt.</value>
<value>Forhåndsvisningen er utdatert: hvitelisten din har endret seg siden siste oppdatering. Klikk Oppdater for å beregne på nytt.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Oppdater forhåndsvisning</value>
@@ -133,7 +133,7 @@
<value>Slett automatisk meldinger som har passert kanalens oppbevaringsvindu</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Når aktivert slettes meldinger som er eldre enn det konfigurerte vinduet ved hver pluginstart (høyst én gang per 24 timer). Standard er AV pluginen sletter ingenting uten ditt eksplisitte samtykke.</value>
<value>Når aktivert slettes meldinger som er eldre enn det konfigurerte vinduet ved hver pluginstart (høyst én gang per 24 timer). Standard er AV: pluginen sletter ingenting uten ditt eksplisitte samtykke.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Standard oppbevaring (dager, 0 = aldri)</value>
@@ -223,7 +223,7 @@
<value>Vis veiviser igjen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Senere behold standarder</value>
<value>Senere: behold standarder</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Lukker veiviseren uten å velge en profil. Plugin-standardene forblir aktive og veiviseren vises igjen ved neste pluginlasting.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Som Privacy First, pluss Say og begge emote-typer for story-loggene dine. Shout og Yell holdes utenfor støy fra fremmede på offentlig avstand er ikke story-innhold. Oppbevaring: Say 30 dager, emotes 90 dager.</value>
<value>Som Privacy First, pluss Say og begge emote-typer for story-loggene dine. Shout og Yell holdes utenfor: støy fra fremmede på offentlig avstand er ikke story-innhold. Oppbevaring: Say 30 dager, emotes 90 dager.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Bruk roleplay</value>
@@ -385,10 +385,10 @@
<value>Hvor ugjennomsiktige plugin-vinduene er. Lavere verdier lar spillet synes gjennom. Skjemafelt og dialoger forblir fullt ugjennomsiktige og lesbare på toppen.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Bruk medfølgende Hellion-skrift (Exo 2)</value>
<value>Bruk innebygd Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Gjengir chat og UI i Exo 2 (SIL Open Font License 1.1), som følger med pluginen. Deaktiver for å falle tilbake til skriften valgt under Innstillinger → Skrift.</value>
<value>Gjengir chat og UI i Inter Light (SIL Open Font License 1.1), som følger med pluginet. Deaktiver for å tilbake til skriften valgt i Innstillinger → Skrift.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>Maksimalt antall på {0} festede tell-faner er nådd. Løsgjør én først, eller bruk Gjør permanent.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Festet overlever relog.</value>
<value>Festet: overlever relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Vis "Merk som hilset"-knapp</value>
</data>
<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>
<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>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Søker etter den eksakte frasen. Søk med flere ord matcher bare når ordene vises sammen i rekkefølge. For å bruke rå FTS5 MATCH-syntaks, sett søkeordet i doble anførselstegn selv.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat viser alle 24 språk, men FFXIVs chat-innmating støtter bare EN, DE, FR og JA fullt ut. Andre skrifter kan vises som forvrengte tegn når de skrives i spillets chat eller sendes som meldinger.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Hurtigvelger for temaer og faner</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temaer</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Faner</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reduser bevegelse</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Deaktiverer temaovergangen, hover-animasjoner for sidepanel og kort samt pulseringen av uleste faner. Temabytter og hover-tilstander brukes i stedet umiddelbart.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+34 -10
View File
@@ -82,7 +82,7 @@
<value>De handmatige uitvoering gebruikt je OPGESLAGEN retentiebeleid, niet de sliderwaarden hierboven. Klik eerst op Opslaan als je wilt dat de uitvoering je huidige wijzigingen toepast.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Voorbeeld is verouderd je whitelist is gewijzigd sinds de laatste vernieuwing. Klik op Vernieuwen om opnieuw te berekenen.</value>
<value>Voorbeeld is verouderd: je whitelist is gewijzigd sinds de laatste vernieuwing. Klik op Vernieuwen om opnieuw te berekenen.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Voorbeeld vernieuwen</value>
@@ -133,7 +133,7 @@
<value>Berichten automatisch verwijderen na het retentievenster van het kanaal</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Als dit is ingeschakeld, worden berichten ouder dan het ingestelde venster bij elke pluginstart verwijderd (maximaal eenmaal per 24 uur). Standaard is UIT de plugin verwijdert niets zonder je uitdrukkelijke toestemming.</value>
<value>Als dit is ingeschakeld, worden berichten ouder dan het ingestelde venster bij elke pluginstart verwijderd (maximaal eenmaal per 24 uur). Standaard is UIT: de plugin verwijdert niets zonder je uitdrukkelijke toestemming.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Standaard retentie (dagen, 0 = nooit)</value>
@@ -223,7 +223,7 @@
<value>Wizard opnieuw tonen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Later standaarden bewaren</value>
<value>Later: standaarden bewaren</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Sluit de wizard zonder een profiel te kiezen. De plugin-standaarden blijven actief en de wizard verschijnt opnieuw bij de volgende keer laden van de plugin.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Zoals Privacy First, plus Say en beide emote-types voor je verhaallogboeken. Shout en Yell blijven buiten beschouwing publiek geluid van vreemden is geen verhaalinhoud. Retentie: Say 30 dagen, emotes 90 dagen.</value>
<value>Zoals Privacy First, plus Say en beide emote-types voor je verhaallogboeken. Shout en Yell blijven buiten beschouwing: publiek geluid van vreemden is geen verhaalinhoud. Retentie: Say 30 dagen, emotes 90 dagen.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Roleplay toepassen</value>
@@ -385,10 +385,10 @@
<value>Hoe ondoorzichtig de pluginvensters zijn. Lagere waarden laten het spel doorschijnen; formuliervelden en dialoogvensters blijven volledig ondoorzichtig en goed leesbaar.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Meegeleverd Hellion-lettertype gebruiken (Exo 2)</value>
<value>Meegeleverde Inter Light gebruiken</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Geeft chat en UI weer in Exo 2 (SIL Open Font License 1.1), dat meegeleverd wordt met de plugin. Schakel uit om terug te vallen op het lettertype dat is geselecteerd onder Instellingen → Lettertype.</value>
<value>Toont chat en UI in Inter Light (SIL Open Font License 1.1), meegeleverd met de plugin. Uitschakelen om terug te keren naar het lettertype in Instellingen → Lettertype.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -489,7 +489,7 @@
<value>Omzetten naar permanent tabblad</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Zet deze TempTell om naar een gewoon tabblad. De tell-koppeling met de gesprekspartner wordt verbroken het tabblad vangt berichten voortaan op via de kanaalsfilters. Gebruik "Tabblad vastpinnen" als je wilt dat het tabblad een relog overleeft terwijl het gekoppeld blijft aan deze gesprekspartner.</value>
<value>Zet deze TempTell om naar een gewoon tabblad. De tell-koppeling met de gesprekspartner wordt verbroken: het tabblad vangt berichten voortaan op via de kanaalsfilters. Gebruik "Tabblad vastpinnen" als je wilt dat het tabblad een relog overleeft terwijl het gekoppeld blijft aan deze gesprekspartner.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Vastgepinde tabbladen overleven een relog en blijven gekoppeld aan deze gesprekspartner.</value>
@@ -507,7 +507,7 @@
<value>Maximum van {0} vastgepinde tell-tabbladen bereikt. Maak er eerst één los, of gebruik Omzetten naar permanent tabblad.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Vastgepind overleeft relog.</value>
<value>Vastgepind: overleeft relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Knop "Markeren als begroet" tonen</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Venstertransparantie</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Hoe transparant de vensterachtergrond is. Lagere waarden laten meer van het spel doorschijnen. Tip: het Dalamud per-venstermenu (hamburger in de titelbalk) biedt per venster eigen instellingen voor dekking, achtergrondvervaging, klikdoorloop en vastpinnen die hebben voorrang op deze schuifregelaar voor het betreffende venster.</value>
<value>Hoe transparant de vensterachtergrond is. Lagere waarden laten meer van het spel doorschijnen. Tip: het Dalamud per-venstermenu (hamburger in de titelbalk) biedt per venster eigen instellingen voor dekking, achtergrondvervaging, klikdoorloop en vastpinnen: die hebben voorrang op deze schuifregelaar voor het betreffende venster.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Lettertypen</value>
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Zoekt naar de exacte woordcombinatie. Zoekopdrachten met meerdere woorden vinden alleen resultaten als de woorden samen en in de juiste volgorde voorkomen. Om ruwe FTS5 MATCH-syntaxis te gebruiken, zet je je zoekterm zelf tussen aanhalingstekens.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat toont alle 24 talen, maar de chat-invoer van FFXIV ondersteunt alleen EN, DE, FR en JA volledig. Andere schriften kunnen als onleesbare tekens verschijnen wanneer ze in de in-game chat worden getypt of als berichten worden verzonden.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Snelkiezer voor thema's en tabbladen</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Thema's</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Tabbladen</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Beweging beperken</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Schakelt de themaovergang, de hover-animaties van de zijbalk en kaarten, en het pulseren van ongelezen tabbladen uit. Themawissels en hover-statussen worden in plaats daarvan direct toegepast.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+35 -12
View File
@@ -19,7 +19,7 @@
<value>Włącz filtr prywatności</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>Gdy włączony, do bazy danych zapisywane są tylko wiadomości z dozwolonych kanałów. Po wyłączeniu obowiązuje domyślne zachowanie wszystko oprócz logów walki jest przechowywane.</value>
<value>Gdy włączony, do bazy danych zapisywane są tylko wiadomości z dozwolonych kanałów. Po wyłączeniu obowiązuje domyślne zachowanie: wszystko oprócz logów walki jest przechowywane.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>Filtr kontroluje wyłącznie to, co trafia do lokalnej bazy danych. W logu czatu nadal widzisz każdą wiadomość na żywo; wykluczone kanały są po prostu przestają być zapisywane. Jeśli chcesz też usunąć kanały z widocznego widoku, użyj standardowych filtrów zakładek czatu w grze.</value>
@@ -82,7 +82,7 @@
<value>Ręczne uruchomienie używa ZAPISANEJ polityki przechowywania, nie wartości suwaków powyżej. Najpierw kliknij Zapisz, jeśli chcesz zastosować bieżące zmiany.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Podgląd jest nieaktualny lista dozwolonych zmieniła się od ostatniego odświeżenia. Kliknij Odśwież, aby przeliczyć.</value>
<value>Podgląd jest nieaktualny: lista dozwolonych zmieniła się od ostatniego odświeżenia. Kliknij Odśwież, aby przeliczyć.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Odśwież podgląd</value>
@@ -133,7 +133,7 @@
<value>Automatycznie usuwaj wiadomości po upływie okresu przechowywania kanału</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Gdy włączone, wiadomości starsze niż skonfigurowany okres są usuwane przy każdym starcie pluginu (najwyżej raz na 24 godziny). Domyślnie WYŁĄCZONE plugin nigdy niczego nie usuwa bez twojej wyraźnej zgody.</value>
<value>Gdy włączone, wiadomości starsze niż skonfigurowany okres są usuwane przy każdym starcie pluginu (najwyżej raz na 24 godziny). Domyślnie WYŁĄCZONE: plugin nigdy niczego nie usuwa bez twojej wyraźnej zgody.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Domyślne przechowywanie (dni, 0 = nigdy)</value>
@@ -223,7 +223,7 @@
<value>Pokaż kreatora ponownie</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Później zachowaj domyślne</value>
<value>Później: zachowaj domyślne</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Zamknij kreatora bez wyboru profilu. Domyślne ustawienia pluginu pozostają aktywne, a kreator pojawi się ponownie przy następnym załadowaniu pluginu.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Jak Privacy First, plus Say i oba typy emote dla twoich logów fabularnych. Shout i Yell są wykluczone hałas z odległości od obcych to nie treść fabularna. Przechowywanie: Say 30 dni, emoty 90 dni.</value>
<value>Jak Privacy First, plus Say i oba typy emote dla twoich logów fabularnych. Shout i Yell są wykluczone: hałas z odległości od obcych to nie treść fabularna. Przechowywanie: Say 30 dni, emoty 90 dni.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Zastosuj roleplay</value>
@@ -385,10 +385,10 @@
<value>Stopień przezroczystości okien pluginu. Niższe wartości pozwalają przeświecać grze; pola formularzy i dialogi pozostają w pełni nieprzezroczyste i czytelne na wierzchu.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Używaj dołączonej czcionki Hellion (Exo 2)</value>
<value>Użyj wbudowanego Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderuje czat i interfejs w Exo 2 (SIL Open Font License 1.1), która jest dołączona do pluginu. Wyłącz, aby powrócić do czcionki wybranej w Ustawieniach → Czcionka.</value>
<value>Renderuje czat i interfejs w Inter Light (licencja SIL Open Font 1.1), dołączonej do wtyczki. Wyłącz, aby powrócić do czcionki wybranej w Ustawienia → Czcionka.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>Hellion Chat to fork Chat 2 autorstwa Infi i Anny (ascclemens). Okno zastępujące czat, integracja IPC, silnik renderowania i cały rdzeń przechowywania danych pochodzą z oryginału.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>Interfejs webowy to jedyna większa część, którą usunąłem. Jest zbudowany do zdalnego dostępu do czatu z drugiego urządzenia inny fokus niż mniejszy domyślny ślad, do którego dąży ten fork. Dostosowanie go do tych ustawień wymagałoby znacznych przeróbek, więc usunięcie było czystym rozwiązaniem dla tego konkretnego forka.</value>
<value>Interfejs webowy to jedyna większa część, którą usunąłem. Jest zbudowany do zdalnego dostępu do czatu z drugiego urządzenia: inny fokus niż mniejszy domyślny ślad, do którego dąży ten fork. Dostosowanie go do tych ustawień wymagałoby znacznych przeróbek, więc usunięcie było czystym rozwiązaniem dla tego konkretnego forka.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Repozytorium upstream:</value>
@@ -489,7 +489,7 @@
<value>Przekształć w stałą zakładkę</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Zamienia ten TempTell w zwykłą zakładkę. Powiązanie tell z partnerem zostaje usunięte od tej pory zakładka będzie przechwytywać wiadomości na podstawie filtrów kanałów. Jeśli chcesz, żeby „zakładka przeżyła relog i pozostała powiązana z tym partnerem", użyj zamiast tego Przypnij zakładkę.</value>
<value>Zamienia ten TempTell w zwykłą zakładkę. Powiązanie tell z partnerem zostaje usunięte: od tej pory zakładka będzie przechwytywać wiadomości na podstawie filtrów kanałów. Jeśli chcesz, żeby „zakładka przeżyła relog i pozostała powiązana z tym partnerem", użyj zamiast tego Przypnij zakładkę.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Przypięte zakładki przeżywają relog i pozostają powiązane z tym partnerem rozmowy.</value>
@@ -507,7 +507,7 @@
<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>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Przypięta przeżywa relog.</value>
<value>Przypięta: przeżywa relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Pokaż przycisk „Oznacz jako powitany/a"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Przezroczystość okna</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Stopień przezroczystości tła okna. Niższe wartości pozwalają przeświecać większej części gry. Wskazówka: menu Dalamud dla każdego okna (hamburger na pasku tytułu) oferuje indywidualne ustawienia przezroczystości, rozmycia tła, klikania przez okno i przypinania dla każdego okna mają one pierwszeństwo przed tym suwakiem dla danego okna.</value>
<value>Stopień przezroczystości tła okna. Niższe wartości pozwalają przeświecać większej części gry. Wskazówka: menu Dalamud dla każdego okna (hamburger na pasku tytułu) oferuje indywidualne ustawienia przezroczystości, rozmycia tła, klikania przez okno i przypinania dla każdego okna: mają one pierwszeństwo przed tym suwakiem dla danego okna.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Czcionki</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Wyszukuje dokładnej frazy. Zapytania wielowyrazowe trafiają tylko wtedy, gdy słowa występują razem w tej samej kolejności. Aby użyć składni raw FTS5 MATCH, samodzielnie otocz swój termin cudzysłowem.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat wyświetla wszystkie 24 języki, ale wprowadzanie czatu FFXIV w pełni obsługuje tylko EN, DE, FR i JA. Inne systemy pisma mogą być wyświetlane jako zniekształcone znaki podczas wpisywania do czatu w grze lub wysyłania wiadomości.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Szybki wybór motywów i kart</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Motywy</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Karty</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Ogranicz ruch</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Wyłącza płynne przejścia motywów, animacje najechania kursorem na pasek boczny i karty oraz pulsowanie nieprzeczytanych kart. Zmiany motywu i stany najechania są wtedy stosowane natychmiast.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+36 -12
View File
@@ -19,7 +19,7 @@
<value>Ativar filtro de privacidade</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>Quando ativado, apenas mensagens dos canais permitidos são salvas no banco de dados. Quando desativado, o comportamento padrão se aplica tudo exceto logs de batalha é armazenado.</value>
<value>Quando ativado, apenas mensagens dos canais permitidos são salvas no banco de dados. Quando desativado, o comportamento padrão se aplica: tudo exceto logs de batalha é armazenado.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>O filtro controla apenas o que é gravado no banco de dados local. O log de bate-papo continua exibindo todas as mensagens em tempo real; canais excluídos simplesmente não são mais armazenados. Se você quiser remover canais da exibição visível também, use os filtros normais de aba de chat no jogo.</value>
@@ -82,7 +82,7 @@
<value>A execução manual usa sua política de retenção SALVA, não os valores dos controles acima. Clique em Salvar primeiro se quiser que a execução aplique suas alterações atuais.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>A prévia está desatualizada sua lista de permissões mudou desde a última atualização. Clique em Atualizar para recalcular.</value>
<value>A prévia está desatualizada: sua lista de permissões mudou desde a última atualização. Clique em Atualizar para recalcular.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Atualizar prévia</value>
@@ -133,7 +133,7 @@
<value>Excluir automaticamente mensagens além do período de retenção do canal</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Quando ativado, mensagens mais antigas que o período configurado são excluídas a cada inicialização do plugin (no máximo uma vez a cada 24 horas). O padrão é DESATIVADO o plugin nunca exclui nada sem o seu consentimento explícito.</value>
<value>Quando ativado, mensagens mais antigas que o período configurado são excluídas a cada inicialização do plugin (no máximo uma vez a cada 24 horas). O padrão é DESATIVADO: o plugin nunca exclui nada sem o seu consentimento explícito.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Retenção padrão (dias, 0 = nunca)</value>
@@ -223,7 +223,7 @@
<value>Mostrar assistente novamente</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Depois manter padrões</value>
<value>Depois: manter padrões</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Fecha o assistente sem selecionar um perfil. Os padrões do plugin continuam ativos e o assistente reaparece na próxima vez que o plugin for carregado.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Como Privacy First, mais Say e ambos os tipos de emote para seus logs de história. Shout e Yell ficam de fora barulho de distância pública de desconhecidos não é conteúdo de história. Retenção: Say 30 dias, emotes 90 dias.</value>
<value>Como Privacy First, mais Say e ambos os tipos de emote para seus logs de história. Shout e Yell ficam de fora: barulho de distância pública de desconhecidos não é conteúdo de história. Retenção: Say 30 dias, emotes 90 dias.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Aplicar roleplay</value>
@@ -385,10 +385,10 @@
<value>O nível de opacidade das janelas do plugin. Valores menores deixam o jogo aparecer por baixo; campos de formulário e diálogos permanecem totalmente opacos e legíveis por cima.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Usar fonte Hellion incluída (Exo 2)</value>
<value>Usar Inter Light incluído</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderiza o chat e a interface em Exo 2 (SIL Open Font License 1.1), que acompanha o plugin. Desative para voltar à fonte selecionada em Configurações → Fonte.</value>
<value>Exibe o chat e a interface em Inter Light (licença SIL Open Font 1.1), incluída no plugin. Desative para voltar à fonte selecionada em Configurações → Fonte.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>O Hellion Chat é um fork do Chat 2 de Infi e Anna (ascclemens). A janela de substituição de chat, integração IPC, motor de renderização e todo o núcleo de armazenamento vêm do original.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>A interface web é a única peça importante que removi. Ela é construída para acesso remoto ao chat a partir de um segundo dispositivo um foco diferente da pegada padrão menor que este fork busca. Adaptá-la a esses padrões teria exigido uma reformulação significativa, então removê-la foi o caminho limpo para este fork específico.</value>
<value>A interface web é a única peça importante que removi. Ela é construída para acesso remoto ao chat a partir de um segundo dispositivo: um foco diferente da pegada padrão menor que este fork busca. Adaptá-la a esses padrões teria exigido uma reformulação significativa, então removê-la foi o caminho limpo para este fork específico.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Repositório upstream:</value>
@@ -489,7 +489,7 @@
<value>Promover para permanente</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Transforma este TempTell em uma aba regular. O vínculo de tell com o parceiro é removido a aba passará a capturar mensagens pelos filtros de canal a partir de agora. Para "aba sobrevive ao relog mantendo o vínculo com este parceiro", use Fixar aba.</value>
<value>Transforma este TempTell em uma aba regular. O vínculo de tell com o parceiro é removido: a aba passará a capturar mensagens pelos filtros de canal a partir de agora. Para "aba sobrevive ao relog mantendo o vínculo com este parceiro", use Fixar aba.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Abas fixadas sobrevivem ao relog e permanecem vinculadas a este parceiro de conversa.</value>
@@ -507,7 +507,7 @@
<value>Limite máximo de {0} abas de tell fixadas atingido. Desafixe uma primeiro ou use Promover para permanente.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fixado sobrevive ao relog.</value>
<value>Fixado: sobrevive ao relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Mostrar botão "Marcar como cumprimentado"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Transparência da janela</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>O nível de transparência do fundo da janela. Valores menores deixam mais do jogo aparecer. Dica: o menu por janela do Dalamud (hambúrguer na barra de título) oferece ajustes individuais de opacidade, desfoque de fundo, clique passante e fixação esses têm prioridade sobre este controle para a janela respectiva.</value>
<value>O nível de transparência do fundo da janela. Valores menores deixam mais do jogo aparecer. Dica: o menu por janela do Dalamud (hambúrguer na barra de título) oferece ajustes individuais de opacidade, desfoque de fundo, clique passante e fixação: esses têm prioridade sobre este controle para a janela respectiva.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Fontes</value>
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Busca pela frase exata. Consultas com várias palavras correspondem apenas quando as palavras aparecem juntas em ordem. Para usar a sintaxe raw FTS5 MATCH, envolva seu termo em aspas duplas você mesmo.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>O HellionChat exibe todos os 24 idiomas, mas a entrada de chat do FFXIV oferece suporte completo apenas para EN, DE, FR e JA. Outros alfabetos podem aparecer como caracteres ilegíveis ao digitar no chat do jogo ou enviar mensagens.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Seletor rápido de temas e abas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Abas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reduzir movimento</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Desativa a transição de temas, as animações de foco da barra lateral e dos cartões e a pulsação de abas não lidas. As trocas de tema e os estados de foco passam a ser aplicados instantaneamente.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+35 -12
View File
@@ -19,7 +19,7 @@
<value>Ativar filtro de privacidade</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>Quando ativo, só são guardadas na base de dados as mensagens dos canais permitidos. Quando inativo, aplica-se o comportamento predefinido tudo exceto os registos de batalha é armazenado.</value>
<value>Quando ativo, só são guardadas na base de dados as mensagens dos canais permitidos. Quando inativo, aplica-se o comportamento predefinido: tudo exceto os registos de batalha é armazenado.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>O filtro controla apenas o que é escrito na base de dados local. O registo de chat continua a mostrar todas as mensagens em tempo real; os canais excluídos deixam simplesmente de ser armazenados. Se também quiseres remover canais da visualização, usa os filtros normais de separadores de chat no jogo.</value>
@@ -82,7 +82,7 @@
<value>A execução manual usa a tua política de retenção GUARDADA, não os valores do cursor acima. Clica em Guardar primeiro se quiseres que a execução aplique as tuas alterações atuais.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>A pré-visualização está desatualizada a tua lista de permissões mudou desde a última atualização. Clica em Atualizar para recalcular.</value>
<value>A pré-visualização está desatualizada: a tua lista de permissões mudou desde a última atualização. Clica em Atualizar para recalcular.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Atualizar pré-visualização</value>
@@ -133,7 +133,7 @@
<value>Eliminar automaticamente mensagens após o período de retenção do canal</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Quando ativo, as mensagens mais antigas do que o período configurado são eliminadas em cada arranque do plugin (no máximo uma vez a cada 24 horas). A predefinição é DESATIVADO o plugin nunca elimina nada sem o teu consentimento explícito.</value>
<value>Quando ativo, as mensagens mais antigas do que o período configurado são eliminadas em cada arranque do plugin (no máximo uma vez a cada 24 horas). A predefinição é DESATIVADO: o plugin nunca elimina nada sem o teu consentimento explícito.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Retenção predefinida (dias, 0 = nunca)</value>
@@ -223,7 +223,7 @@
<value>Mostrar assistente novamente</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Mais tarde manter predefinições</value>
<value>Mais tarde: manter predefinições</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Fecha o assistente sem selecionar um perfil. As predefinições do plugin ficam ativas e o assistente reaparece no próximo carregamento do plugin.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Como Privacy First, mais Say e ambos os tipos de emote para os teus registos de história. Shout e Yell ficam de fora o ruído de distância pública de desconhecidos não é conteúdo de história. Retenção: Say 30 dias, emotes 90 dias.</value>
<value>Como Privacy First, mais Say e ambos os tipos de emote para os teus registos de história. Shout e Yell ficam de fora: o ruído de distância pública de desconhecidos não é conteúdo de história. Retenção: Say 30 dias, emotes 90 dias.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Aplicar roleplay</value>
@@ -385,10 +385,10 @@
<value>Quão opacas são as janelas do plugin. Valores mais baixos deixam o jogo aparecer por detrás; os campos de formulário e diálogos mantêm-se completamente opacos e legíveis por cima.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Usar a fonte Hellion incluída (Exo 2)</value>
<value>Usar Inter Light incluído</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Apresenta o chat e a interface em Exo 2 (SIL Open Font License 1.1), que é fornecida com o plugin. Desativa para usar a fonte selecionada em Definições → Tipo de letra.</value>
<value>Apresenta o chat e a interface em Inter Light (licença SIL Open Font 1.1), incluída no plugin. Desative para regressar à fonte selecionada em Definições → Fonte.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>O Hellion Chat é um fork do Chat 2 de Infi e Anna (ascclemens). A janela de substituição de chat, a integração IPC, o motor de renderização e todo o núcleo de armazenamento provêm do original.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>A interface web é a única parte importante que removi. Foi concebida para acesso remoto ao chat a partir de um segundo dispositivo um foco diferente do footprint predefinido mais reduzido que este fork persegue. Adaptá-la a estas predefinições teria exigido um trabalho significativo, por isso removê-la foi o caminho limpo para este fork em particular.</value>
<value>A interface web é a única parte importante que removi. Foi concebida para acesso remoto ao chat a partir de um segundo dispositivo: um foco diferente do footprint predefinido mais reduzido que este fork persegue. Adaptá-la a estas predefinições teria exigido um trabalho significativo, por isso removê-la foi o caminho limpo para este fork em particular.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Repositório upstream:</value>
@@ -489,7 +489,7 @@
<value>Promover a permanente</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Transforma este TempTell num separador normal. A ligação de tell ao parceiro é removida o separador passará a capturar mensagens pelos seus filtros de canal. Para "separador sobrevive ao relog mantendo a ligação a este parceiro", usa Fixar separador.</value>
<value>Transforma este TempTell num separador normal. A ligação de tell ao parceiro é removida: o separador passará a capturar mensagens pelos seus filtros de canal. Para "separador sobrevive ao relog mantendo a ligação a este parceiro", usa Fixar separador.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Os separadores fixos sobrevivem ao relog e mantêm a ligação a este parceiro de conversa.</value>
@@ -507,7 +507,7 @@
<value>Máximo de {0} separadores de tell fixos atingido. Desfixa um primeiro, ou usa Promover a permanente.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fixado sobrevive ao relog.</value>
<value>Fixado: sobrevive ao relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Mostrar botão "Marcar como cumprimentado"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Transparência da janela</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Quão transparente é o fundo da janela. Valores mais baixos deixam mais do jogo aparecer por detrás. Dica: o menu por janela do Dalamud (hamburger na barra de título) oferece substituições por janela para opacidade, desfoque de fundo, clique transparente e fixação têm precedência sobre este cursor para a janela em questão.</value>
<value>Quão transparente é o fundo da janela. Valores mais baixos deixam mais do jogo aparecer por detrás. Dica: o menu por janela do Dalamud (hamburger na barra de título) oferece substituições por janela para opacidade, desfoque de fundo, clique transparente e fixação: têm precedência sobre este cursor para a janela em questão.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Tipos de letra</value>
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Pesquisa a frase exata. As consultas com várias palavras só correspondem quando as palavras aparecem juntas e por essa ordem. Para usar a sintaxe FTS5 MATCH diretamente, coloca o teu termo entre aspas duplas.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>O HellionChat apresenta os 24 idiomas, mas a entrada de chat do FFXIV apenas suporta totalmente EN, DE, FR e JA. Outros alfabetos podem aparecer como caracteres ilegíveis ao escrever no chat do jogo ou enviar mensagens.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Seletor rápido de temas e separadores</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temas</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Separadores</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reduzir movimento</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Desativa a transição de temas, as animações de passagem do rato sobre a barra lateral e os cartões e a pulsação de separadores não lidos. As mudanças de tema e os estados de passagem do rato passam a ser aplicados instantaneamente.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+72 -12
View File
@@ -19,7 +19,7 @@
<value>Enable privacy filter</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>When enabled, only messages from allowed channels are written to the database. When disabled, the default behaviour applies — everything except battle logs is stored.</value>
<value>When enabled, only messages from allowed channels are written to the database. When disabled, the default behaviour applies. Everything except battle logs is stored.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>The filter only controls what is written to the local database. The chat log still shows every message live; excluded channels are simply no longer stored. If you also want to remove channels from the visible display, use the normal chat-tab filters in the game.</value>
@@ -82,7 +82,7 @@
<value>The manual run uses your SAVED retention policy, not the slider values above. Click Save first if you want the run to apply your current changes.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Preview is stale your whitelist has changed since the last refresh. Click Refresh to recalculate.</value>
<value>Preview is stale: your whitelist has changed since the last refresh. Click Refresh to recalculate.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Refresh preview</value>
@@ -133,7 +133,7 @@
<value>Automatically delete messages past their channel retention window</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>When enabled, messages older than the configured window are deleted on each plugin start (at most once every 24 hours). Default is OFF — the plugin never deletes anything without your explicit consent.</value>
<value>When enabled, messages older than the configured window are deleted on each plugin start (at most once every 24 hours). Default is OFF. The plugin never deletes anything without your explicit consent.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Default retention (days, 0 = never)</value>
@@ -223,7 +223,7 @@
<value>Show wizard again</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Later keep defaults</value>
<value>Later: keep defaults</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Close the wizard without selecting a profile. The plugin defaults stay active and the wizard returns on next plugin load.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Like Privacy First, plus Say and both emote types for your story logs. Shout and Yell stay out — public-distance noise from strangers is not story content. Retention: Say 30 days, emotes 90 days.</value>
<value>Like Privacy First, plus Say and both emote types for your story logs. Shout and Yell stay out. Public-distance noise from strangers is not story content. Retention: Say 30 days, emotes 90 days.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Apply roleplay</value>
@@ -385,10 +385,10 @@
<value>How opaque the plugin windows are. Lower values let the game show through; form fields and dialogs stay fully opaque and readable on top.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Use bundled Hellion font (Exo 2)</value>
<value>Use bundled Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renders chat and UI in Exo 2 (SIL Open Font License 1.1), which ships with the plugin. Disable to fall back to the font selected under Settings → Font.</value>
<value>Renders chat and UI in Inter Light (SIL Open Font License 1.1), which ships with the plugin. Disable to fall back to the font selected under Settings → Font.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -421,7 +421,7 @@
<value>Hellion Chat is a fork of Chat 2 by Infi and Anna (ascclemens). The chat-replacement window, IPC integration, render engine, and the entire storage core all come from the original.</value>
</data>
<data name="About_BuiltOn_P2" xml:space="preserve">
<value>The web interface is the only major piece I removed. It is built for remote access to the chat from a second device a different focus from the smaller default footprint this fork pursues. Adapting it to these defaults would have required significant rework, so removing it was the clean path for this particular fork.</value>
<value>The web interface is the only major piece I removed. It is built for remote access to the chat from a second device: a different focus from the smaller default footprint this fork pursues. Adapting it to these defaults would have required significant rework, so removing it was the clean path for this particular fork.</value>
</data>
<data name="About_BuiltOn_Upstream_Label" xml:space="preserve">
<value>Upstream repository:</value>
@@ -489,7 +489,7 @@
<value>Promote to permanent</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Turns this TempTell into a regular tab. The tell binding to the partner is dropped — the tab will catch messages by its channel filters from now on. For "tab survives relog while staying bound to this partner", use Pin Tab instead.</value>
<value>Turns this TempTell into a regular tab. The tell binding to the partner is dropped. The tab will catch messages by its channel filters from now on. For "tab survives relog while staying bound to this partner", use Pin Tab instead.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Pinned tabs survive relog and stay bound to this conversation partner.</value>
@@ -507,7 +507,7 @@
<value>Maximum of {0} pinned tell tabs reached. Unpin one first, or use Promote to permanent.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Pinned survives relog.</value>
<value>Pinned: survives relog.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Show "Mark as greeted" button</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Window transparency</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>How transparent the window background is. Lower values let more of the game show through. Tip: Dalamud's per-window menu (hamburger in the title bar) offers per-window overrides for opacity, background blur, click-through, and pinning — those take precedence over this slider for the respective window.</value>
<value>How transparent the window background is. Lower values let more of the game show through. Tip: Dalamud's per-window menu (hamburger in the title bar) offers per-window overrides for opacity, background blur, click-through, and pinning. Those take precedence over this slider for the respective window.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Fonts</value>
@@ -1030,4 +1030,64 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Searches for the exact phrase. Multi-word queries match only when the words appear together in order. To use raw FTS5 MATCH syntax, wrap your term in double quotes yourself.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat renders all 24 languages, but FFXIV's chat input only fully supports EN, DE, FR and JA. Other scripts may display as garbled characters when typed into the in-game chat or sent as messages.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Quick picker for themes and tabs</value>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Themes</value>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Tabs</value>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reduce motion</value>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Disables the theme crossfade, the sidebar and card-row hover animations, and the unread-tab pulse. Theme switches and hover states apply instantly instead.</value>
</data>
<!-- Failed-tell notification -->
<data name="FailedTell_Notification_Generic" xml:space="preserve">
<value>A tell could not be delivered.</value>
</data>
<data name="FailedTell_Notification_Named" xml:space="preserve">
<value>Tell to {0} could not be delivered.</value>
</data>
<data name="Settings_Chat_NotifyFailedTell_Name" xml:space="preserve">
<value>Notify on failed tell</value>
</data>
<data name="Settings_Chat_NotifyFailedTell_Description" xml:space="preserve">
<value>Show a toast when a tell you sent could not be delivered (recipient offline, in an instance, or blocking you).</value>
</data>
<!-- Per-tab notification sound -->
<data name="Tabs_NotificationSound_Enable_Name" xml:space="preserve">
<value>Notification sound</value>
</data>
<data name="Tabs_NotificationSound_Description" xml:space="preserve">
<value>Play a sound when a message arrives in this tab while you are looking at a different tab. Respects the global sound toggle.</value>
</data>
<data name="Tabs_NotificationSound_Option" xml:space="preserve">
<value>Sound</value>
</data>
<data name="Tabs_NotificationSound_Preview" xml:space="preserve">
<value>Preview the selected sound</value>
</data>
<data name="Tabs_NotificationSound_CustomOption" xml:space="preserve">
<value>Hellion sound</value>
</data>
<!-- Scroll-to-bottom and item/flag linking -->
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
<value>Jump to the latest message</value>
</data>
<data name="ChatLog_Insert_MapFlag" xml:space="preserve">
<value>Insert map flag &lt;flag&gt;</value>
</data>
<data name="ChatLog_Insert_ItemLink" xml:space="preserve">
<value>Insert linked item &lt;item&gt;</value>
</data>
</root>
+35 -11
View File
@@ -19,7 +19,7 @@
<value>Activează filtrul de confidențialitate</value>
</data>
<data name="Privacy_FilterEnabled_Description" xml:space="preserve">
<value>Când este activat, doar mesajele din canalele permise sunt salvate în baza de date. Când este dezactivat, comportamentul implicit se aplică totul, cu excepția jurnalelor de luptă, este stocat.</value>
<value>Când este activat, doar mesajele din canalele permise sunt salvate în baza de date. Când este dezactivat, comportamentul implicit se aplică: totul, cu excepția jurnalelor de luptă, este stocat.</value>
</data>
<data name="Privacy_FilterEnabled_StorageOnly_Help" xml:space="preserve">
<value>Filtrul controlează doar ce se scrie în baza de date locală. Jurnalul de chat afișează în continuare fiecare mesaj în timp real; canalele excluse nu mai sunt stocate, atât. Dacă vrei să elimini canale și din afișajul vizibil, folosește filtrele normale de tab din joc.</value>
@@ -82,7 +82,7 @@
<value>Rularea manuală folosește politica de retenție SALVATĂ, nu valorile sliderelor de mai sus. Apasă Salvează întâi dacă vrei ca rularea să aplice modificările curente.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Previzualizarea este depășită lista albă s-a schimbat de la ultima reîmprospătare. Apasă Reîmprospătează pentru a recalcula.</value>
<value>Previzualizarea este depășită: lista albă s-a schimbat de la ultima reîmprospătare. Apasă Reîmprospătează pentru a recalcula.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Reîmprospătează previzualizarea</value>
@@ -133,7 +133,7 @@
<value>Șterge automat mesajele care depășesc fereastra de retenție a canalului</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>Când este activat, mesajele mai vechi decât fereastra configurată sunt șterse la fiecare pornire a plugin-ului (cel mult o dată la 24 de ore). Implicit este DEZACTIVAT plugin-ul nu șterge nimic fără consimțământul tău explicit.</value>
<value>Când este activat, mesajele mai vechi decât fereastra configurată sunt șterse la fiecare pornire a plugin-ului (cel mult o dată la 24 de ore). Implicit este DEZACTIVAT: plugin-ul nu șterge nimic fără consimțământul tău explicit.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Retenție implicită (zile, 0 = niciodată)</value>
@@ -223,7 +223,7 @@
<value>Arată asistentul din nou</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Mai târziu păstrează implicit</value>
<value>Mai târziu: păstrează implicit</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Închide asistentul fără a selecta un profil. Setările implicite ale plugin-ului rămân active și asistentul va reapărea la următoarea încărcare a plugin-ului.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Ca Privacy First, plus Say și ambele tipuri de emote pentru jurnalele de poveste. Shout și Yell rămân excluse zgomotul de la distanță de la necunoscuți nu este conținut de poveste. Retenție: Say 30 zile, emote 90 zile.</value>
<value>Ca Privacy First, plus Say și ambele tipuri de emote pentru jurnalele de poveste. Shout și Yell rămân excluse: zgomotul de la distanță de la necunoscuți nu este conținut de poveste. Retenție: Say 30 zile, emote 90 zile.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Aplică roleplay</value>
@@ -385,10 +385,10 @@
<value>Cât de opace sunt ferestrele plugin-ului. Valorile mai mici lasă jocul să se vadă prin fereastră; câmpurile de formular și dialogurile rămân complet opace și lizibile deasupra.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Folosește fontul Hellion inclus (Exo 2)</value>
<value>Folosește Inter Light inclus</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Randează chatul și interfața în Exo 2 (SIL Open Font License 1.1), inclus în plugin. Dezactivează pentru a reveni la fontul selectat din Setări → Font.</value>
<value>Afișează chatul și interfața în Inter Light (licență SIL Open Font 1.1), inclus în plugin. Dezactivează pentru a reveni la fontul selectat în Setări → Font.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -489,7 +489,7 @@
<value>Promovează la permanent</value>
</data>
<data name="PinTab_PromoteTooltip" xml:space="preserve">
<value>Transformă acest TempTell într-un tab obișnuit. Legătura tell cu partenerul este eliminată tab-ul va prinde mesaje după filtrele de canal de acum înainte. Pentru „tab supraviețuiește relog rămânând legat de acest partener", folosește Fixează tab-ul.</value>
<value>Transformă acest TempTell într-un tab obișnuit. Legătura tell cu partenerul este eliminată: tab-ul va prinde mesaje după filtrele de canal de acum înainte. Pentru „tab supraviețuiește relog rămânând legat de acest partener", folosește Fixează tab-ul.</value>
</data>
<data name="PinTab_PinTooltip" xml:space="preserve">
<value>Tab-urile fixate supraviețuiesc relog-ului și rămân legate de acest partener de conversație.</value>
@@ -507,7 +507,7 @@
<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>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fixat supraviețuiește relog-ului.</value>
<value>Fixat: supraviețuiește relog-ului.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Arată butonul „Marchează ca salutat"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Transparența ferestrei</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Cât de transparent este fundalul ferestrei. Valorile mai mici lasă mai mult din joc să se vadă. Sfat: meniul per-fereastră al Dalamud (hamburger în bara de titlu) oferă suprascrieri per fereastră pentru opacitate, blur de fundal, click-through și fixare acestea au prioritate față de acest slider pentru fereastra respectivă.</value>
<value>Cât de transparent este fundalul ferestrei. Valorile mai mici lasă mai mult din joc să se vadă. Sfat: meniul per-fereastră al Dalamud (hamburger în bara de titlu) oferă suprascrieri per fereastră pentru opacitate, blur de fundal, click-through și fixare: acestea au prioritate față de acest slider pentru fereastra respectivă.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Fonturi</value>
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Caută expresia exactă. Interogările cu mai multe cuvinte se potrivesc doar când cuvintele apar împreună în ordine. Pentru a folosi sintaxa brută FTS5 MATCH, înconjoară termenul cu ghilimele duble tu însuți.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat afișează toate cele 24 de limbi, dar intrarea chatului FFXIV acceptă complet doar EN, DE, FR și JA. Alte scrieri pot apărea ca caractere deteriorate când sunt tastate în chatul jocului sau trimise ca mesaje.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Selector rapid pentru teme și file</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Teme</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>File</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Reducere mișcare</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Dezactivează tranziția temelor, animațiile la trecerea cursorului peste bara laterală și carduri și pulsația filelor necitite. Schimbările de temă și stările de cursor se aplică instantaneu.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+26 -2
View File
@@ -385,10 +385,10 @@
<value>Степень непрозрачности окон плагина. Меньшие значения позволяют просвечивать игре; поля форм и диалоги остаются полностью непрозрачными и читаемыми поверх.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Использовать встроенный шрифт Hellion (Exo 2)</value>
<value>Использовать встроенный Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Отображает чат и интерфейс шрифтом Exo 2 (SIL Open Font License 1.1), поставляемым с плагином. Отключите для использования шрифта, выбранного в разделе Настройки → Шрифт.</value>
<value>Отображает чат и интерфейс в шрифте Inter Light (лицензия SIL Open Font 1.1), поставляемом с плагином. Отключите, чтобы вернуться к шрифту, выбранному в Настройки → Шрифт.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Поиск точной фразы. Запросы из нескольких слов совпадают только если слова стоят рядом и в том же порядке. Для использования синтаксиса FTS5 MATCH оберните свой запрос в двойные кавычки самостоятельно.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat отображает все 24 языка, но ввод чата FFXIV полностью поддерживает только EN, DE, FR и JA. Другие письменности могут отображаться как искажённые символы при наборе во внутриигровом чате или отправке сообщений.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Быстрый выбор тем и вкладок</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Темы</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Вкладки</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Уменьшить движение</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Отключает плавное переключение тем, анимации наведения для боковой панели и карточек, а также пульсацию непрочитанных вкладок. Смена темы и состояния наведения применяются мгновенно.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+33 -9
View File
@@ -82,7 +82,7 @@
<value>Den manuella körningen använder din SPARADE lagringspolicy, inte skjutreglagevärdena ovan. Klicka Spara först om du vill att körningen ska tillämpa dina aktuella ändringar.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Förhandsgranskningen är inaktuell din vitlista har ändrats sedan senaste uppdateringen. Klicka Uppdatera för att räkna om.</value>
<value>Förhandsgranskningen är inaktuell: din vitlista har ändrats sedan senaste uppdateringen. Klicka Uppdatera för att räkna om.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Uppdatera förhandsgranskning</value>
@@ -133,7 +133,7 @@
<value>Radera automatiskt meddelanden som passerat kanalens lagringstid</value>
</data>
<data name="Retention_Enabled_Description" xml:space="preserve">
<value>När det är aktiverat raderas meddelanden som är äldre än det konfigurerade tidsfönstret vid varje pluginstart (högst en gång per 24 timmar). Standard är AV pluginen raderar ingenting utan ditt uttryckliga samtycke.</value>
<value>När det är aktiverat raderas meddelanden som är äldre än det konfigurerade tidsfönstret vid varje pluginstart (högst en gång per 24 timmar). Standard är AV: pluginen raderar ingenting utan ditt uttryckliga samtycke.</value>
</data>
<data name="Retention_Default_Label" xml:space="preserve">
<value>Standardlagring (dagar, 0 = aldrig)</value>
@@ -223,7 +223,7 @@
<value>Visa guiden igen</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Senare behåll standardinställningar</value>
<value>Senare: behåll standardinställningar</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Stänger guiden utan att välja en profil. Pluginens standardinställningar förblir aktiva och guiden visas igen vid nästa pluginladdning.</value>
@@ -253,7 +253,7 @@
<value>Roleplay</value>
</data>
<data name="Wizard_Profile_Roleplay_Description" xml:space="preserve">
<value>Som Privacy First, plus Säg och båda emotetyperna för dina berättarloggar. Ropa och Skrika ingår inte offentligt avståndsbrus från okända tillhör inte berättelseinnehåll. Lagring: Säg 30 dagar, emotes 90 dagar.</value>
<value>Som Privacy First, plus Säg och båda emotetyperna för dina berättarloggar. Ropa och Skrika ingår inte: offentligt avståndsbrus från okända tillhör inte berättelseinnehåll. Lagring: Säg 30 dagar, emotes 90 dagar.</value>
</data>
<data name="Wizard_Profile_Roleplay_Apply" xml:space="preserve">
<value>Tillämpa roleplay</value>
@@ -385,10 +385,10 @@
<value>Hur ogenomskinliga pluginfönstren är. Lägre värden låter spelet synas igenom. Formulärfält och dialoger förblir helt ogenomskinliga och läsbara överst.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Använd medföljande Hellion-teckensnitt (Exo 2)</value>
<value>Använd inbäddat Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Renderar chatt och gränssnitt i Exo 2 (SIL Open Font License 1.1), som medföljer pluginen. Inaktivera för att återgå till teckensnittet valt under Inställningar → Teckensnitt.</value>
<value>Renderar chatt och UI i Inter Light (SIL Open Font License 1.1), som följer med pluginet. Inaktivera för att återgå till typsnittet som valts i Inställningar → Typsnitt.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<value>Maximalt {0} fästa tell-flikar nått. Lossa en först, eller använd Uppgradera till permanent.</value>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Fäst överlever omloggning.</value>
<value>Fäst: överlever omloggning.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -536,7 +536,7 @@
<value>Visa knappen "Markera som hälsad"</value>
</data>
<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>
<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>
@@ -905,7 +905,7 @@
<value>Fönstrets genomskinlighet</value>
</data>
<data name="Settings_ThemeAndLayout_WindowOpacity_Description" xml:space="preserve">
<value>Hur genomskinlig fönsterbakgrunden är. Lägre värden låter mer av spelet synas igenom. Tips: Dalamud's per-fönster-meny (hamburgaren i namnlisten) erbjuder per-fönster-överstyrningar för opacitet, bakgrundsoskärpa, klickigenom och fästning de har företräde framför det här reglaget för respektive fönster.</value>
<value>Hur genomskinlig fönsterbakgrunden är. Lägre värden låter mer av spelet synas igenom. Tips: Dalamud's per-fönster-meny (hamburgaren i namnlisten) erbjuder per-fönster-överstyrningar för opacitet, bakgrundsoskärpa, klickigenom och fästning: de har företräde framför det här reglaget för respektive fönster.</value>
</data>
<data name="Settings_FontsAndColours_Fonts_Heading" xml:space="preserve">
<value>Teckensnitt</value>
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Söker efter den exakta frasen. Flerdordsfrågor matchar bara när orden förekommer tillsammans i ordning. Om du vill använda rå FTS5 MATCH-syntax, omge din term med dubbla citattecken själv.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat visar alla 24 språk, men FFXIV:s chattinmatning stödjer endast EN, DE, FR och JA fullt ut. Andra skriftsystem kan visas som förvrängda tecken när de skrivs i spelets chatt eller skickas som meddelanden.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Snabbväljare för teman och flikar</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Teman</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Flikar</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Minska rörelse</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Inaktiverar temaövergången, hover-animationerna för sidofältet och korten samt pulseringen av olästa flikar. Temabyten och hover-tillstånd tillämpas i stället direkt.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+28 -5
View File
@@ -82,7 +82,7 @@
<value>Manuel çalıştırma, yukarıdaki kaydırıcı değerleri değil KAYITLI saklama politikasını kullanır. Mevcut değişikliklerinin uygulanmasını istiyorsan önce Kaydet'e tıkla.</value>
</data>
<data name="Cleanup_Preview_Stale" xml:space="preserve">
<value>Önizleme güncel değil beyaz listen son yenilemeden bu yana değişti. Yeniden hesaplamak için Yenile'ye tıkla.</value>
<value>Önizleme güncel değil: beyaz listen son yenilemeden bu yana değişti. Yeniden hesaplamak için Yenile'ye tıkla.</value>
</data>
<data name="Cleanup_RefreshPreview" xml:space="preserve">
<value>Önizlemeyi yenile</value>
@@ -223,7 +223,7 @@
<value>Sihirbazı tekrar göster</value>
</data>
<data name="Wizard_Cancel_Label" xml:space="preserve">
<value>Sonra varsayılanları koru</value>
<value>Sonra: varsayılanları koru</value>
</data>
<data name="Wizard_Cancel_Tooltip" xml:space="preserve">
<value>Profil seçmeden sihirbazı kapat. Eklenti varsayılanları etkin kalır ve sihirbaz bir sonraki eklenti yüklemesinde tekrar açılır.</value>
@@ -385,10 +385,10 @@
<value>Eklenti pencerelerinin ne kadar opak olduğu. Düşük değerler oyunun arkadan görünmesini sağlar; form alanları ve diyaloglar tamamen opak ve okunabilir kalır.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Dahili Hellion yazı tipini kullan (Exo 2)</value>
<value>Yerleşik Inter Light'ı kullan</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Sohbet ve arayüzü eklentiyle birlikte gelen Exo 2 (SIL Open Font License 1.1) ile render eder. Ayarlar → Yazı Tipi altında seçilen yazı tipine dönmek için devre dışı bırak.</value>
<value>Sohbet ve arayüzü, eklentiyle birlikte gelen Inter Light (SIL Open Font Lisansı 1.1) ile gösterir. Ayarlar → Yazı tipi'nde seçili yazı tipine dönmek için devre dışı bırakın.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -507,7 +507,7 @@
<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>
</data>
<data name="PinTab_PinnedTooltip" xml:space="preserve">
<value>Sabitlenmiş yeniden girişten sonra hayatta kalır.</value>
<value>Sabitlenmiş: yeniden girişten sonra hayatta kalır.</value>
</data>
<!-- Hellion Chat — Auto-Tell-Tabs (Chat settings tab) -->
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Tam ifadeyi arar. Çok kelimeli sorgular yalnızca kelimeler sırayla birlikte göründüğünde eşleşir. Ham FTS5 MATCH sözdizimini kullanmak için kendi arama terimini çift tırnak içine al.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat 24 dilin tümünü gösterir, ancak FFXIV'in sohbet girişi yalnızca EN, DE, FR ve JA dillerini tam olarak destekler. Diğer alfabeler, oyun içi sohbete yazıldığında veya mesaj olarak gönderildiğinde bozuk karakterler olarak görünebilir.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Temalar ve sekmeler için hızlı seçici</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Temalar</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Sekmeler</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Hareketi azalt</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Tema geçişini, kenar çubuğu ve kart vurgulama animasyonlarını ve okunmamış sekme nabzını devre dışı bırakır. Tema değişiklikleri ve vurgulama durumları bunun yerine anında uygulanır.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+25 -2
View File
@@ -385,10 +385,10 @@
<value>Рівень непрозорості вікон плагіна. Нижчі значення дозволяють грі просвічуватись крізь вікно; поля форм і діалоги залишаються повністю непрозорими і добре читабельними поверх.</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>Використовувати вбудований шрифт Hellion (Exo 2)</value>
<value>Використовувати вбудований Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>Відображає чат і інтерфейс шрифтом Exo 2 (SIL Open Font License 1.1), що постачається разом із плагіном. Вимкніть, щоб повернутись до шрифту, вибраного в розділі Налаштування → Шрифт.</value>
<value>Відображає чат та інтерфейс у шрифті Inter Light (ліцензія SIL Open Font 1.1), що постачається з плагіном. Вимкніть, щоб повернутися до шрифту, обраного в Налаштування → Шрифт.</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,27 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>Шукає точну фразу. Запити з кількох слів збігаються лише тоді, коли слова стоять разом у вказаному порядку. Щоб використовувати синтаксис FTS5 MATCH напряму, оберніть запит у подвійні лапки самостійно.</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat відображає всі 24 мови, але введення чату FFXIV повністю підтримує лише EN, DE, FR та JA. Інші писемності можуть відображатися як спотворені символи під час введення в ігровий чат або надсилання повідомлень.</value>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>Швидкий вибір тем і вкладок</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>Теми</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>Вкладки</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>Зменшити рух</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>Вимикає плавне перемикання тем, анімації наведення для бічної панелі та карток, а також пульсацію непрочитаних вкладок. Зміна теми та стани наведення застосовуються миттєво.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
@@ -385,10 +385,10 @@
<value>插件窗口的不透明程度。数值越低游戏背景透视效果越强;表单字段和对话框始终保持完全不透明,确保可读性。</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>使用内置 Hellion 字体(Exo 2</value>
<value>使用内置 Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>使用随插件附带的 Exo 2 字体(SIL Open Font License 1.1渲染聊天和界面。禁用后将使用设置 → 字体中选择的字体。</value>
<value>以 Inter Light (SIL Open Font License 1.1) 渲染聊天和界面,随插件一起提供。禁用以回退到设置 → 字体 中选择的字体。</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>搜索完整短语。多词查询仅在这些词按顺序相邻出现时才会匹配。如需使用原始 FTS5 MATCH 语法,请自行为搜索词加上英文双引号。</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat 显示全部 24 种语言,但 FFXIV 的聊天输入仅完全支持 EN、DE、FR 和 JA。其他文字在游戏内聊天输入或作为消息发送时可能显示为乱码。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>主题和标签页快速选择器</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>主题</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>标签页</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>减少动态效果</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>禁用主题交叉淡入淡出、侧边栏和卡片的悬停动画以及未读标签页的脉冲效果。主题切换和悬停状态将立即应用。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
@@ -385,10 +385,10 @@
<value>插件視窗的不透明程度。數值越低,遊戲畫面越能透出;表單欄位和對話框則保持完全不透明且清晰可讀。</value>
</data>
<data name="Theme_UseHellionFont_Name" xml:space="preserve">
<value>使用內建 Hellion 字型(Exo 2</value>
<value>使用內建 Inter Light</value>
</data>
<data name="Theme_UseHellionFont_Description" xml:space="preserve">
<value>以 Exo 2SIL Open Font License 1.1渲染聊天和介面,此字型隨插件一提供。停用後將退回至設定 → 字型選擇的字型。</value>
<value>以 Inter Light (SIL Open Font License 1.1) 渲染聊天和介面,隨插件一提供。停用以回退到設定 → 字型選擇的字型。</value>
</data>
<data name="About_Maintainer_Heading" xml:space="preserve">
@@ -1030,4 +1030,28 @@
<data name="DbViewer_FullTextToggle_Hint_PhraseMode" xml:space="preserve">
<value>搜尋完整的詞組。多字詞查詢只有在這些字詞依序相鄰出現時才會比對成功。若要使用原始 FTS5 MATCH 語法,請自行在搜尋詞外加上雙引號。</value>
</data>
<data name="Settings_Language_FFXIVCoverage_Warning" xml:space="preserve">
<value>HellionChat 顯示全部 24 種語言,但 FFXIV 的聊天輸入僅完全支援 EN、DE、FR 和 JA。其他文字在遊戲內聊天輸入或作為訊息傳送時可能顯示為亂碼。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tooltip" xml:space="preserve">
<value>佈景主題與分頁快速選擇器</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Themes_Header" xml:space="preserve">
<value>佈景主題</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_QuickPicker_Tabs_Header" xml:space="preserve">
<value>分頁</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Name" xml:space="preserve">
<value>減少動態效果</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Settings_ThemeAndLayout_ReduceMotion_Description" xml:space="preserve">
<value>停用佈景主題交叉淡入淡出、側邊欄與卡片的滑鼠停留動畫以及未讀分頁的脈衝效果。佈景主題切換與滑鼠停留狀態將立即套用。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
Binary file not shown.
@@ -1,4 +1,4 @@
Copyright 2013 The Exo 2 Project Authors (https://github.com/googlefonts/Exo-2.0)
Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
+18
View File
@@ -1860,6 +1860,24 @@ namespace HellionChat.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Latin Extended.
/// </summary>
internal static string ExtraGlyphRanges_LatinExtended_Name {
get {
return ResourceManager.GetString("ExtraGlyphRanges_LatinExtended_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Greek.
/// </summary>
internal static string ExtraGlyphRanges_Greek_Name {
get {
return ResourceManager.GetString("ExtraGlyphRanges_Greek_Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Pick a folder location for export..
/// </summary>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Tenyeix el selector de canal amb el color del canal</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>El botó selector de canal al costat del camp d'entrada es tenyeix amb el color del canal actiu. Coincideix amb la tonalitat del text d'entrada.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Amaga mentre el menú New Game+ estigui obert</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Amaga el xat mentre el menú New Game+ estigui obert. En tancar el menú, el xat torna a aparèixer.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Llatí estès</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grec</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Czech a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ Starou databázi lze stále obnovit, kontaktuj prosím autora pluginu pro pomoc.
<data name="ChatExport_Initial" xml:space="preserve">
<value>Načítání logů ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Rozšířená latinka</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Řečtina</value>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Danish a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ Din gamle database kan stadig gendannes, kontakt venligst plugin-forfatteren for
<data name="ChatExport_Initial" xml:space="preserve">
<value>Indlæser logs ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Udvidet latin</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Græsk</value>
</data>
</root>
+20
View File
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Language.de.resx — Hellion Forge maintainer-extended translation
Locale: de (German)
Maintainer: Hellion Forge / Hellion Online Media
Status: Native-speaker maintained
Review: Continuous (native maintainer)
Hellion Forge maintains this file with native-speaker quality,
including the keys post-dating the last upstream Chat 2 Crowdin sync.
Corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
Microsoft ResX Schema
@@ -1481,4 +1495,10 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latein erweitert</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Griechisch</value>
</data>
</root>
File diff suppressed because it is too large Load Diff
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Teñir el selector de canal con el color del canal</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>El botón selector de canal junto al campo de entrada se tiñe con el color del canal activo. Coincide con el tinte del texto de entrada.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Ocultar mientras el menú New Game+ esté abierto</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Oculta el chat mientras el menú New Game+ esté abierto. Al cerrar el menú, el chat se muestra de nuevo.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latín extendido</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Griego</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -13,8 +13,8 @@
Hellion Forge maintains this file to give HellionChat users
in Finnish a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<!--
Microsoft ResX Schema
@@ -1494,4 +1494,10 @@ Vanha tietokantasi voidaan silti palauttaa, ota yhteyttä lisäosan tekijään s
<data name="ChatExport_Initial" xml:space="preserve">
<value>Ladataan lokeja ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Laajennettu latina</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Kreikka</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Teinter le sélecteur de canal avec la couleur du canal</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>Le bouton sélecteur de canal à côté du champ de saisie est teinté avec la couleur du canal actif. Correspond à la teinte du texte de saisie.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Masquer pendant que le menu New Game+ est ouvert</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Masque le chat pendant que le menu New Game+ est ouvert. Fermer le menu réaffiche le chat.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latin étendu</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grec</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Hungarian a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ A régi adatbázis még helyreállítható, kérjük vedd fel a kapcsolatot a pl
<data name="ChatExport_Initial" xml:space="preserve">
<value>Naplók betöltése ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latin kiterjesztett</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Görög</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Colora il selettore di canale con il colore del canale</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>Il pulsante selettore di canale accanto al campo di input viene colorato con il colore del canale attivo. Corrisponde alla colorazione del testo di input.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Nascondi mentre il menu New Game+ è aperto</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Nasconde la chat mentre il menu New Game+ è aperto. Chiudendo il menu, la chat riappare.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latino esteso</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Greco</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>チャンネルセレクターをチャンネル色で着色する</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>入力フィールドの隣のチャンネルセレクターボタンが、現在アクティブなチャンネルの色で着色されます。入力テキスト自体の色合いと一致します。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>ニューゲーム+メニューが開いている間は非表示</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>ニューゲーム+メニューが開いている間、チャットを非表示にします。メニューを閉じるとチャットが再表示されます。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>拡張ラテン</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>ギリシャ語</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>채널 선택기를 채널 색상으로 채색</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>입력 필드 옆의 채널 선택기 버튼이 현재 활성 채널 색상으로 채색됩니다. 입력 텍스트 자체의 색조와 일치합니다.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>뉴게임+ 메뉴가 열려 있는 동안 숨김</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>뉴게임+ 메뉴가 열려 있는 동안 채팅을 숨깁니다. 메뉴를 닫으면 채팅이 다시 표시됩니다.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>확장 라틴</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>그리스어</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Norwegian Bokmål a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ Din gamle database kan fortsatt gjenopprettes. Kontakt plugin-forfatteren for hj
<data name="ChatExport_Initial" xml:space="preserve">
<value>Laster logg ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Utvidet latin</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Gresk</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Kanaalkiezer kleuren met kanaalkleur</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>De kanaalkiezerknop naast het invoerveld krijgt de kleur van het actieve kanaal. Komt overeen met de tint van de invoertekst zelf.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Verbergen terwijl het New Game+ menu open is</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Verberg de chat terwijl het New Game+ menu open is. Het sluiten van het menu toont de chat weer.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latijn uitgebreid</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grieks</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Polish a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ Stara baza danych nadal może zostać odzyskana, skontaktuj się z autorem wtycz
<data name="ChatExport_Initial" xml:space="preserve">
<value>Ładowanie logów...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Łacińskie rozszerzone</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grecki</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Colorir o seletor de canal com a cor do canal</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>O botão seletor de canal ao lado do campo de entrada é colorido com a cor do canal ativo. Combina com a coloração do próprio texto de entrada.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Ocultar enquanto o menu New Game+ estiver aberto</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Oculta o chat enquanto o menu New Game+ estiver aberto. Fechar o menu mostra o chat novamente.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latim estendido</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grego</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in European Portuguese a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ A tua base de dados antiga ainda pode ser recuperada. Contacta o autor do plugin
<data name="ChatExport_Initial" xml:space="preserve">
<value>A carregar registos...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latim estendido</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grego</value>
</data>
</root>
+6
View File
@@ -1478,4 +1478,10 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latin Extended</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Greek</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Colorează selectorul de canal cu culoarea canalului</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>Butonul selector de canal de lângă câmpul de intrare este colorat cu culoarea canalului activ. Se potrivește cu nuanța textului de intrare.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Ascunde cât timp meniul New Game+ este deschis</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Ascunde chatul cât timp meniul New Game+ este deschis. Închiderea meniului afișează chatul din nou.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Latină extinsă</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Greacă</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Окрашивать кнопку выбора канала в цвет канала</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>Кнопка выбора канала рядом с полем ввода окрашивается в цвет активного канала. Совпадает с окраской самого текста ввода.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Скрывать, пока открыто меню New Game+</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Скрывать чат, пока открыто меню New Game+. При закрытии меню чат снова отображается.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Расширенная латиница</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Греческий</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>Färga kanalväljaren med kanalens färg</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>Kanalväljarknappen bredvid inmatningsfältet färgas med den aktiva kanalens färg. Matchar färgningen av själva inmatningstexten.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>Dölj medan New Game+ menyn är öppen</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>Dölj chatten medan New Game+ menyn är öppen. När menyn stängs visas chatten igen.</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Utökat latin</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Grekiska</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Turkish a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@ Eski veritabanınız hâlâ kurtarılabilir, yardım için lütfen eklenti yazar
<data name="ChatExport_Initial" xml:space="preserve">
<value>Günlükler yükleniyor...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Genişletilmiş Latin</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Yunanca</value>
</data>
</root>
+8 -2
View File
@@ -12,8 +12,8 @@
Hellion Forge maintains this file to give HellionChat users
in Ukrainian a fully translated UI.
Native-speaker corrections welcome via PR to:
https://gitea.hellion-forge.cloud
Native-speaker corrections welcome via the Hellion Forge Discord:
https://discord.gg/X9V7Kcv5gR
-->
<root>
<!--
@@ -1494,4 +1494,10 @@
<data name="ChatExport_Initial" xml:space="preserve">
<value>Завантаження журналів ...</value>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>Розширена латинка</value>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>Грецька</value>
</data>
</root>
+24
View File
@@ -1466,4 +1466,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>用频道颜色为频道选择器染色</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>输入框旁边的频道选择器按钮将以当前活动频道的颜色着色。与输入文本本身的着色相匹配。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>在新游戏+菜单打开时隐藏</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>在新游戏+菜单打开时隐藏聊天。关闭菜单时聊天会再次显示。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>拉丁文扩展</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>希腊语</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
+24
View File
@@ -1467,4 +1467,28 @@ Your old database can still be recovered, please contact the plugin author for h
<data name="ChatExport_Initial" xml:space="preserve">
<value>Loading logs ...</value>
</data>
<data name="Options_ColorSelectedInputChannelButton_Name" xml:space="preserve">
<value>用頻道顏色為頻道選擇器染色</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_ColorSelectedInputChannelButton_Description" xml:space="preserve">
<value>輸入框旁邊的頻道選擇器按鈕將以當前活動頻道的顏色著色。與輸入文字本身的著色相匹配。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Name" xml:space="preserve">
<value>在新遊戲+選單開啟時隱藏</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
<value>在新遊戲+選單開啟時隱藏聊天。關閉選單時聊天會再次顯示。</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_LatinExtended_Name" xml:space="preserve">
<value>拉丁文擴展</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
<data name="ExtraGlyphRanges_Greek_Name" xml:space="preserve">
<value>希臘文</value>
<comment>AI-assisted machine translation. Pending native-speaker review.</comment>
</data>
</root>
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,47 @@
using Dalamud.Bindings.ImGui;
using Dalamud.Plugin.SelfTest;
using HellionChat.Branding;
namespace HellionChat.SelfTests;
// Verifies the embedded fox-banner PNG decodes into a usable texture. The load
// is async, so the step returns Waiting until Dalamud finishes the decode and
// the self-test runner re-polls. A decode or resource error is a build defect
// and fails the step hard. The resource lives in the DLL, it cannot be a
// runtime miss.
internal sealed class FoxBannerTextureSmokeStep : ISelfTestStep
{
private readonly Plugin plugin;
public FoxBannerTextureSmokeStep(Plugin plugin)
{
this.plugin = plugin;
}
public string Name => "Hellion Chat - Fox banner texture smoke";
public SelfTestStepResult RunStep()
{
if (!FoxBannerTexture.Shared.TryGetWrap(out var wrap, out var ex))
{
if (ex is not null)
{
ImGui.Text($"Fox banner load failed: {ex.Message}");
return SelfTestStepResult.Fail;
}
ImGui.Text("Fox banner still loading...");
return SelfTestStepResult.Waiting;
}
if (wrap.Size.X <= 0 || wrap.Size.Y <= 0)
{
ImGui.Text($"Fox banner has degenerate size {wrap.Size}");
return SelfTestStepResult.Fail;
}
return SelfTestStepResult.Pass;
}
public void CleanUp() { }
}
@@ -0,0 +1,64 @@
using Dalamud.Bindings.ImGui;
using Dalamud.Plugin.SelfTest;
using HellionChat.Resources;
namespace HellionChat.SelfTests;
// Verifies the v1.5.4 PM-2 quick-picker plumbing without rendering:
// resource strings resolve, the theme registry yields the expected
// minimum built-in count, and Config.Tabs is populated.
internal sealed class QuickPickerSelfTestStep : ISelfTestStep
{
private readonly Plugin plugin;
public QuickPickerSelfTestStep(Plugin plugin)
{
this.plugin = plugin;
}
public string Name => "Hellion Chat - Quick picker plumbing";
public SelfTestStepResult RunStep()
{
if (string.IsNullOrWhiteSpace(HellionStrings.Settings_QuickPicker_Tooltip))
{
ImGui.Text("Settings_QuickPicker_Tooltip is empty in the active locale.");
return SelfTestStepResult.Fail;
}
if (string.IsNullOrWhiteSpace(HellionStrings.Settings_QuickPicker_Themes_Header))
{
ImGui.Text("Settings_QuickPicker_Themes_Header is empty in the active locale.");
return SelfTestStepResult.Fail;
}
if (string.IsNullOrWhiteSpace(HellionStrings.Settings_QuickPicker_Tabs_Header))
{
ImGui.Text("Settings_QuickPicker_Tabs_Header is empty in the active locale.");
return SelfTestStepResult.Fail;
}
var registry = this.plugin.ThemeRegistry;
if (registry is null)
{
ImGui.Text("ThemeRegistry not resolved.");
return SelfTestStepResult.Fail;
}
var builtIns = registry.AllBuiltIns().ToList();
if (builtIns.Count < 10)
{
ImGui.Text($"Expected at least 10 built-in themes, found {builtIns.Count}.");
return SelfTestStepResult.Fail;
}
var tabs = Plugin.Config.Tabs;
if (tabs is null || tabs.Count == 0)
{
ImGui.Text("Config.Tabs is empty.");
return SelfTestStepResult.Fail;
}
return SelfTestStepResult.Pass;
}
public void CleanUp() { }
}
@@ -0,0 +1,216 @@
using Dalamud.Bindings.ImGui;
using Dalamud.Plugin.SelfTest;
using HellionChat.Themes;
namespace HellionChat.SelfTests;
// Verifies the v1.5.4 PM-1 crossfade contract: switching the active
// theme arms TryGetActiveCrossfade for ~300ms, then the registry
// returns to direct AbgrCache reads. A second switch within 100ms
// keeps the lerped path active (no identity-snap). CleanUp restores
// the initial theme so /xlperf stays idempotent.
internal sealed class ThemeCrossfadeSelfTestStep : ISelfTestStep
{
private readonly Plugin plugin;
private string? initialSlug;
private string? targetSlug;
private string? midSwitchSlug;
private long armedAtTickMs = long.MinValue;
private long midArmedAtTickMs = long.MinValue;
private bool sawCrossfade;
private bool sawMidCrossfadeSwitch;
private bool sawCrossfadeEnd;
private bool restoredInitial;
public ThemeCrossfadeSelfTestStep(Plugin plugin)
{
this.plugin = plugin;
}
public string Name => "Hellion Chat - Theme crossfade";
public SelfTestStepResult RunStep()
{
var registry = this.plugin.ThemeRegistry;
if (registry is null)
return SelfTestStepResult.Fail;
if (this.initialSlug is null)
{
this.initialSlug = registry.Active.Slug;
this.targetSlug = PickDifferentSlug(registry, this.initialSlug);
if (this.targetSlug is null)
{
ImGui.Text("Need at least two themes available; only one built-in found.");
return SelfTestStepResult.Fail;
}
registry.Switch(this.targetSlug);
this.armedAtTickMs = Environment.TickCount64;
ImGui.Text($"Crossfade armed: {this.initialSlug} -> {this.targetSlug}");
return SelfTestStepResult.Waiting;
}
if (!this.sawCrossfade)
{
if (registry.TryGetActiveCrossfade(out _))
{
this.sawCrossfade = true;
this.midArmedAtTickMs = Environment.TickCount64;
ImGui.Text("Crossfade observed mid-window, arming mid-switch test...");
return SelfTestStepResult.Waiting;
}
// If the window already closed before we observed it, that
// is acceptable only on extremely slow frame paths; accept
// it as "saw the start" if more than 300ms have elapsed.
// Skip the mid-crossfade-switch phase in that case -- the
// lerped path is no longer active, so a second switch would
// re-arm a fresh crossfade and not exercise PM-1b's
// mid-flight-origin override.
if (Environment.TickCount64 - this.armedAtTickMs > 300)
{
this.sawCrossfade = true;
this.sawMidCrossfadeSwitch = true;
this.sawCrossfadeEnd = true;
ImGui.Text("Crossfade window closed before observation; accepting.");
return SelfTestStepResult.Waiting;
}
return SelfTestStepResult.Waiting;
}
if (!this.sawMidCrossfadeSwitch)
{
// PM-Test-3 mid-crossfade-switch phase: within ~100ms of the
// first observed crossfade, fire a second Switch to a THIRD
// theme. ArmCrossfade must compose the current lerped state
// as the new origin -- TryGetActiveCrossfade still returns
// true (lerped path stays active, no identity-snap) and the
// lerped value is neither the identity-from nor the
// identity-to of the new switch (origin shifted to the
// mid-flight cache, target is the third theme).
if (Environment.TickCount64 - this.midArmedAtTickMs < 100)
{
this.midSwitchSlug = PickDifferentSlug(
registry,
[this.initialSlug!, this.targetSlug!]
);
if (this.midSwitchSlug is null)
{
// Only two themes available -- mid-switch phase cannot
// exercise the lerped-origin path. Accept and move on
// (the v1.5.3 baseline ships >=10 built-ins, so this
// branch is defensive).
this.sawMidCrossfadeSwitch = true;
ImGui.Text("Only two themes available; skipping mid-switch assert.");
return SelfTestStepResult.Waiting;
}
var fromCache = registry.Active.AbgrCache;
registry.Switch(this.midSwitchSlug);
var toCache = registry.Active.AbgrCache;
if (!registry.TryGetActiveCrossfade(out var midLerped))
{
ImGui.Text("Mid-switch failed: TryGetActiveCrossfade returned false.");
return SelfTestStepResult.Fail;
}
// Lerped value must be neither the new identity-from
// (target cache of the first switch) nor the new
// identity-to (third theme cache) -- it must originate
// from the mid-flight composed snapshot.
if (midLerped.Equals(fromCache) || midLerped.Equals(toCache))
{
ImGui.Text("Mid-switch failed: lerped value is an identity snap.");
return SelfTestStepResult.Fail;
}
this.sawMidCrossfadeSwitch = true;
ImGui.Text(
$"Mid-switch armed: {this.targetSlug} -> {this.midSwitchSlug} (lerped origin)."
);
return SelfTestStepResult.Waiting;
}
// Window for mid-switch already elapsed; accept and continue.
this.sawMidCrossfadeSwitch = true;
ImGui.Text("Mid-switch window elapsed before fire; accepting.");
return SelfTestStepResult.Waiting;
}
if (!this.sawCrossfadeEnd)
{
if (!registry.TryGetActiveCrossfade(out _))
{
this.sawCrossfadeEnd = true;
ImGui.Text("Crossfade window closed cleanly.");
return SelfTestStepResult.Waiting;
}
return SelfTestStepResult.Waiting;
}
if (!this.restoredInitial)
{
registry.Switch(this.initialSlug);
this.restoredInitial = true;
ImGui.Text($"Restored: {this.initialSlug}");
return SelfTestStepResult.Waiting;
}
// Wait for the restore-crossfade to also conclude before
// declaring Pass, so /xlperf does not flicker out mid-fade.
if (registry.TryGetActiveCrossfade(out _))
return SelfTestStepResult.Waiting;
return SelfTestStepResult.Pass;
}
public void CleanUp()
{
// Best-effort: if anything went sideways, snap back to the
// initial slug. Switch is idempotent on same-slug.
var registry = this.plugin.ThemeRegistry;
if (registry is not null && this.initialSlug is not null)
{
registry.Switch(this.initialSlug);
}
this.initialSlug = null;
this.targetSlug = null;
this.midSwitchSlug = null;
this.armedAtTickMs = long.MinValue;
this.midArmedAtTickMs = long.MinValue;
this.sawCrossfade = false;
this.sawMidCrossfadeSwitch = false;
this.sawCrossfadeEnd = false;
this.restoredInitial = false;
}
private static string? PickDifferentSlug(ThemeRegistry registry, string activeSlug) =>
PickDifferentSlug(registry, [activeSlug]);
private static string? PickDifferentSlug(
ThemeRegistry registry,
IReadOnlyCollection<string> excludeSlugs
)
{
foreach (var theme in registry.AllBuiltIns())
{
var match = false;
foreach (var excluded in excludeSlugs)
{
if (string.Equals(theme.Slug, excluded, StringComparison.OrdinalIgnoreCase))
{
match = true;
break;
}
}
if (!match)
return theme.Slug;
}
return null;
}
}
+61
View File
@@ -0,0 +1,61 @@
namespace HellionChat.Themes;
// Per-slot ABGR byte-lerp between two ThemeAbgrCache value-records.
// Pattern anchor: imgui.cpp:2820-2828 ImAlphaBlendColors -- decompose
// each byte, lerp via Math.Round, recompose. Stack-allocated output
// (readonly record struct), no heap pressure inside the crossfade
// window. t is clamped to [0, 1] so float drift cannot overshoot.
internal static class ThemeAbgrCacheLerp
{
public static ThemeAbgrCache Lerp(ThemeAbgrCache from, ThemeAbgrCache to, float t)
{
t = Math.Clamp(t, 0f, 1f);
return new ThemeAbgrCache(
PrimaryDark: LerpAbgr(from.PrimaryDark, to.PrimaryDark, t),
Primary: LerpAbgr(from.Primary, to.Primary, t),
PrimaryLight: LerpAbgr(from.PrimaryLight, to.PrimaryLight, t),
PrimaryGlow: LerpAbgr(from.PrimaryGlow, to.PrimaryGlow, t),
AccentDark: LerpAbgr(from.AccentDark, to.AccentDark, t),
Accent: LerpAbgr(from.Accent, to.Accent, t),
AccentLight: LerpAbgr(from.AccentLight, to.AccentLight, t),
Identity: LerpAbgr(from.Identity, to.Identity, t),
WindowBg: LerpAbgr(from.WindowBg, to.WindowBg, t),
ChildBg: LerpAbgr(from.ChildBg, to.ChildBg, t),
FrameBg: LerpAbgr(from.FrameBg, to.FrameBg, t),
Surface: LerpAbgr(from.Surface, to.Surface, t),
SurfaceHover: LerpAbgr(from.SurfaceHover, to.SurfaceHover, t),
Border: LerpAbgr(from.Border, to.Border, t),
TextPrimary: LerpAbgr(from.TextPrimary, to.TextPrimary, t),
TextMuted: LerpAbgr(from.TextMuted, to.TextMuted, t),
TextDim: LerpAbgr(from.TextDim, to.TextDim, t),
StatusSuccess: LerpAbgr(from.StatusSuccess, to.StatusSuccess, t),
StatusDanger: LerpAbgr(from.StatusDanger, to.StatusDanger, t),
StatusWarning: LerpAbgr(from.StatusWarning, to.StatusWarning, t),
StatusInfo: LerpAbgr(from.StatusInfo, to.StatusInfo, t)
);
}
private static uint LerpAbgr(uint from, uint to, float t)
{
var ra = (byte)(from & 0xFFu);
var ga = (byte)((from >> 8) & 0xFFu);
var ba = (byte)((from >> 16) & 0xFFu);
var aa = (byte)((from >> 24) & 0xFFu);
var rb = (byte)(to & 0xFFu);
var gb = (byte)((to >> 8) & 0xFFu);
var bb = (byte)((to >> 16) & 0xFFu);
var ab = (byte)((to >> 24) & 0xFFu);
// Math.Round (default ToEven) matches ColourUtil.ApplyAlpha so a
// crossfade-into-hover transition does not produce a one-byte
// jump at the midpoint between the two paths.
var r = (byte)Math.Round(ra + (rb - ra) * t);
var g = (byte)Math.Round(ga + (gb - ga) * t);
var b = (byte)Math.Round(ba + (bb - ba) * t);
var a = (byte)Math.Round(aa + (ab - aa) * t);
return ((uint)a << 24) | ((uint)b << 16) | ((uint)g << 8) | r;
}
}
+95
View File
@@ -32,6 +32,16 @@ public sealed class ThemeRegistry
private long _lastActiveStampCheckMs = -ActiveStampPollIntervalMs;
private DateTime _lastActiveStamp = DateTime.MinValue;
// PM-1 crossfade state. Switch() captures the previous AbgrCache as a
// VALUE-COPY (not a Theme reference) -- the built-in singletons share
// their RecomputeAbgrCache identity, so a reference would mutate
// alongside the new active. _crossfadeStartTickMs == long.MinValue
// means "no crossfade armed yet"; the field stays MinValue after
// SwitchSilent so the plugin-load init-path does not trigger a fade.
private ThemeAbgrCache? _previousAbgrSnapshot;
private long _crossfadeStartTickMs = long.MinValue;
private const int CrossfadeDurationMs = 300;
public ThemeRegistry(string? customThemesDir = null, ILogger<ThemeRegistry>? logger = null)
{
_logger = logger;
@@ -87,6 +97,13 @@ public sealed class ThemeRegistry
// a state where _active and Get(_active.Slug) disagree.
public void Switch(string slug)
{
// Same-slug switch is a no-op -- avoids a 300ms identity-crossfade
// when the user re-selects the active theme in the picker.
if (string.Equals(_active.Slug, slug, StringComparison.OrdinalIgnoreCase))
return;
ArmCrossfade();
if (_builtIns.TryGetValue(slug, out var builtin))
{
_active = builtin;
@@ -115,6 +132,84 @@ public sealed class ThemeRegistry
_activeCustomPath = null;
}
// SwitchSilent is the plugin-load init path -- identical to Switch
// but does NOT arm the crossfade state. Called from
// ThemeRegistryInitHostedService.StartAsync so opening the plugin
// does not produce a 300ms fade from the default theme to the user's
// saved theme.
public void SwitchSilent(string slug)
{
if (string.Equals(_active.Slug, slug, StringComparison.OrdinalIgnoreCase))
return;
if (_builtIns.TryGetValue(slug, out var builtin))
{
_active = builtin;
_active.RecomputeAbgrCache();
_activeCustomPath = null;
return;
}
var customTheme = LoadCustomBySlug(slug, out var customPath);
if (customTheme is not null)
{
_active = customTheme;
_active.RecomputeAbgrCache();
_activeCustomPath = customPath;
_lastActiveStamp = DateTime.MinValue;
return;
}
_active = _builtIns[DefaultSlug];
_active.RecomputeAbgrCache();
_activeCustomPath = null;
}
// Captures the AbgrCache snapshot that PushGlobal should fade FROM.
// If a crossfade is already mid-flight (second Switch within 300ms),
// the current lerped state replaces the snapshot -- the next fade
// starts from where we currently are, not from the original "from".
private void ArmCrossfade()
{
var now = Environment.TickCount64;
ThemeAbgrCache snapshot;
if (
_previousAbgrSnapshot.HasValue
&& _crossfadeStartTickMs != long.MinValue
&& now - _crossfadeStartTickMs < CrossfadeDurationMs
)
{
var t = (float)(now - _crossfadeStartTickMs) / CrossfadeDurationMs;
snapshot = ThemeAbgrCacheLerp.Lerp(_previousAbgrSnapshot.Value, _active.AbgrCache, t);
}
else
{
snapshot = _active.AbgrCache;
}
_previousAbgrSnapshot = snapshot;
_crossfadeStartTickMs = now;
}
// Returns the lerped AbgrCache while the crossfade is active.
// PushGlobal reads this once per frame; outside the 300ms window
// it short-circuits via the TickCount64 delta so the per-frame
// overhead is a couple of integer comparisons.
public bool TryGetActiveCrossfade(out ThemeAbgrCache lerped)
{
lerped = default;
if (_crossfadeStartTickMs == long.MinValue || !_previousAbgrSnapshot.HasValue)
return false;
var elapsed = Environment.TickCount64 - _crossfadeStartTickMs;
if (elapsed >= CrossfadeDurationMs)
return false;
var t = (float)elapsed / CrossfadeDurationMs;
lerped = ThemeAbgrCacheLerp.Lerp(_previousAbgrSnapshot.Value, _active.AbgrCache, t);
return true;
}
// 1Hz-throttled disk-stat on the currently active custom theme file.
// When the file's LastWriteTime moves forward (editor save), reload the
// theme via Get() so the user sees the edit immediately without
+313 -19
View File
@@ -14,6 +14,7 @@ using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing;
using Dalamud.Memory;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using HellionChat.Code;
using HellionChat.GameFunctions;
using HellionChat.GameFunctions.Types;
@@ -472,6 +473,105 @@ public sealed class ChatLogWindow : Window
ChangeTab(newIndex);
}
// PM-2b v1.5.4 header quick-picker. Two scrollable sections -- every
// built-in plus custom theme, and every tab. Clicking a theme arms
// the PM-1 crossfade via ThemeRegistry.Switch; clicking a tab routes
// through ChangeTab so LastActivityTime stays consistent with the
// sidebar and top-bar click paths. DontClosePopups keeps the popup
// open so the user can hop between entries without re-opening it.
private void DrawQuickPickerPopup()
{
using var popup = ImRaii.Popup("##hellion-quick-picker");
if (!popup.Success)
return;
ImGui.TextUnformatted(HellionStrings.Settings_QuickPicker_Themes_Header);
ImGui.Separator();
var activeSlug = Plugin.ThemeRegistry.Active.Slug;
var allThemes = Plugin
.ThemeRegistry.AllBuiltIns()
.Concat(Plugin.ThemeRegistry.AllCustom())
.ToList();
using (
var scroll = ImRaii.Child(
"##hellion-quick-picker-themes",
new Vector2(220f, Math.Min(allThemes.Count * 22f, 200f))
)
)
{
if (scroll.Success)
{
foreach (var theme in allThemes)
{
var isActive = string.Equals(
theme.Slug,
activeSlug,
StringComparison.OrdinalIgnoreCase
);
DrawQuickPickerGlyph(isActive);
if (
ImGui.Selectable(
$"{theme.Name}##quick-theme-{theme.Slug}",
isActive,
ImGuiSelectableFlags.DontClosePopups
) && !isActive
)
Plugin.ThemeRegistry.Switch(theme.Slug);
}
}
}
ImGui.Spacing();
ImGui.TextUnformatted(HellionStrings.Settings_QuickPicker_Tabs_Header);
ImGui.Separator();
var tabs = Plugin.Config.Tabs;
var activeTabIndex = Plugin.LastTab;
using (
var scroll = ImRaii.Child(
"##hellion-quick-picker-tabs",
new Vector2(220f, Math.Min(tabs.Count * 22f, 200f))
)
)
{
if (scroll.Success)
{
for (var i = 0; i < tabs.Count; i++)
{
var isActive = i == activeTabIndex;
DrawQuickPickerGlyph(isActive);
if (
ImGui.Selectable(
$"{tabs[i].Name}##quick-tab-{i}",
isActive,
ImGuiSelectableFlags.DontClosePopups
) && !isActive
)
ChangeTab(i);
}
}
}
}
// Leading check-glyph slot for a quick-picker row. Active rows get a
// FontAwesome check; inactive rows get a same-width blank so the
// labels stay aligned. The glyph font push stays on its own line so
// it never bleeds into the body-font Selectable label.
private void DrawQuickPickerGlyph(bool isActive)
{
using (Plugin.FontManager.FontAwesome.Push())
{
var check = FontAwesomeIcon.Check.ToIconString();
if (isActive)
ImGui.TextUnformatted(check);
else
ImGui.Dummy(new Vector2(ImGui.CalcTextSize(check).X, ImGui.GetTextLineHeight()));
}
ImGui.SameLine();
}
private void TabSwitched(Tab newTab, Tab previousTab)
{
// Use the fixed channel if set by the user. Otherwise, if the new tab
@@ -677,6 +777,14 @@ public sealed class ChatLogWindow : Window
// (~17ms at 60fps) late, invisible inside the post-reload Atlas-Build.
private bool _firstFrameDone;
// Set when the user clicks the scroll-to-bottom button; the next
// frame's scroll-snap check forces a jump to the live end.
private bool _scrollToBottomRequested;
// Cached each frame inside the ##chat2-messages child. True when the
// user has scrolled up enough that the toolbar button should be shown.
private bool _childScrolledUp;
public override void Draw()
{
DrewThisFrame = true;
@@ -903,7 +1011,15 @@ public sealed class ChatLogWindow : Window
var buttonWidth = afterIcon.X - beforeIcon.X;
var showNovice = Plugin.Config.ShowNoviceNetwork && GameFunctions.GameFunctions.IsMentor();
var buttonsRight = (showNovice ? 1 : 0) + (Plugin.Config.ShowHideButton ? 1 : 0);
var inputWidth = ImGui.GetContentRegionAvail().X - buttonWidth * (1 + buttonsRight);
// Right-side buttons: quick-picker palette + cog (always present)
// plus the optional hide / novice buttons. Each slot costs the
// measured button width AND one ItemSpacing for the SameLine gap
// in front of it -- leaving the spacing term out overflows the
// header row by one gap per button (v1.5.4 quick-picker fix).
var rightButtonCount = 2 + buttonsRight;
var inputWidth =
ImGui.GetContentRegionAvail().X
- rightButtonCount * (buttonWidth + ImGui.GetStyle().ItemSpacing.X);
var normalColor = ImGui.GetColorU32(ImGuiCol.Text);
var push = inputColour != null;
@@ -1007,9 +1123,54 @@ public sealed class ChatLogWindow : Window
using var pushedColor = ImRaii.PushColor(ImGuiCol.Text, normalColor);
if (ImGui.Selectable(Language.ChatLog_HideChat))
UserHide();
// Insert game text-macro tokens. The game expands <flag>/<item> at
// send time, so inserting literal token text is enough. Each entry is
// disabled when its precondition is unmet (no map flag, no linked item)
// so the inserted token cannot expand to nothing.
unsafe
{
// Null-check before deref: pointers can be null during zone transitions.
var agentMap = AgentMap.Instance();
var flagSet = agentMap != null && agentMap->FlagMarkerCount > 0;
using (ImRaii.Disabled(!flagSet))
{
if (ImGui.Selectable(HellionStrings.ChatLog_Insert_MapFlag))
{
Chat += "<flag>";
Activate = true;
ActivatePos = Chat.Length;
}
}
var agentChat = AgentChatLog.Instance();
var itemSet = agentChat != null && agentChat->LinkedItem.ItemId != 0;
using (ImRaii.Disabled(!itemSet))
{
if (ImGui.Selectable(HellionStrings.ChatLog_Insert_ItemLink))
{
Chat += "<item>";
Activate = true;
ActivatePos = Chat.Length;
}
}
}
}
}
}
ImGui.SameLine();
if (
ImGuiUtil.IconButton(
FontAwesomeIcon.Palette,
tooltip: HellionStrings.Settings_QuickPicker_Tooltip,
width: (int)buttonWidth
)
)
ImGui.OpenPopup("##hellion-quick-picker");
DrawQuickPickerPopup();
ImGui.SameLine();
@@ -1420,17 +1581,32 @@ public sealed class ChatLogWindow : Window
Tab tab,
PayloadHandler handler,
float childHeight,
bool switchedTab
bool switchedTab,
bool updateScrollState = true
)
{
using var child = ImRaii.Child("##chat2-messages", new Vector2(-1, childHeight));
if (!child.Success)
return;
using (var child = ImRaii.Child("##chat2-messages", new Vector2(-1, childHeight)))
{
if (child.Success)
{
if (tab.DisplayTimestamp && Plugin.Config.PrettierTimestamps)
DrawLogTableStyle(tab, handler, switchedTab);
else
DrawLogNormalStyle(tab, handler, switchedTab);
// Cached for the header toolbar's scroll-to-bottom button, which is
// drawn one frame later. GetScrollMaxY / GetScrollY here refer to
// the child's scroll context. Pop-out windows pass updateScrollState:
// false so they do not overwrite the main window's cached state.
if (updateScrollState)
_childScrolledUp = ImGui.GetScrollMaxY() - ImGui.GetScrollY() > 1f;
}
else
{
if (updateScrollState)
_childScrolledUp = false;
}
}
}
private void DrawLogNormalStyle(Tab tab, PayloadHandler handler, bool switchedTab)
@@ -1438,8 +1614,9 @@ public sealed class ChatLogWindow : Window
using (ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero))
DrawMessages(tab, handler, false);
if (switchedTab || ImGui.GetScrollY() >= ImGui.GetScrollMaxY())
if (switchedTab || _scrollToBottomRequested || ImGui.GetScrollY() >= ImGui.GetScrollMaxY())
ImGui.SetScrollHereY(1f);
_scrollToBottomRequested = false;
handler.Draw();
}
@@ -1468,8 +1645,13 @@ public sealed class ChatLogWindow : Window
// Custom styles can have cellPadding that go above 4, which GetScrollY isn't respecting
var cellPaddingOffset =
!compact && oldCellPadding.Y > 4f ? oldCellPadding.Y - 4f : 0f;
if (switchedTab || ImGui.GetScrollY() + cellPaddingOffset >= ImGui.GetScrollMaxY())
if (
switchedTab
|| _scrollToBottomRequested
|| ImGui.GetScrollY() + cellPaddingOffset >= ImGui.GetScrollMaxY()
)
ImGui.SetScrollHereY(1f);
_scrollToBottomRequested = false;
handler.Draw();
}
@@ -1505,15 +1687,19 @@ public sealed class ChatLogWindow : Window
var maxLines = Plugin.Config.MaxLinesToRender;
var startLine = messages.Count > maxLines ? messages.Count - maxLines : 0;
// Card-mode pre-loop: theme/drawList/winLeft/winRight/border are invariant
// per DrawMessages call; only cursorY moves per row.
// Card-mode pre-loop: theme/drawList/winLeft/winRight are
// invariant per DrawMessages call. borderColorAbgr used to be
// hoisted here too, but PM-3d (v1.5.4) modulates it by
// tab._cardHoverAlpha per row, so it moves into the AddLine
// call below. anyCardHovered aggregates the row-hover state
// across all card-rows; the lerp runs once at the loop end so
// the next frame paints with the updated alpha.
var theme = Plugin.ThemeRegistry.Active;
var drawList = ImGui.GetWindowDrawList();
var winLeft = ImGui.GetWindowPos().X;
var winRight = winLeft + ImGui.GetWindowSize().X;
var borderColorAbgr = ColourUtil.RgbaToAbgr(
(theme.Colors.Border & 0xFFFFFF00u) | 0x33u
);
var baseBorderRgba = (theme.Colors.Border & 0xFFFFFF00u) | 0x33u;
var anyCardHovered = false;
for (var i = startLine; i < messages.Count; i++)
{
@@ -1669,6 +1855,8 @@ public sealed class ChatLogWindow : Window
var useCard = !Plugin.Config.UseCompactDensity;
if (useCard)
{
var rowStartY = ImGui.GetCursorScreenPos().Y;
if (message.Sender.Count > 0)
{
var senderColor =
@@ -1692,9 +1880,18 @@ public sealed class ChatLogWindow : Window
else
DrawChunks(message.Content, true, handler, lineWidth);
// Border bottom as card separator. Alpha reduced to 0x33 for subtlety.
// Border bottom as card separator. Base alpha 0x33;
// PM-3d lifts it by up to ~+0x70 while any row in this
// tab is hovered. _cardHoverAlpha lerps at the loop
// end, so the one-frame lag is invisible at 10f speed.
{
var rowEndY = ImGui.GetCursorScreenPos().Y;
var hoverBoost = 0.45f * tab._cardHoverAlpha;
var alphaByte = (uint)
Math.Clamp((int)(0x33u + hoverBoost * 255f), 0x33, 0xCC);
var borderColorAbgr = ColourUtil.RgbaToAbgr(
(baseBorderRgba & 0xFFFFFF00u) | alphaByte
);
drawList.AddLine(
new Vector2(winLeft + 4, rowEndY - 1),
new Vector2(winRight - 4, rowEndY - 1),
@@ -1702,6 +1899,17 @@ public sealed class ChatLogWindow : Window
1f
);
ImGui.Dummy(new Vector2(0, 2));
// Whole-row hover test. IsItemHovered would only see
// the 2px Dummy above, so hit-test the row rect from
// its start Y down to the separator line instead.
if (
ImGui.IsMouseHoveringRect(
new Vector2(winLeft, rowStartY),
new Vector2(winRight, rowEndY)
)
)
anyCardHovered = true;
}
}
else
@@ -1726,6 +1934,20 @@ public sealed class ChatLogWindow : Window
message.IsVisible[tab.Identifier] = ImGui.IsItemVisible();
}
// PM-3d: update the per-tab card-hover lerp once per
// DrawMessages call. ReduceMotion snaps to the target;
// otherwise the border alpha eases toward it over a few
// frames the next time the rows paint.
var cardTarget = anyCardHovered ? 1f : 0f;
tab._cardHoverAlpha = Plugin.Config.ReduceMotion
? cardTarget
: FrameLerp.Smooth(
tab._cardHoverAlpha,
cardTarget,
speed: 10f,
deltaTime: ImGui.GetIO().DeltaTime
);
}
catch (ApplicationException)
{
@@ -1976,7 +2198,19 @@ public sealed class ChatLogWindow : Window
ColourUtil.RgbaToAbgr(theme.Colors.Surface)
)
)
using (ImRaii.PushColor(ImGuiCol.Text, ColourUtil.RgbaToAbgr(iconColor)))
// PM-3c: icon alpha eases from 40% (dim) to 100% on
// hover. _hoverAlpha lerps at the end of this block,
// so the colour for frame N uses frame N-1's value --
// a sub-frame lag that is invisible at 10f speed.
using (
ImRaii.PushColor(
ImGuiCol.Text,
ColourUtil.ApplyAlpha(
ColourUtil.RgbaToAbgr(iconColor),
0.4f + 0.6f * tab._hoverAlpha
)
)
)
using (Plugin.FontManager.FontAwesome.Push())
{
// Button stretches with the configured sidebar width so a
@@ -1988,6 +2222,19 @@ public sealed class ChatLogWindow : Window
);
}
// PM-3c hover-lerp: ramp _hoverAlpha toward 1 while the
// icon button is hovered, back to 0 otherwise.
// ReduceMotion snaps so the dim/full states stay binary.
var hoverTarget = ImGui.IsItemHovered() ? 1f : 0f;
tab._hoverAlpha = Plugin.Config.ReduceMotion
? hoverTarget
: FrameLerp.Smooth(
tab._hoverAlpha,
hoverTarget,
speed: 10f,
deltaTime: ImGui.GetIO().DeltaTime
);
if (isCurrentTab)
{
// Vertical accent pill on the left window edge, 3px wide, half tab height,
@@ -2114,14 +2361,50 @@ public sealed class ChatLogWindow : Window
Plugin.WantedTab = null;
}
// DrawChatHeaderToolbar: renders the pop-out button for the active tab.
// v1.3.0 also renders the optional Honorific title slot left of it.
// DrawChatHeaderToolbar: renders the honorific title slot, the optional
// scroll-to-bottom button, and the pop-out button for the active tab.
private void DrawChatHeaderToolbar(Tab tab)
{
DrawHonorificTitleSlot();
DrawScrollToBottomToolbarButton();
DrawPopOutButton(tab);
}
// Draws an arrow-down button in the toolbar when the user has scrolled up
// from the live end of the chat log. Clicking it requests a snap to bottom.
//
// _childScrolledUp is set at the end of DrawMessageLog, which runs AFTER
// DrawChatHeaderToolbar in the same frame. So this button always reflects the
// previous frame's scroll state, a one-frame lag that is imperceptible in use.
//
// Both this button and DrawPopOutButton use SetCursorPosX with absolute
// positioning (cursorX + GetContentRegionAvail().X - N * iconWidth). Because
// each call computes its own target X from the right edge, they are independent
// of each other and of what the cursor position happens to be at call time.
// The pop-out button lands at rightEdge - iconWidth regardless of call order.
private void DrawScrollToBottomToolbarButton()
{
if (!_childScrolledUp)
return;
var avail = ImGui.GetContentRegionAvail().X;
var iconWidth = ImGui.GetFrameHeight();
var spacing = ImGui.GetStyle().ItemSpacing.X;
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + avail - 2 * iconWidth - spacing);
if (
ImGuiUtil.IconButton(
FontAwesomeIcon.ArrowDown,
tooltip: HellionStrings.ChatLog_ScrollToBottom_Tooltip
)
)
_scrollToBottomRequested = true;
// Keep the pop-out button on the same toolbar row. Without this the
// button item ends the line and the pop-out drops to the next row.
ImGui.SameLine();
}
private void DrawPopOutButton(Tab tab)
{
var avail = ImGui.GetContentRegionAvail().X;
@@ -2173,7 +2456,13 @@ public sealed class ChatLogWindow : Window
crownWidth = ImGui.CalcTextSize(FontAwesomeIcon.Crown.ToIconString()).X;
}
var maxTitleWidth = avail - iconWidth - gapBeforeButton - crownWidth - gapAfterCrown;
// When the scroll button is also present it occupies iconWidth + ItemSpacing.X
// to the left of the pop-out button, so shrink the title budget accordingly.
var scrollButtonReserve = _childScrolledUp
? iconWidth + ImGui.GetStyle().ItemSpacing.X
: 0f;
var maxTitleWidth =
avail - iconWidth - scrollButtonReserve - gapBeforeButton - crownWidth - gapAfterCrown;
if (maxTitleWidth <= 0)
{
return;
@@ -2299,8 +2588,13 @@ public sealed class ChatLogWindow : Window
var anyChanged = false;
var tabs = Plugin.Config.Tabs;
// Focus the rename field on the frame the context menu opens so the
// user can type immediately. Buffer raised 128 -> 512 to match the
// settings-tab rename (Ui/SettingsTabs/Tabs.cs). One name limit, not two.
if (ImGui.IsWindowAppearing())
ImGui.SetKeyboardFocusHere();
ImGui.SetNextItemWidth(250f * ImGuiHelpers.GlobalScale);
if (ImGui.InputText("##tab-name", ref tab.Name, 128))
if (ImGui.InputText("##tab-name", ref tab.Name, 512))
anyChanged = true;
if (ImGuiUtil.IconButton(FontAwesomeIcon.TrashAlt, tooltip: Language.ChatLog_Tabs_Delete))
+35 -17
View File
@@ -1,6 +1,7 @@
using System.Globalization;
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing;
using HellionChat.Branding;
@@ -171,24 +172,41 @@ public sealed class FirstRunWizard : Window
ImGui.TextUnformatted(HellionStrings.Wizard_Step1_Title);
ImGui.Spacing();
// Banner is opt-in: the full silhouette dominates the wizard window
// at the default size, so the TreeNode is folded by default and the
// onboarding copy stays the primary focus. Mirrors the pre-rewrite
// collapsible anchor from v1.5.1.
using (var tree = ImRaii.TreeNode("Hellion Forge"))
// Fox-banner image: the embedded Hellion Forge fox artwork. The card
// behind the image gives the dark fox enough contrast against the
// plugin's dark UI so the logo reads clearly at a glance.
var banner = FoxBannerTexture.Shared.GetWrapOrDefault();
if (banner is not null)
{
if (tree.Success)
{
using (Plugin.Interface.UiBuilder.MonoFontHandle.Push())
{
// CalcTextSize must run inside the MonoFont push so the
// measurement matches the glyph width actually used for
// rendering.
var bannerSize = ImGui.CalcTextSize(HellionForgeAscii.FoxBanner);
ImGui.SetCursorPosX((ImGui.GetContentRegionAvail().X - bannerSize.X) * 0.5f);
ImGui.TextUnformatted(HellionForgeAscii.FoxBanner);
}
}
const uint CardColor = 0xFFE8E8E8; // off-white fill so the dark fox pops
var imgHeight = 170f * ImGuiHelpers.GlobalScale;
var imgWidth = imgHeight * banner.Size.X / banner.Size.Y;
var pad = 14f * ImGuiHelpers.GlobalScale;
var cardWidth = imgWidth + pad * 2f;
var cardHeight = imgHeight + pad * 2f;
var rounding = 8f * ImGuiHelpers.GlobalScale;
// Centre the card in the content region. Clamp to zero so the card
// never shifts left of the window edge on very narrow windows.
var offsetX = Math.Max(0f, (ImGui.GetContentRegionAvail().X - cardWidth) * 0.5f);
var cardOrigin = ImGui.GetCursorScreenPos() + new Vector2(offsetX, 0f);
// Draw the rounded card behind the image, then place the image on top.
ImGui
.GetWindowDrawList()
.AddRectFilled(
cardOrigin,
cardOrigin + new Vector2(cardWidth, cardHeight),
CardColor,
rounding
);
ImGui.SetCursorScreenPos(cardOrigin + new Vector2(pad, pad));
ImGui.Image(banner.Handle, new Vector2(imgWidth, imgHeight));
// Advance the layout cursor past the full card so the content below
// starts at the right position and does not overlap the card.
ImGui.SetCursorScreenPos(cardOrigin);
ImGui.Dummy(new Vector2(cardWidth, cardHeight));
}
ImGui.Spacing();
+22 -2
View File
@@ -33,11 +33,31 @@ internal static class HellionStyle
// Global color and style stack pushed once per frame.
// windowOpacity: window background alpha (0.5-1.0).
internal static IDisposable PushGlobal(Theme theme, float windowOpacity = 1.0f)
internal static IDisposable PushGlobal(
Theme theme,
ThemeRegistry registry,
float windowOpacity = 1.0f
)
{
var c = theme.Colors;
var l = theme.Layout;
var a = theme.AbgrCache;
// Crossfade: PM-1 reads a lerped snapshot during the 300ms window
// following a Switch (TryGetActiveCrossfade returns false outside
// the window or while ReduceMotion is on). Only the ABGR-slot path
// crossfades -- WindowBg/ChildBg RGBA stays bound to the user's
// per-window opacity override and must not fade. See
// feedback_dalamud_pinning_override.
ThemeAbgrCache a;
if (!Plugin.Config.ReduceMotion && registry.TryGetActiveCrossfade(out var lerped))
{
a = lerped;
}
else
{
a = theme.AbgrCache;
}
var stack = new StackHandle();
var alphaByte = (uint)Math.Clamp((int)(windowOpacity * 255f), 0x55, 0xFF);
+1 -1
View File
@@ -118,7 +118,7 @@ internal class Popout : Window
var handler = ChatLogWindow.HandlerLender.Borrow();
var logHeight = ImGui.GetContentRegionAvail().Y - inputBarHeight - hintBannerHeight;
ChatLogWindow.DrawMessageLog(Tab, handler, logHeight, false);
ChatLogWindow.DrawMessageLog(Tab, handler, logHeight, false, updateScrollState: false);
if (inputEnabled && InputBar != null)
{
+12
View File
@@ -201,6 +201,18 @@ public sealed class SettingsWindow : Dalamud.Interface.Windowing.Window
var hideChanged = !Mutable.HideChat && Mutable.HideChat != Plugin.Config.HideChat;
var languageChanged = Mutable.LanguageOverride != Plugin.Config.LanguageOverride;
// v1.5.3: Auto-enable the ExtraGlyphRanges flag matching the new
// locale so non-Latin scripts render immediately. Without this,
// a user switching to Korean would see "===" until they manually
// tick the Korean range in Fonts & Colours.
if (languageChanged)
{
var required = Mutable.LanguageOverride.RequiredGlyphRanges();
if (required != 0)
Mutable.ExtraGlyphRanges |= required;
}
var fontChanged =
Mutable.GlobalFontV2 != Plugin.Config.GlobalFontV2
|| Mutable.JapaneseFontV2 != Plugin.Config.JapaneseFontV2
+6
View File
@@ -145,6 +145,12 @@ internal sealed class Chat : ISettingsTab
ref Mutable.SymbolPickerEnabled
);
ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_SymbolPicker_Enable_Description);
ImGui.Checkbox(
HellionStrings.Settings_Chat_NotifyFailedTell_Name,
ref Mutable.NotifyFailedTell
);
ImGuiUtil.HelpMarker(HellionStrings.Settings_Chat_NotifyFailedTell_Description);
}
}
+12 -15
View File
@@ -54,28 +54,23 @@ internal sealed class FontsAndColours : ISettingsTab
if (Mutable.UseHellionFont)
{
// Bundled-font path: only the base font size matters; the
// global / japanese / italic chooser pickers do not apply.
ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
ImGui.Spacing();
ImGuiUtil.FontSizeCombo(
Language.Options_SymbolsFontSize_Name,
ref Mutable.SymbolsFontSizeV2
);
ImGuiUtil.HelpMarker(Language.Options_SymbolsFontSize_Description);
ImGui.Spacing();
return;
}
else
{
ImGui.Checkbox(Language.Options_FontsEnabled, ref Mutable.FontsEnabled);
ImGui.Spacing();
}
var unused = false;
if (!Mutable.FontsEnabled)
if (!Mutable.UseHellionFont && !Mutable.FontsEnabled)
{
ImGuiUtil.FontSizeCombo(Language.Options_FontSize_Name, ref Mutable.FontSizeV2);
}
else
else if (!Mutable.UseHellionFont)
{
var globalChooser = ImGuiUtil.FontChooser(
Language.Options_Font_Name,
@@ -164,7 +159,12 @@ internal sealed class FontsAndColours : ISettingsTab
string.Format(Language.Options_Italic_Description, Plugin.PluginName)
);
ImGui.Spacing();
}
// v1.5.3: ExtraGlyphRanges is an atlas-wide property and stays
// reachable regardless of UseHellionFont / FontsEnabled state so
// users can verify or override the auto-activation on language change.
ImGui.Spacing();
if (ImGui.CollapsingHeader(Language.Options_ExtraGlyphs_Name))
{
ImGuiUtil.HelpMarker(
@@ -180,9 +180,6 @@ internal sealed class FontsAndColours : ISettingsTab
Mutable.ExtraGlyphRanges = (ExtraGlyphRanges)range;
}
ImGui.Spacing();
}
ImGuiUtil.FontSizeCombo(
Language.Options_SymbolsFontSize_Name,
ref Mutable.SymbolsFontSizeV2
+9 -1
View File
@@ -139,7 +139,12 @@ internal sealed class General : ISettingsTab
{
if (combo.Success)
{
foreach (var language in Enum.GetValues<LanguageOverride>())
// None pinned first, then alphabetical by endonym so source order
// (append-only for serialisation safety) is not visible to users.
var sortedLanguages = Enum.GetValues<LanguageOverride>()
.OrderBy(l => l == LanguageOverride.None ? 0 : 1)
.ThenBy(l => l.Name(), StringComparer.InvariantCulture);
foreach (var language in sortedLanguages)
{
if (ImGui.Selectable(language.Name()))
{
@@ -151,6 +156,9 @@ internal sealed class General : ISettingsTab
ImGuiUtil.HelpMarker(
string.Format(Language.Options_Language_Description, Plugin.PluginName)
);
// v1.5.3: HellionChat's font stack covers 24 languages but FFXIV's
// engine only supports EN/DE/FR/JA for chat input/sending.
ImGuiUtil.WarningText(HellionStrings.Settings_Language_FFXIVCoverage_Warning);
ImGui.Spacing();
using (
+29 -8
View File
@@ -1,3 +1,4 @@
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
@@ -68,18 +69,38 @@ internal sealed class Information : ISettingsTab
DrawChangelogSection();
}
// Provenance anchor — folded by default so the tab opens to the
// version-info section as before. Expands to show the full Hellion
// Forge silhouette in monospace.
private void DrawHellionForgeSection()
{
using var tree = ImRaii.TreeNode("Hellion Forge");
if (!tree.Success)
var banner = FoxBannerTexture.Shared.GetWrapOrDefault();
if (banner is null)
return;
using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false))
using (Plugin.Interface.UiBuilder.MonoFontHandle.Push())
ImGui.TextUnformatted(HellionForgeAscii.FoxBanner);
const uint CardColor = 0xFFE8E8E8; // off-white fill so the dark fox pops
var imgHeight = 170f * ImGuiHelpers.GlobalScale;
var imgWidth = imgHeight * banner.Size.X / banner.Size.Y;
var pad = 14f * ImGuiHelpers.GlobalScale;
var cardWidth = imgWidth + pad * 2f;
var cardHeight = imgHeight + pad * 2f;
var rounding = 8f * ImGuiHelpers.GlobalScale;
// Left-aligned: card origin stays at the current layout cursor position.
var cardOrigin = ImGui.GetCursorScreenPos();
// Draw the rounded card behind the image, then place the image on top.
ImGui
.GetWindowDrawList()
.AddRectFilled(
cardOrigin,
cardOrigin + new Vector2(cardWidth, cardHeight),
CardColor,
rounding
);
ImGui.SetCursorScreenPos(cardOrigin + new Vector2(pad, pad));
ImGui.Image(banner.Handle, new Vector2(imgWidth, imgHeight));
// Advance the layout cursor past the full card so content below does not overlap.
ImGui.SetCursorScreenPos(cardOrigin);
ImGui.Dummy(new Vector2(cardWidth, cardHeight));
}
private void DrawVersionInfoSection()
+73
View File
@@ -2,6 +2,7 @@ using Dalamud.Bindings.ImGui;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Interface;
using Dalamud.Interface.Utility.Raii;
using FFXIVClientStructs.FFXIV.Client.UI;
using HellionChat.Code;
using HellionChat.Resources;
using HellionChat.Util;
@@ -165,6 +166,78 @@ internal sealed class Tabs : ISettingsTab
}
ImGui.Checkbox(Language.Options_Tabs_ShowTimestamps, ref tab.DisplayTimestamp);
ImGui.Checkbox(
HellionStrings.Tabs_NotificationSound_Enable_Name,
ref tab.EnableNotificationSound
);
ImGuiUtil.HelpMarker(HellionStrings.Tabs_NotificationSound_Description);
if (tab.EnableNotificationSound)
{
using var indent = ImRaii.PushIndent(10.0f);
// Build a readable preview label for the currently selected sound.
var soundPreview =
tab.NotificationSoundId <= 16
? $"{HellionStrings.Tabs_NotificationSound_Option} {tab.NotificationSoundId}"
: $"{HellionStrings.Tabs_NotificationSound_CustomOption} {tab.NotificationSoundId - 16}";
using (var combo = ImRaii.Combo($"##notif-sound-{i}", soundPreview))
{
if (combo.Success)
{
for (uint s = 1; s <= 16; s++)
{
if (
ImGui.Selectable(
$"{HellionStrings.Tabs_NotificationSound_Option} {s}",
tab.NotificationSoundId == s
)
)
tab.NotificationSoundId = s;
}
ImGui.Separator();
// Bundled custom sounds (ids 17-19).
for (uint n = 1; n <= 3; n++)
{
var customId = 16 + n;
if (
ImGui.Selectable(
$"{HellionStrings.Tabs_NotificationSound_CustomOption} {n}",
tab.NotificationSoundId == customId
)
)
tab.NotificationSoundId = customId;
}
}
}
// Let the user hear the currently selected sound without waiting
// for a real message to arrive in this tab.
ImGui.SameLine();
if (
ImGuiUtil.IconButton(
FontAwesomeIcon.Play,
tooltip: HellionStrings.Tabs_NotificationSound_Preview
)
)
{
var previewId = tab.NotificationSoundId;
if (previewId <= 16)
{
Plugin.Framework.RunOnFrameworkThread(() =>
{
unsafe
{
UIGlobals.PlaySoundEffect(previewId);
}
});
}
else
{
Plugin.CustomAudioPlayer.Play((int)previewId - 16);
}
}
}
ImGui.Checkbox(Language.Options_Tabs_PopOut, ref tab.PopOut);
if (tab.PopOut)
{
@@ -295,6 +295,20 @@ internal sealed class ThemeAndLayout : ISettingsTab
Mutable.WindowOpacity = opacityPercent / 100f;
}
ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_WindowOpacity_Description);
ImGui.Spacing();
ImGui.Separator();
ImGui.Spacing();
// Master accessibility toggle for the v1.5.4 motion work: the
// theme crossfade, the sidebar/card hover lerps and the
// unread-tab pulse all read Config.ReduceMotion and snap
// instantly when it is on.
ImGui.Checkbox(
HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Name,
ref Mutable.ReduceMotion
);
ImGuiUtil.HelpMarker(HellionStrings.Settings_ThemeAndLayout_ReduceMotion_Description);
}
}
+12
View File
@@ -66,6 +66,18 @@ internal static class ColourUtil
return ((uint)a << 24) | ((uint)nb << 16) | ((uint)ng << 8) | nr;
}
// Modulates the alpha byte of an ABGR color by a factor in [0, 1].
// RGB stays intact. Used by the PM-3 hover-lerp path where each
// frame produces a fractional alpha value but the colour itself
// must not shift.
internal static uint ApplyAlpha(uint abgr, float alphaFactor)
{
alphaFactor = Math.Clamp(alphaFactor, 0f, 1f);
var origAlpha = (byte)((abgr >> 24) & 0xFFu);
var newAlpha = (byte)Math.Round(origAlpha * alphaFactor);
return (abgr & 0x00FFFFFFu) | ((uint)newAlpha << 24);
}
public static uint HexToRgba(string hex)
{
ArgumentNullException.ThrowIfNull(hex);
+17
View File
@@ -0,0 +1,17 @@
namespace HellionChat.Util;
// Framerate-independent smoothing for per-frame hover and motion
// values. Pattern anchor: Umbra Toolbar.Autohide.cs:55
// (`v += (target - v) * deltaTime`). The Math.Min(1f, speed*dt)
// clamp is a deliberate HellionChat addition -- on Wine/DXVK a
// stalled frame can push deltaTime well over 16ms, which would
// otherwise let the raw factor exceed 1.0 and overshoot the target.
// Clamping makes a stalled frame land exactly on target instead.
internal static class FrameLerp
{
public static float Smooth(float current, float target, float speed, float deltaTime)
{
var factor = Math.Min(1f, speed * deltaTime);
return current + (target - current) * factor;
}
}
+27
View File
@@ -0,0 +1,27 @@
using System.Collections.Generic;
namespace HellionChat._Helpers;
// Pure decision helper for failed-tell detection. The processed message
// stream carries no LogMessage row id, so detection happens at the
// RaptureLogModule level (see FailedTellNotifier). This POCO stays free of
// Dalamud types so the "known id AND enabled" rule is Build-Suite testable.
// TEST-MIRROR: ../../../Hellion Build test/Ui/FailedTellMatcherTests.cs
public static class FailedTellMatcher
{
// Log-message ids the game raises for a tell that could not be delivered,
// pinned from in-game discovery. 50 covers an unreachable recipient
// (offline, non-existent, or on another world); 3832 is a recipient
// inside an instance.
public static readonly IReadOnlySet<uint> FailedTellLogMessageIds = new HashSet<uint>
{
50u,
3832u,
};
public static bool ShouldNotify(
uint logMessageId,
bool notifyEnabled,
IReadOnlySet<uint> failedTellIds
) => notifyEnabled && failedTellIds.Contains(logMessageId);
}
+17
View File
@@ -0,0 +1,17 @@
namespace HellionChat._Helpers;
// Pure decision helper: should an incoming message play a per-tab notification
// sound? Kept Dalamud-free so the Build Suite can test the
// "inactive + enabled + global-allowed" rule in isolation.
// TEST-MIRROR: ../../../Hellion Build test/Ui/TabSoundDecisionTests.cs
public static class TabSoundDecision
{
// True only when the message landed in a tab the user is not looking at,
// that tab has its own sound switched on, and the global sound master is
// not muted.
public static bool ShouldPlay(
bool isActiveTab,
bool tabSoundEnabled,
bool globalSoundsEnabled
) => !isActiveTab && tabSoundEnabled && globalSoundsEnabled;
}
+20 -6
View File
@@ -27,11 +27,11 @@
},
"Microsoft.Data.Sqlite": {
"type": "Direct",
"requested": "[10.0.8, )",
"resolved": "10.0.8",
"contentHash": "iyDWyD6r/SnqgoYYQIlLhxL1ZIGZr+SByMXrJKSA1w7sOt7bPMJmN3h2laqwKqyQkjh/lUPJ7LTXwpvqzhggOQ==",
"requested": "[10.0.7, )",
"resolved": "10.0.7",
"contentHash": "DZ6G2QuyPrsh5VS+wfiZbNBtYT6p+CkxXjD0aZHF04xso7QsG/uk0JpG30hzYlK6u/wtTzta1Dqfgbc/Sl2sDA==",
"dependencies": {
"Microsoft.Data.Sqlite.Core": "10.0.8",
"Microsoft.Data.Sqlite.Core": "10.0.7",
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.11",
"SQLitePCLRaw.core": "2.1.11"
}
@@ -102,6 +102,15 @@
"resolved": "4.4.0",
"contentHash": "QX3bsK9oFeUXk8tFsc9NkI6NnCr8Ar/ex027p+ZZ/jdLCdX2RlryDtxUqZW5j45NVwn4E4Z4hzupsoMQd6Yxtg=="
},
"NAudio.WinMM": {
"type": "Direct",
"requested": "[2.2.1, )",
"resolved": "2.2.1",
"contentHash": "xFHRFwH4x6aq3IxRbewvO33ugJRvZFEOfO62i7uQJRUNW2cnu6BeBTHUS0JD5KBucZbHZaYqxQG8dwZ47ezQuQ==",
"dependencies": {
"NAudio.Core": "2.2.1"
}
},
"Pidgin": {
"type": "Direct",
"requested": "[3.5.1, 4.0.0)",
@@ -132,8 +141,8 @@
},
"Microsoft.Data.Sqlite.Core": {
"type": "Transitive",
"resolved": "10.0.8",
"contentHash": "26t7WDiEjjAls/sFpWvVEFDxt+7Q5VPt6+blU2Lafuj9L8PzAv/GtGV4cqVPtrhWbfD2BX/z2v8hD1qXYtK6Aw==",
"resolved": "10.0.7",
"contentHash": "xVrtBg3M1wJlBDkoT0dXEYB/wSc8bIHJPYtw/bu1AqpWgF79uPSs87DAhERR/Ilumre6TKZa1cjMg3VUUObVLA==",
"dependencies": {
"SQLitePCLRaw.core": "2.1.11"
}
@@ -366,6 +375,11 @@
"resolved": "17.11.4",
"contentHash": "mudqUHhNpeqIdJoUx2YDWZO/I9uEDYVowan89R6wsomfnUJQk6HteoQTlNjZDixhT2B4IXMkMtgZtoceIjLRmA=="
},
"NAudio.Core": {
"type": "Transitive",
"resolved": "2.2.1",
"contentHash": "GgkdP6K/7FqXFo7uHvoqGZTJvW4z8g2IffhOO4JHaLzKCdDOUEzVKtveoZkCuUX8eV2HAINqi7VFqlFndrnz/g=="
},
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.11",
+42 -7
View File
@@ -2,7 +2,7 @@
[![Build](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml/badge.svg?branch=main)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
[![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE)
[![Latest release](https://img.shields.io/badge/release-v1.5.2-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[![Latest release](https://img.shields.io/badge/release-v1.5.5-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud)
[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/)
[![FFXIV](https://img.shields.io/badge/FFXIV-Dawntrail-c3a37f)](https://www.finalfantasyxiv.com/)
@@ -11,7 +11,7 @@
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
</p>
**Version 1.5.2** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
**Version 1.5.5** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine
@@ -55,7 +55,7 @@ Hellion Chat is developed under **Hellion Forge**, the specialized modding and p
| UI | Dear ImGui (Dalamud bindings) |
| Database | SQLite (Microsoft.Data.Sqlite, MessagePack storage) |
| Localization | ResX (HellionStrings.resx, .de.resx; PR-based) |
| Font | Exo 2 (SIL Open Font License 1.1, bundled) |
| Font | Inter Light (SIL Open Font License 1.1, bundled) |
| Toolchain | dotnet 10 SDK, VS Code with C# Dev Kit |
| Deployment | GitHub Releases + custom repo (`repo.json`) |
@@ -103,7 +103,7 @@ Hellion Chat is developed under **Hellion Forge**, the specialized modding and p
Colors: Classic (Chat 2 default), High Contrast, Pastel, Dark Mode Tuned, Hellion (brand), plus
bonus moods Night Blue and Indigo Violet. One-click apply, battle channels remain untouched.
- **Window opacity slider** for combat-friendly transparency.
- **Bundled Hellion font** (Exo 2, OFL-1.1) as an optional default instead of the system font.
- **Bundled UI font** (Inter Light, OFL-1.1) as an optional default instead of the system font.
- **Hellion logo** bundled in the plugin and displayed in the Dalamud plugin list.
#### Custom Themes (v1.1.0)
@@ -164,8 +164,8 @@ HellionChat/
│ ├── HellionStrings.de.resx # German translation
│ ├── HellionStrings.Designer.cs # Hand-maintained accessor
│ ├── ChatColourPresets.cs # Seven built-in color presets (v0.6.0)
│ ├── HellionFont.ttf # Exo 2 variable font
│ ├── HellionFont-OFL.txt # OFL-1.1 license text (bundled with font)
│ ├── Inter-Light.ttf # Inter Light static font (bundled UI font)
│ ├── Inter-OFL.txt # OFL-1.1 license text (bundled with font)
│ └── Language*.resx # Upstream localization (Crowdin)
├── Ui/
│ ├── FirstRunWizard.cs # Three-profile onboarding
@@ -299,6 +299,41 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo
## Project Status
**Version 1.5.5** — Upstream-Sync Tab-Features. Failed tells now raise a warning toast
when a message could not be delivered (recipient offline, in an instance, or blocking
you). Per-tab notification sounds let each tab play one of the 16 game chat sounds or
three bundled Hellion sounds when a message arrives on a background tab, with a
preview button. The tab rename field in the right-click menu auto-focuses on open and
accepts up to 512 characters. A jump-to-latest button appears in the chat log header
while scrolled up from the live end. Map-flag and item-link insertion is available from
the chat input right-click menu. The Hellion Forge fox banner in the first-run wizard
and the Information tab is now a real image. Schema bumped to v18, additive fields
only, no data migration.
---
### Project status (pre-v1.5.4, kept for context)
**Version 1.5.3** — Localisation Wave + Bundled-Font Overhaul. Twenty-four selectable UI languages
(Catalan, Czech, Danish, Dutch, English, Finnish, French, German, Greek, Hungarian, Italian,
Japanese, Korean, Norsk bokmål, Polish, Portuguese (Brazil), Portuguese (Portugal), Romanian,
Russian, Spanish, Swedish, Turkish, Ukrainian, Simplified Chinese, Traditional Chinese); dropdown
sorts alphabetically by endonym, "None" pinned first. Non-native translations are AI-assisted and
flagged for community native-speaker review. The bundled UI font swaps from Exo 2 to **Inter
Light** (SIL OFL 1.1, 343 KB) for wider Latin Extended-A/B, Greek polytonic and Cyrillic Supplement
coverage. **NotoSansCjkRegular** joins as a third merge layer so Hangul and Simplified-Chinese
glyphs the FFXIV Japanese game font does not ship now render correctly. First-frame HITCH dropped
from ~74 ms (v1.5.2 baseline that held since v1.4.x) to a median of ~20 ms (5-reload sample
17.9-23.6 ms, Linux/Wine) as a side effect: the bundled-font path was silently falling back to the
FFXIV Axis game font for the entire v1.5.x series because of an early-return in `Plugin.cs:937`.
The fix routes `RegularFont` through draw whenever either `FontsEnabled` or `UseHellionFont` is on,
and lands the defer-pattern win v1.5.1 was reaching for. `ExtraGlyphRanges` auto-activates the
matching flag on language change; two new flags (`LatinExtended`, `Greek`) join the existing set.
A WarningText under the language dropdown notes that FFXIV's own chat input only fully supports
EN/DE/FR/JA — other languages may garble when typed in-game. Migration v17 stays.
---
**Version 1.5.2** — First-Run Wizard Rework. The single-page wizard becomes a four-step
staged-commit flow (Welcome → Privacy → Power Settings → Done). The privacy picker becomes a 2×2
grid with a fourth profile "Roleplay" that extends Privacy-First with `Say` and both emote types
@@ -357,7 +392,7 @@ Hellion Chat is a standalone plugin, no longer a fork in the repository sense. F
- First-run wizard with three profiles
- Plugin identity: own `HellionChat` slot, layout migration from Chat 2, Migrate3 recovery
- Bilingual UI (EN and DE) with live language switching
- Hellion theme, Hellion logo, bundled Exo 2 font
- Hellion theme, Hellion logo, bundled Inter Light font
- Custom repo pipeline with automated GitHub Release distribution
- Slash commands consolidated to the `/hellionchat` family
- Web interface removed (v0.2.0)
+110
View File
@@ -11,6 +11,116 @@ releases as an overview and links to the release pages for details.
---
## Hellion Chat 1.5.5 — Upstream-Sync Tab-Features (2026-05-21)
A backlog-sync cycle. Inherited tab items: a failed-tell warning toast, per-tab
notification sounds (16 game sounds or three bundled Hellion sounds with a
preview button), an auto-focusing 512-character tab rename, a jump-to-latest
button in the chat log header, and map-flag / item-link insertion from the chat
input. Plus the Hellion Forge fox banner becomes a real image. Schema bumped to
v18, additive fields only, no data migration.
---
## Hellion Chat 1.5.4 — Polish and Motion (2026-05-20)
A polish cycle of three P3 items. Theme switches now crossfade smoothly over ~300 ms
across every Hellion-rendered surface; the window background snaps deliberately so the
per-window opacity override from Dalamud's pinning menu stays intact. A new header
quick-picker — a palette button left of the cog — opens a compact popup for switching
themes and tabs without opening Settings. Sidebar icons and card-mode message borders
gain framerate-independent hover animations. A new "Reduce motion" toggle in Theme &
Layout disables the crossfade, hover animations and unread-tab pulse for accessibility.
No schema bump, migration v17 stays.
## Hellion Chat 1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)
Multi-language pass plus a long-standing first-frame HITCH lands as a side effect of a font-stack
rewrite. The bundled UI font swaps from Exo 2 to Inter Light. HellionChat now ships strings and
renderable glyph coverage for 24 languages.
### User-visible
- Twenty-four selectable UI languages: Catalan, Czech, Danish, Dutch, English, Finnish, French,
German, Greek, Hungarian, Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese (Brazil),
Portuguese (Portugal), Romanian, Russian, Spanish, Swedish, Turkish, Ukrainian, Simplified
Chinese, Traditional Chinese. The dropdown sorts alphabetically by endonym, "None" pinned first.
Non-native translations are AI-assisted and flagged for community native-speaker review via the
Hellion Forge Discord.
- Bundled **Inter Light** replaces Exo 2 as the in-plugin font. Wider European coverage (Latin
Extended-A/B, Greek polytonic, Cyrillic Supplement) so Czech, Polish, Romanian, Turkish,
Hungarian, Greek and Ukrainian render without manual font configuration. SIL OFL 1.1, 343 KB.
- **NotoSansCjkRegular fallback** layer added as a merge-on-top so Hangul, Simplified-Chinese
characters specific to the post-1956 reform, and other CJK glyphs the FFXIV Japanese game font
does not ship now render correctly inside the HellionChat UI.
- First-frame **HITCH dropped from ~74 ms** (the v1.5.2 baseline that has held since v1.4.x) to a
**median of ~20 ms** (5-reload sample: 23.6 / 20.4 / 17.9 / 20.1 / 19.2 ms, Linux/Wine; Windows
baseline pending Jin's verification per the cross-platform-pflicht). The bundled-font path
silently fell back to the FFXIV Axis game font for the entire v1.5.x series because of an
early-return in the draw loop. The fix that routes `RegularFont` through draw also lands the
defer-pattern win the v1.5.1 cycle was reaching for.
- **ExtraGlyphRanges activates automatically** when the user picks a language that needs a non-Latin
script. Selecting Korean enables the Korean glyph range and rebuilds the atlas without a manual
toggle in Fonts & Colours.
- New **WarningText under the language dropdown** notes that FFXIV's own chat input only fully
supports EN, DE, FR and JA character sets. Other languages render inside HellionChat but may
garble when typed into in-game chat or sent as messages.
### Under the hood
- Three-layer font stack in `FontManager.BuildRegularFontHandle` and `BuildItalicFontHandle`:
Inter Light (or the user-selected global font) as primary, FFXIV JapaneseFont as merge 1 for
native FFXIV kana/kanji style, NotoSansCjkRegular as merge 2 for everything else CJK.
- Two new `ExtraGlyphRanges` flags: `LatinExtended` (U+0100-U+024F) and `Greek` (U+0370-U+03FF +
U+1F00-U+1FFF). Implemented as `builder.AddChar` pair lists in `SetUpRanges` (no managed-pointer
pinning needed).
- `LanguageOverride` enum gains ten locales (Catalan, Czech, Danish, Finnish, Hungarian,
Norwegian, Polish, Portuguese (Portugal), Turkish, Ukrainian) plus three previously
commented-out entries (Italian, Korean, Norwegian re-enabled with code `nb` instead of `no`).
New values are appended to the enum to keep existing user-config integer serialisation stable.
- **Crowdin gap closed:** four ChatTwo keys added after the last community sync
(`Options_ColorSelectedInputChannelButton_Name` / `_Description`,
`Options_HideInNewGamePlusMenu_Name` / `_Description`) are now backfilled into the thirteen
legacy Crowdin locales with per-key AI-translated markers.
- Plugin init runs a one-shot migration that ORs in the matching `ExtraGlyphRanges` flag based on
the user's current `LanguageOverride`. An update from v1.5.2 picks up the new coverage without
the user having to toggle the language twice.
- `Plugin.cs:937` draw-path fixed: `RegularFont` is now pushed whenever **either** `FontsEnabled`
**or** `UseHellionFont` is on. The previous `Config.FontsEnabled`-only check meant the bundled
font path was silently dead whenever `FontsAndColours.cs:50` force-set `FontsEnabled = false` on
the UseHellionFont-toggle. Source of the HITCH win.
- `ExtraGlyphRanges` settings panel is now reachable in **all** UseHellionFont / FontsEnabled
combinations. The bundled-font branch used to short-circuit past it.
- **Resource bundle split:** fork-added strings live in `HellionStrings.resx` (24 locales, 328
keys each) alongside the ChatTwo-Crowdin-heritage `Language.resx` (24 locales, 456 keys each).
The `Language` siblings for the ten brand-new locales and Greek carry a Hellion Forge maintainer
header that points reviewers at the Discord rather than the standalone-hosted Gitea.
- **Em-dash sweep** across the EN source and 18 translations: in-prose em-dashes replaced with
period or colon per the house style guide. Russian and Ukrainian keep their typographic norm
where the em-dash is orthographically required (subject-predicate separator).
- **Bundled font asset rotation:** `HellionFont.ttf` (Exo 2) plus its OFL notice removed from
`Resources/`. `Inter-Light.ttf` plus `Inter-OFL.txt` take their place. `FontManager`
references rename to `BundledFontBytes` / `TryGetBundledFontBytes()` for clarity (config field
`UseHellionFont` keeps its name so existing user configs deserialize cleanly).
### Migration
- Migration v17 stays (no schema bump).
- Existing `UseHellionFont = true` users transition transparently from Exo 2 to Inter Light on
first reload.
- Existing users with `LanguageOverride != None` get their matching `ExtraGlyphRanges` flag set
on the first plugin init after the v1.5.3 update (Plugin.cs LoadAsync migration step).
### Reserved for follow-up cycles
- Native-speaker review pass for AI-assisted translations in the 13 legacy Crowdin locales (ca,
es, fr, it, ja, ko, nl, pt-BR, ro, ru, sv, zh-Hans, zh-Hant) — corrections via the Hellion
Forge Discord.
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
## Hellion Chat 1.5.2 — First-Run Wizard Rework (2026-05-18)
UX patch. The single-page first-run wizard becomes a four-step staged-commit flow, the privacy
+20
View File
@@ -0,0 +1,20 @@
# Third-Party Asset Credits
## Bundled Notification Sounds
- **notification-1.wav, notification-2.wav, notification-3.wav**
Creator: Universfield
Source: [Pixabay](https://pixabay.com/users/universfield-28281460/)
License: Pixabay Content License (royalty-free, commercial use permitted)
## Branding
- **Fox banner image** (`fox-banner.png`)
Creator: InklyTattooDesigns (Etsy)
License: Royalty-free for commercial and logo use
## Libraries
- **NAudio** - Copyright (c) Mark Heath
License: MIT
Source: <https://github.com/naudio/NAudio>
+62 -6
View File
@@ -10,13 +10,69 @@ be a poor fit for the plugin's privacy-first scope during brainstorming.
---
## Next Cycle (v1.5.3)
## Next Cycle
**French localisation.** Strings from `Resources/HellionStrings.resx` get a FR translation pass
(DeepL first draft), then Hezcal native-speaker review before release. After that, the Plugin
Integrations Wave 2-6 (Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM) and the
UiBuilder first-frame HITCH investigation that v1.5.1 surfaced are queued behind it, alongside the
Wine/Linux scroll-rubber-band spike at the tail.
**v1.5.5b — Upstream-Sync Filter/Notification/Polish** is the next planned scope: the second half
of the backlog-sync wave, covering filter improvements, notification refinements, and UI polish
items that did not fit the v1.5.5 bundle. Plugin Integrations Wave 2-6 (Context-Menu,
NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM) follows.
Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in
parallel as a continuous correction pass, gathered via the Hellion Forge Discord.
---
## v1.5.5 — Upstream-Sync Tab-Features (released 2026-05-21)
A backlog-sync cycle of inherited tab-feature items. Failed tells now raise a warning toast when a
message could not be delivered (recipient offline, in an instance, or blocking you), toggleable in
Settings. Per-tab notification sounds let each tab play one of the 16 game chat sounds or three
bundled Hellion sounds when a message arrives on a background tab, with a preview button. The tab
rename field in the right-click menu auto-focuses on open and accepts up to 512 characters. A
jump-to-latest button appears in the chat log header while scrolled up from the live end.
Map-flag and item-link insertion is available from the chat input right-click menu. The Hellion
Forge fox banner in the first-run wizard and the Information tab is now a real image instead of
ASCII art. Schema bumped to v18, additive fields only, no data migration.
---
## v1.5.4 — Polish and Motion (released 2026-05-20)
A polish cycle of three P3 items. Theme switches crossfade over ~300 ms across every
Hellion-rendered surface; the window background snaps deliberately to preserve the
per-window opacity override from Dalamud's pinning menu. A header quick-picker — a
palette button left of the cog — switches themes and tabs from a compact popup without
opening Settings. Sidebar icons and card-mode borders gain framerate-independent hover
animations. A new "Reduce motion" toggle in Theme & Layout covers accessibility. No
schema bump; migration v17 stays.
---
## v1.5.3 — Localisation Wave + Bundled-Font Overhaul (released 2026-05-19)
Twenty-four selectable UI languages: from FR-only as the original plan scope, the cycle expanded to
cover Catalan, Czech, Danish, Finnish, Greek, Hungarian, Italian, Korean, Norwegian, Polish,
Portuguese (Portugal), Turkish and Ukrainian alongside the existing Crowdin-heritage locales, all
AI-translated and flagged for community review. Bundled font swaps from Exo 2 to **Inter Light**
for wider European glyph coverage (Latin Extended-A/B, Greek polytonic, Cyrillic Supplement);
**NotoSansCjkRegular** joins as a third merge layer so Hangul and Simplified-Chinese-specific Han
glyphs render correctly inside the HellionChat UI.
First-frame HITCH dropped from **~74 ms to a median of ~20 ms** (5-reload sample 17.9-23.6 ms,
Linux/Wine) as a side effect: the bundled-font path was silently falling back to the FFXIV Axis
game font for the entire v1.5.x series because of an early-return in `Plugin.cs:937`. The fix
routes `RegularFont` through draw whenever either `FontsEnabled` or `UseHellionFont` is on, and
lands the defer-pattern win v1.5.1 was reaching for.
`ExtraGlyphRanges` auto-activates the matching flag on language change. Two new flags
(`LatinExtended`, `Greek`) join the existing set. Plugin init runs a one-shot migration that ORs
the required flag into the saved config for users updating from v1.5.2 with a non-default language
already selected. A WarningText under the language dropdown notes that FFXIV's own chat input only
fully supports EN/DE/FR/JA — other languages may garble when typed into in-game chat.
Migration v17 stays. `LanguageOverride` enum grows by ten locales plus three previously
commented-out (Italian, Korean, Norwegian with code `nb`); all new values append to keep existing
user-config integer serialisation stable.
---

Some files were not shown because too many files have changed in this diff Show More