i18n: the five spots the smoke test found, and a BOM in the export
Reported from a real pass through the window. The theme categories were a static readonly array, so the five names froze at whatever language the plugin started in and a runtime switch relabelled the entire window except them. Same shape as the layout labels earlier in this cycle; this one got missed because replacing the literals with resource lookups looks finished until you actually switch. The status bar built its counts from English literals -- tab, tabs, msg, tell, tells -- and the privacy pill said "Privacy-First" in all 25 files. The thousands separator follows the user's culture now too, so German reads 1,2k rather than 1.2k. The live preview claims to show what the window will look like. It was showing English channel names next to a translated placeholder, which is worse than either. Channel labels come from ChatType.Name() now and the status slots share the strings with the real status bar. The four mock chat lines stay English on the earlier decision. And the export wrote a byte order mark. Encoding.UTF8 emits one, and a leading U+FEFF makes the JSON invalid for every strict parser -- confirmed against a real export from the game, where python's json.load refused the file. CSV keeps its BOM, because without one Excel guesses the codepage and mangles every non-ASCII name. The self-test that was supposed to catch that read the file with File.ReadAllText, which strips a BOM while detecting the encoding. It reads bytes now. The status bar tests asserted English literals and started failing on a German machine -- they pin a fixed culture now instead of inheriting the locale of whoever runs them.
This commit is contained in:
@@ -49,6 +49,8 @@ internal static class ExportFormatExt
|
||||
// substring is applied here.
|
||||
internal static class MessageExporter
|
||||
{
|
||||
private static readonly UTF8Encoding Utf8NoBom = new(encoderShouldEmitUTF8Identifier: false);
|
||||
|
||||
internal record FilterDescription(
|
||||
IReadOnlyCollection<int>? ChatTypes,
|
||||
DateTimeOffset? From,
|
||||
@@ -82,7 +84,14 @@ internal static class MessageExporter
|
||||
int written;
|
||||
try
|
||||
{
|
||||
using (var writer = new StreamWriter(temp, append: false, encoding: Encoding.UTF8))
|
||||
// Encoding.UTF8 writes a byte order mark, and that is not a
|
||||
// cosmetic detail here: a leading U+FEFF makes the JSON invalid for
|
||||
// every strict parser, Python's json.load included. CSV is the one
|
||||
// format that wants it -- without a BOM Excel guesses the codepage
|
||||
// and mangles every non-ASCII name in the file.
|
||||
var encoding = format == ExportFormat.Csv ? Encoding.UTF8 : Utf8NoBom;
|
||||
|
||||
using (var writer = new StreamWriter(temp, append: false, encoding))
|
||||
{
|
||||
written = format switch
|
||||
{
|
||||
|
||||
@@ -380,6 +380,14 @@ internal class HellionStrings
|
||||
internal static string Settings_Fonts_Global => Get(nameof(Settings_Fonts_Global));
|
||||
internal static string Settings_Fonts_Active => Get(nameof(Settings_Fonts_Active));
|
||||
internal static string Settings_Preview_TypeAMessage => Get(nameof(Settings_Preview_TypeAMessage));
|
||||
internal static string StatusBar_Tabs_One => Get(nameof(StatusBar_Tabs_One));
|
||||
internal static string StatusBar_Tabs_Other => Get(nameof(StatusBar_Tabs_Other));
|
||||
internal static string StatusBar_Tells_One => Get(nameof(StatusBar_Tells_One));
|
||||
internal static string StatusBar_Tells_Other => Get(nameof(StatusBar_Tells_Other));
|
||||
internal static string StatusBar_Messages => Get(nameof(StatusBar_Messages));
|
||||
internal static string StatusBar_MessagesThousands => Get(nameof(StatusBar_MessagesThousands));
|
||||
internal static string Settings_Preview_TitleMock => Get(nameof(Settings_Preview_TitleMock));
|
||||
internal static string Settings_Preview_StatusOpen => Get(nameof(Settings_Preview_StatusOpen));
|
||||
internal static string Settings_Section_Links => Get(nameof(Settings_Section_Links));
|
||||
internal static string Settings_Section_Behaviour => Get(nameof(Settings_Section_Behaviour));
|
||||
internal static string Settings_Section_Keybinds => Get(nameof(Settings_Section_Keybinds));
|
||||
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Conserva</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privadesa primer</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Obert</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>manteniment</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} pestanya</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} pestanyes</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} xiuxiueig</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} xiuxiueigs</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campió» Vista prèvia</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>obert</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Ponechat</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Soukromí především</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Otevřeno</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>údržba</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} karta</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} karty</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} šeptání</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} šeptání</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} zpr.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k zpr.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Šampion» Náhled</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>otevřeno</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Behold</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privatliv først</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Åben</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>vedligeholdelse</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} tab</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} tabs</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tells</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} besk.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k besk.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» Forhåndsvisning</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>åben</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Behalten</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Datenschutz zuerst</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Offen</value>
|
||||
@@ -1328,4 +1328,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>Wartung</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} Tab</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} Tabs</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} Flüstern</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} Flüstern</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} Nachr.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k Nachr.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» Vorschau</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>offen</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Διατήρηση</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Απόρρητο πρώτα</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Ανοιχτό</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>συντήρηση</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} καρτέλα</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} καρτέλες</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tells</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} μην.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k μην.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Πρωταθλητής» Προεπισκόπηση</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>ανοιχτό</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Mantener</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privacidad primero</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Abierto</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>mantenimiento</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} pestaña</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} pestañas</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} susurro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} susurros</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msj</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msj</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campeón» Vista previa</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>abierto</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Säilytä</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Yksityisyys ensin</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Avoin</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>ylläpito</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} välilehti</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} välilehteä</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} kuiskaus</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} kuiskausta</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} vie.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k vie.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Mestari» Esikatselu</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>auki</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Conserver</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Confidentialité</value>
|
||||
<value>Confidentialité d'abord</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Ouvert</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>maintenance</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} onglet</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} onglets</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} MP</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} MP</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» Aperçu</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>ouvert</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Megtartás</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Adatvédelem elöl</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Nyitott</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>karbantartás</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} lap</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} lap</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} suttogás</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} suttogás</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} üz.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k üz.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Bajnok» Előnézet</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>nyitva</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Mantieni</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privacy prima</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Aperto</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>manutenzione</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} scheda</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} schede</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} sussurro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} sussurri</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campione» Anteprima</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>aperto</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>保持</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>プライバシー優先</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>オープン</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>メンテナンス</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} タブ</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} タブ</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} テル</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} テル</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} 件</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k 件</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» プレビュー</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>開いています</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>유지</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>개인정보 우선</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>전체 공개</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>유지 관리</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} 탭</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} 탭</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} 귓속말</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} 귓속말</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} 개</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k 개</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» 미리보기</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>열림</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Behold</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Personvern først</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Åpen</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>vedlikehold</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} fane</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} faner</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tells</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} meld.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k meld.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» Forhåndsvisning</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>åpen</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Bewaren</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privacy voorop</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Open</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>onderhoud</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} tabblad</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} tabbladen</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tells</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} ber.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k ber.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Kampioen» Voorbeeld</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>open</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Zachowaj</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Prywatność przede wszystkim</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Otwarty</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>konserwacja</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} zakładka</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} zakładki</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} szept</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} szepty</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} wiad.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k wiad.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Mistrz» Podgląd</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>otwarte</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Manter</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privacidade primeiro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Aberto</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>manutenção</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} aba</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} abas</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} sussurro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} sussurros</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campeão» Pré-visualização</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>aberto</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Manter</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Privacidade primeiro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Aberto</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>manutenção</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} separador</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} separadores</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} sussurro</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} sussurros</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campeão» Pré-visualização</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>aberto</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1345,4 +1345,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>maintenance</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} tab</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} tabs</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tells</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} msg</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k msg</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Champion» Vorschau</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>open</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Păstrează</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Confidențialitate întâi</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Deschis</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>întreținere</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} tab</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} tab-uri</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tell-uri</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} mes.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k mes.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Campion» Previzualizare</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>deschis</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Оставить</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Приватность прежде всего</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Открыто</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>обслуживание</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} вкладка</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} вкладок</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} шёпот</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} шёпотов</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} сообщ.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k сообщ.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Чемпион» Предпросмотр</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>открыт</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Behåll</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Integritet först</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Öppen</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>underhåll</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} flik</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} flikar</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} viskning</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} viskningar</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} medd.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k medd.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Mästare» Förhandsgranskning</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>öppen</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Koru</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Önce gizlilik</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Açık</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>bakım</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} sekme</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} sekme</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} tell</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} ileti</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k ileti</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Şampiyon» Önizleme</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>açık</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>Залишити</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>Приватність передусім</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>Відкрито</value>
|
||||
@@ -1333,4 +1333,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>обслуговування</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} вкладка</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} вкладок</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} шепіт</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} шепотів</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} повід.</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k повід.</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«Чемпіон» Перегляд</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>відкрито</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>保留</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>隐私优先</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>开放</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>维护</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} 标签</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} 标签</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} 密语</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} 密语</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} 条</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k 条</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«冠军» 预览</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>打开</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -704,7 +704,7 @@
|
||||
<value>保留</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Enabled" xml:space="preserve">
|
||||
<value>Privacy-First</value>
|
||||
<value>隱私優先</value>
|
||||
</data>
|
||||
<data name="StatusBar_Privacy_Open" xml:space="preserve">
|
||||
<value>開放</value>
|
||||
@@ -1334,4 +1334,28 @@
|
||||
<data name="Settings_Database_Op_Maintenance" xml:space="preserve">
|
||||
<value>維護</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_One" xml:space="preserve">
|
||||
<value>{0} 分頁</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tabs_Other" xml:space="preserve">
|
||||
<value>{0} 分頁</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_One" xml:space="preserve">
|
||||
<value>{0} 悄悄話</value>
|
||||
</data>
|
||||
<data name="StatusBar_Tells_Other" xml:space="preserve">
|
||||
<value>{0} 悄悄話</value>
|
||||
</data>
|
||||
<data name="StatusBar_Messages" xml:space="preserve">
|
||||
<value>{0} 則</value>
|
||||
</data>
|
||||
<data name="StatusBar_MessagesThousands" xml:space="preserve">
|
||||
<value>{0:0.0}k 則</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_TitleMock" xml:space="preserve">
|
||||
<value>«冠軍» 預覽</value>
|
||||
</data>
|
||||
<data name="Settings_Preview_StatusOpen" xml:space="preserve">
|
||||
<value>開啟</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -126,6 +126,13 @@ internal sealed class ExportRoundTripStep : ISelfTestStep
|
||||
if (File.Exists(path + ".part"))
|
||||
failures.Add("temporary file left behind after a successful export");
|
||||
|
||||
// Bytes, not text. File.ReadAllText strips a byte order mark while
|
||||
// detecting the encoding, so a BOM that breaks every strict JSON parser
|
||||
// is invisible to the check below -- and it shipped exactly that way.
|
||||
var head = File.ReadAllBytes(path);
|
||||
if (head.Length >= 3 && head[0] == 0xEF && head[1] == 0xBB && head[2] == 0xBF)
|
||||
failures.Add("export JSON starts with a byte order mark");
|
||||
|
||||
// Parsed, not merely counted. The writer builds JSON by hand, and it
|
||||
// shipped a build where the chat relation kinds were interpolated as
|
||||
// enum names -- "source_kind":LocalPlayer -- which every parser
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Threading;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using Dalamud.Interface;
|
||||
using Dalamud.Interface.Utility.Raii;
|
||||
using HellionChat.Code;
|
||||
using HellionChat.Resources;
|
||||
using HellionChat.Themes;
|
||||
using HellionChat.Ui.StyleEngine;
|
||||
@@ -153,7 +154,7 @@ internal sealed class LivePreviewPanel : IDisposable
|
||||
// unchanged — but both paths now share one resolver. No truncation here:
|
||||
// the preview draws a fixed, centred "«Champion» Preview" string.
|
||||
var textAbgr = HonorificTitleColor.ResolveTitleAbgr(null, theme);
|
||||
var title = "«Champion» Preview";
|
||||
var title = HellionStrings.Settings_Preview_TitleMock;
|
||||
var crownGlyph = FontAwesomeIcon.Crown.ToIconString();
|
||||
|
||||
// Crown is a FontAwesome glyph (matches the real header); measure + draw
|
||||
@@ -196,7 +197,14 @@ internal sealed class LivePreviewPanel : IDisposable
|
||||
// sat on different rows here, so the preview promised a layout the
|
||||
// sidebar never delivered -- and then the sidebar caught up.
|
||||
var borderAbgr = ColourUtil.RgbaToAbgr(theme.Colors.Border);
|
||||
ReadOnlySpan<string> labels = ["Linkshell", "Tell", "FC"];
|
||||
// Real channel names, not literals: the preview claims to show what the
|
||||
// sidebar will look like, and the sidebar is localised.
|
||||
ReadOnlySpan<string> labels =
|
||||
[
|
||||
ChatType.Linkshell1.Name(),
|
||||
ChatType.TellIncoming.Name(),
|
||||
ChatType.FreeCompany.Name(),
|
||||
];
|
||||
for (var i = 0; i < 3; i++)
|
||||
{
|
||||
var rowMin = new Vector2(origin.X, origin.Y + i * rowHeight);
|
||||
@@ -300,7 +308,7 @@ internal sealed class LivePreviewPanel : IDisposable
|
||||
var pillMax = new Vector2(origin.X + pillWidth, max.Y - 4f);
|
||||
draw.AddRectFilled(pillMin, pillMax, ColourUtil.RgbaToAbgr(theme.Colors.Primary), 6f);
|
||||
|
||||
var pillLabel = "Say";
|
||||
var pillLabel = ChatType.Say.Name();
|
||||
var pillLabelSize = ImGui.CalcTextSize(pillLabel);
|
||||
var pillTextPos = new Vector2(
|
||||
pillMin.X + ((pillMax.X - pillMin.X) - pillLabelSize.X) * 0.5f,
|
||||
@@ -353,7 +361,12 @@ internal sealed class LivePreviewPanel : IDisposable
|
||||
var textAbgr = ColourUtil.RgbaToAbgr(theme.Colors.TextPrimary);
|
||||
var pillY = origin.Y + (height - pillH) * 0.5f;
|
||||
|
||||
ReadOnlySpan<string> slots = ["Say", "open", "3 tabs"];
|
||||
ReadOnlySpan<string> slots =
|
||||
[
|
||||
ChatType.Say.Name(),
|
||||
HellionStrings.Settings_Preview_StatusOpen,
|
||||
string.Format(HellionStrings.StatusBar_Tabs_Other, 3),
|
||||
];
|
||||
ReadOnlySpan<uint> dots =
|
||||
[
|
||||
theme.Colors.StatusSuccess,
|
||||
|
||||
@@ -9,8 +9,11 @@ namespace HellionChat.Ui.Components.Settings;
|
||||
|
||||
internal sealed class ThemePicker
|
||||
{
|
||||
private static readonly (string Category, string[] Slugs, bool DefaultExpanded)[] CategoryMap =
|
||||
{
|
||||
// Built per call, not once. As a static readonly array the category names
|
||||
// froze at whatever language the plugin started in -- a runtime switch
|
||||
// relabelled the whole window except these five.
|
||||
private static (string Category, string[] Slugs, bool DefaultExpanded)[] CategoryMap =>
|
||||
[
|
||||
(
|
||||
"Hellion Brand",
|
||||
new[] { "hellion-arctic", "hellion-spectrum", "forge-merchantman" },
|
||||
@@ -24,7 +27,7 @@ internal sealed class ThemePicker
|
||||
(HellionStrings.Settings_Theme_Category_Natural, new[] { "mint-grove" }, false),
|
||||
(HellionStrings.Settings_Theme_Category_Classic, new[] { "chat2-classic" }, false),
|
||||
(HellionStrings.Settings_Theme_Category_Retro, new[] { "synthwave-sunset" }, false),
|
||||
};
|
||||
];
|
||||
|
||||
// T2 ThemePickerCategoryStep diffs this against ThemeRegistry.BuiltinSlugs
|
||||
// to enforce coverage. Kept on the static map so the test does not pierce instance state.
|
||||
|
||||
@@ -56,9 +56,16 @@ internal sealed class StatusBar
|
||||
{
|
||||
var msgPart =
|
||||
messages >= 1000
|
||||
? string.Format(CultureInfo.InvariantCulture, "{0:0.0}k msg", messages / 1000.0)
|
||||
: $"{messages} msg";
|
||||
var tabsPart = $"{tabs} {(tabs == 1 ? "tab" : "tabs")}";
|
||||
? string.Format(
|
||||
CultureInfo.CurrentCulture,
|
||||
HellionStrings.StatusBar_MessagesThousands,
|
||||
messages / 1000.0
|
||||
)
|
||||
: string.Format(HellionStrings.StatusBar_Messages, messages);
|
||||
var tabsPart = string.Format(
|
||||
tabs == 1 ? HellionStrings.StatusBar_Tabs_One : HellionStrings.StatusBar_Tabs_Other,
|
||||
tabs
|
||||
);
|
||||
return $"{tabsPart} · {msgPart}";
|
||||
}
|
||||
|
||||
@@ -66,7 +73,10 @@ internal sealed class StatusBar
|
||||
{
|
||||
if (count <= 0)
|
||||
return string.Empty;
|
||||
return $"{count} {(count == 1 ? "tell" : "tells")}";
|
||||
return string.Format(
|
||||
count == 1 ? HellionStrings.StatusBar_Tells_One : HellionStrings.StatusBar_Tells_Other,
|
||||
count
|
||||
);
|
||||
}
|
||||
|
||||
// Single-pass aggregator — same shape as the previous helper so the
|
||||
|
||||
Reference in New Issue
Block a user