From 47d427ed6e44d6ecd958531c732063d3163d1f3f Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 9 May 2022 21:10:58 -0700 Subject: [PATCH] fix: Adds cliloc replacement support (#1014) --- .../LocalizationInterpolationHandler.cs | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/Projects/Server/Localization/LocalizationInterpolationHandler.cs b/Projects/Server/Localization/LocalizationInterpolationHandler.cs index 62908ea3c..2ad07e3b1 100644 --- a/Projects/Server/Localization/LocalizationInterpolationHandler.cs +++ b/Projects/Server/Localization/LocalizationInterpolationHandler.cs @@ -32,6 +32,7 @@ public ref struct LocalizationInterpolationHandler private int _index; private string?[] _slices; private string? _current; + private string _lang; public LocalizationInterpolationHandler(int literalLength, int formattedCount, LocalizationEntry entry, out bool isValid) { @@ -42,6 +43,7 @@ public ref struct LocalizationInterpolationHandler _pos = 0; _index = 0; _current = null; + _lang = entry.Language; } public LocalizationInterpolationHandler(int literalLength, int formattedCount, int number, out bool isValid) @@ -67,6 +69,7 @@ public ref struct LocalizationInterpolationHandler _pos = 0; _index = 0; _current = null; + _lang = lang; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -218,7 +221,7 @@ public ref struct LocalizationInterpolationHandler public void AppendFormatted(ReadOnlySpan value) { - if (!ReadyToAppend()) + if (!ReadyToAppend() || TryAppendClilocNumber(value)) { return; } @@ -279,22 +282,49 @@ public ref struct LocalizationInterpolationHandler public void AppendFormatted(string? value) { - if (ReadyToAppend()) + if (!ReadyToAppend() || TryAppendClilocNumber(value)) { - if (value?.TryCopyTo(_chars[_pos..]) == true) - { - _pos += value.Length; - } - else - { - AppendFormattedSlow(value); - } + return; + } + + if (value?.TryCopyTo(_chars[_pos..]) == true) + { + _pos += value.Length; + } + else + { + AppendFormattedSlow(value); } } public void AppendFormatted(string? value, int alignment, string? format = null) => AppendFormatted(value, alignment, format); + private bool TryAppendClilocNumber(ReadOnlySpan value) + { + if ( + value[0] != '#' || + !int.TryParse(value[1..], out var number) || + !Localization.TryGetLocalization(_lang, number, out var entry) + ) + { + return false; + } + + var text = entry.Text; + + if (text.TryCopyTo(_chars[_pos..])) + { + _pos += text.Length; + } + else + { + AppendFormattedSlow(text); + } + + return true; + } + private void AppendOrInsertAlignmentIfNeeded(int startingPos, int alignment) { var charsWritten = _pos - startingPos;