fix(privacy): translate the channel list and give it back its presets

Reported after a translation pass: the channel list in Data & Privacy
reads English in every language. It was not, as assumed, the client's
own naming -- the list called ToString() on the enum member, so it
showed "FreeCompanyLoginLogout" while Language.ChatType_* sat next to it
holding "Freie Gesellschaft (An-/Abmeldung)" in all 25 languages.

Fixing the label exposed how little else the list had. Six translated
strings written for exactly this control had no caller: the explanation
of what it does, the note that it governs the database and not the chat
window, and three presets -- data minimisation, select all, deselect
all. Eighty-nine checkboxes without a "recommended" button is not a
choice anyone makes.

So the list now carries the same eight groups the export uses, with the
individual channels one fold away. It is the one control that decides
what reaches the database; the two screens describing channels the same
way is worth more here than anywhere else.

The unknown-channel switch gets its description back, and the telemetry
section stops being the last English literal in the tab. It stays a
statement rather than a switch: a toggle would imply there is something
to turn off.
This commit is contained in:
2026-08-18 22:30:12 +02:00
parent 9b634f54e9
commit 4f3bdc3c7b
27 changed files with 224 additions and 19 deletions
+2
View File
@@ -380,6 +380,8 @@ internal class HellionStrings
internal static string Settings_Section_Retention => Get(nameof(Settings_Section_Retention));
internal static string Settings_Section_Cleanup => Get(nameof(Settings_Section_Cleanup));
internal static string Settings_Section_Export => Get(nameof(Settings_Section_Export));
internal static string Settings_Section_Telemetry => Get(nameof(Settings_Section_Telemetry));
internal static string Settings_Telemetry_None => Get(nameof(Settings_Telemetry_None));
internal static string Settings_Section_Database => Get(nameof(Settings_Section_Database));
// Hellion Chat — v1.2.1 Migration v15 → v16 toast
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>No s'ha pogut esborrar l'historial. No s'ha eliminat res, consulta /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>No es recull cap telemetria. El complement no envia res sobre tu ni sobre el teu ús enlloc.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Vymazání historie selhalo. Nic nebylo odstraněno, viz /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetrie</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Nesbírá se žádná telemetrie. Plugin nikam neposílá nic o vás ani o vašem používání.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Sletning af historikken mislykkedes. Intet blev fjernet, se /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetri</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Der indsamles ingen telemetri. Pluginet sender intet om dig eller din brug nogen steder.</value>
</data>
</root>
@@ -1181,4 +1181,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Das Löschen des Verlaufs ist fehlgeschlagen. Es wurde nichts entfernt, siehe /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetrie</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Es wird keine Telemetrie erhoben. Das Plugin sendet nichts über dich oder deine Nutzung irgendwohin.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Η διαγραφή του ιστορικού απέτυχε. Δεν αφαιρέθηκε τίποτα, δείτε /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Τηλεμετρία</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Δεν συλλέγεται τηλεμετρία. Το πρόσθετο δεν στέλνει πουθενά τίποτα για εσάς ή τη χρήση σας.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>No se pudo borrar el historial. No se eliminó nada, consulta /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetría</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>No se recopila telemetría. El complemento no envía nada sobre ti ni sobre tu uso a ninguna parte.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Historian tyhjennys epäonnistui. Mitään ei poistettu, katso /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Telemetriaa ei kerätä. Lisäosa ei lähetä mitään sinusta tai käytöstäsi minnekään.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>L'effacement de l'historique a échoué. Rien n'a été supprimé, voir /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Télémétrie</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Aucune télémétrie n'est collectée. Le plugin n'envoie rien vous concernant ni sur votre utilisation.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Az előzmények törlése nem sikerült. Semmi sem lett eltávolítva, lásd /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Nem gyűjtünk telemetriát. A bővítmény semmit sem küld rólad vagy a használatodról sehová.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>La cancellazione della cronologia non è riuscita. Non è stato rimosso nulla, vedi /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Non viene raccolta alcuna telemetria. Il plugin non invia nulla su di te o sul tuo utilizzo.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>履歴の削除に失敗しました。何も削除されていません。/xllog を確認してください。</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>テレメトリ</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>テレメトリは収集していません。あなたや利用状況に関する情報をどこにも送信しません。</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>기록 삭제에 실패했습니다. 아무것도 삭제되지 않았습니다. /xllog를 확인하세요.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>원격 측정</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>원격 측정 정보를 수집하지 않습니다. 사용자나 사용 내역에 관한 어떤 정보도 전송하지 않습니다.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Sletting av historikken mislyktes. Ingenting ble fjernet, se /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetri</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Ingen telemetri samles inn. Programtillegget sender ingenting om deg eller bruken din noe sted.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Het wissen van de geschiedenis is mislukt. Er is niets verwijderd, zie /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetrie</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Er wordt geen telemetrie verzameld. De plug-in stuurt niets over jou of je gebruik ergens heen.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Usuwanie historii nie powiodło się. Nic nie zostało usunięte, zobacz /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Nie zbieramy żadnej telemetrii. Wtyczka nigdzie nie wysyła informacji o tobie ani o twoim użytkowaniu.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Falha ao apagar o histórico. Nada foi removido, veja /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Nenhuma telemetria é coletada. O plugin não envia nada sobre você ou seu uso para lugar nenhum.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Falha ao apagar o histórico. Nada foi removido, consulte /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetria</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Não é recolhida qualquer telemetria. O plugin não envia nada sobre si ou sobre a sua utilização.</value>
</data>
</root>
@@ -1207,4 +1207,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Clearing the history failed. Nothing was removed, see /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetry</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>No telemetry is collected. The plugin sends nothing about you or your usage anywhere.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Ștergerea istoricului a eșuat. Nu a fost eliminat nimic, vezi /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetrie</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Nu se colectează telemetrie. Extensia nu trimite nimic despre tine sau despre utilizarea ta nicăieri.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Не удалось удалить историю. Ничего не было удалено, см. /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Телеметрия</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Телеметрия не собирается. Плагин никуда не отправляет данные о вас или о вашем использовании.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Raderingen av historiken misslyckades. Ingenting togs bort, se /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetri</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Ingen telemetri samlas in. Tillägget skickar ingenting om dig eller din användning någonstans.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Geçmiş silinemedi. Hiçbir şey kaldırılmadı, /xllog kaydına bakın.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Telemetri</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Hiçbir telemetri toplanmıyor. Eklenti sizinle veya kullanımınızla ilgili hiçbir şeyi hiçbir yere göndermiyor.</value>
</data>
</root>
@@ -1186,4 +1186,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>Не вдалося видалити історію. Нічого не було видалено, див. /xllog.</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>Телеметрія</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>Телеметрія не збирається. Плагін нікуди не надсилає дані про вас або про ваше використання.</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>清空历史记录失败。没有删除任何内容,请查看 /xllog。</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>遥测</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>不收集任何遥测数据。插件不会向任何地方发送关于你或你使用情况的信息。</value>
</data>
</root>
@@ -1187,4 +1187,10 @@
<data name="Settings_Database_ClearError" xml:space="preserve">
<value>清除歷史紀錄失敗。沒有刪除任何內容,請查看 /xllog。</value>
</data>
<data name="Settings_Section_Telemetry" xml:space="preserve">
<value>遙測</value>
</data>
<data name="Settings_Telemetry_None" xml:space="preserve">
<value>不收集任何遙測資料。外掛不會向任何地方傳送關於你或你使用情況的資訊。</value>
</data>
</root>
@@ -186,7 +186,7 @@ internal sealed class DataPrivacyTab
_w.ToggleRow(
ImGui.GetID("privacy.filter.unknown"u8),
HellionStrings.Privacy_PersistUnknown_Name,
null,
HellionStrings.Privacy_PersistUnknown_Description,
() => Plugin.Config.PrivacyPersistUnknownChannels,
v => Plugin.Config.PrivacyPersistUnknownChannels = v
);
@@ -226,11 +226,18 @@ internal sealed class DataPrivacyTab
if (dbOpen)
DrawDatabaseSection();
if (_w.Section(ImGui.GetID("privacy.telemetry"u8), "Telemetry", open: false))
if (
_w.Section(
ImGui.GetID("privacy.telemetry"u8),
HellionStrings.Settings_Section_Telemetry,
open: false
)
)
{
// Read-only placeholder; no telemetry is wired in v1.7.0. Do not
// promote this to a toggle without an explicit Sub-Spec change.
ImGui.TextUnformatted("No telemetry is collected.");
// Read-only statement, not a switch. Do not promote it to one
// without an explicit Sub-Spec change: a toggle implies there is
// something to turn off.
ImGuiUtil.HelpText(HellionStrings.Settings_Telemetry_None);
}
}
@@ -1331,33 +1338,79 @@ internal sealed class DataPrivacyTab
WrapperUtil.AddNotification(message, type);
}
// The one control that decides what reaches the database, so it is worth
// being usable. Eighty-nine checkboxes in one flat run is not; the same
// eight groups the export uses carry it, with the individual channels one
// fold away for the cases that need them.
private void DrawPrivacyPersistChannelsGrid()
{
// HashSet<ChatType>: iterate Enum.GetValues<ChatType>() for stable
// display order (HashSet itself has none); toggle membership via
// Contains/Add/Remove.
ImGui.TextUnformatted("Persist channels:");
foreach (var ct in Enum.GetValues<ChatType>())
ImGuiUtil.HelpText(HellionStrings.Privacy_Whitelist_Help);
ImGuiUtil.HelpText(HellionStrings.Privacy_FilterEnabled_StorageOnly_Help);
ImGui.Spacing();
if (ImGui.Button(HellionStrings.Privacy_Preset_PrivacyFirst))
ApplyPersistPreset(PrivacyDefaults.PrivacyFirstWhitelist);
ImGui.SameLine();
if (ImGui.Button(HellionStrings.Privacy_Preset_SelectAll))
ApplyPersistPreset(EnumValues<ChatType>.All);
ImGui.SameLine();
if (ImGui.Button(HellionStrings.Privacy_Preset_ClearAll))
ApplyPersistPreset([]);
ImGui.Spacing();
for (var i = 0; i < ChannelGroups.All.Length; i++)
{
var label = ct.ToString();
var present = Plugin.Config.PrivacyPersistChannels.Contains(ct);
if (ImGui.Checkbox($"{label}##privacy-persist-{label}", ref present))
var (heading, types) = ChannelGroups.All[i];
var picked = 0;
foreach (var type in types)
if (Plugin.Config.PrivacyPersistChannels.Contains(type))
picked++;
// ### keeps the node's identity while the visible count changes and
// while the language changes; without it every tick would collapse
// the fold the user just opened.
using var tree = ImRaii.TreeNode(
$"{heading()} ({picked}/{types.Length})###hc-persist-group-{i}"
);
if (!tree.Success)
continue;
foreach (var type in types)
{
var present = Plugin.Config.PrivacyPersistChannels.Contains(type);
// Name(), not ToString(): the enum member is an identifier, and
// this list showed "FreeCompanyLoginLogout" in every language
// while the translated channel name sat unused next to it.
if (!ImGui.Checkbox($"{type.Name()}##privacy-persist-{(int)type}", ref present))
continue;
// Lock closes before SaveConfig: taking ConfigMapsLock across a save
// would invert the lock order (SaveConfig can reach TabsListLock).
lock (_plugin.ConfigMapsLock)
{
if (present)
{
Plugin.Config.PrivacyPersistChannels.Add(ct);
}
Plugin.Config.PrivacyPersistChannels.Add(type);
else
{
Plugin.Config.PrivacyPersistChannels.Remove(ct);
}
Plugin.Config.PrivacyPersistChannels.Remove(type);
}
_plugin.SaveConfig();
}
}
}
private void ApplyPersistPreset(IReadOnlyCollection<ChatType> types)
{
lock (_plugin.ConfigMapsLock)
{
Plugin.Config.PrivacyPersistChannels.Clear();
foreach (var type in types)
Plugin.Config.PrivacyPersistChannels.Add(type);
}
_plugin.SaveConfig();
}
}