namespace UnityEngine.Localization.Pseudo
{
///
/// Reverses all strings, to simulate right-to-left locales.
///
public class Mirror : IPseudoLocalizationMethod
{
///
/// Reverse all strings, to simulate right-to-left locales.
///
///
public void Transform(Message message)
{
foreach (var fragment in message.Fragments)
{
if (fragment is WritableMessageFragment writableMessageFragment)
MirrorFragment(writableMessageFragment);
}
}
void MirrorFragment(WritableMessageFragment writableMessageFragment)
{
var mirrorBuffer = new char[writableMessageFragment.Length];
int readPos = writableMessageFragment.Length - 1;
int writePos;
// We search for a new line char in reverse,
// when we find one we then copy that line into the buffer in reverse.
for (int i = writableMessageFragment.Length - 1; i >= 0; --i)
{
// Look for a new line
if (writableMessageFragment[i] == '\n')
{
// Add the new line char
mirrorBuffer[i] = '\n';
// Mirror the line after the new line char.
writePos = i + 1;
while (readPos > i)
{
mirrorBuffer[writePos++] = writableMessageFragment[readPos--];
}
readPos = i - 1;
}
}
// Copy the remainder
writePos = 0;
while (readPos >= 0)
{
mirrorBuffer[writePos++] = writableMessageFragment[readPos--];
}
writableMessageFragment.Text = new string(mirrorBuffer);
}
}
}