Псевдолокализация: проверка текста
Безопасная проверка длины строк, ограничения заполнителей C# и множественных форм.
Псевдолокализация меняет текст для проверки: добавляет заполнение, заменяет буквы или помечает строки, прошедшие перевод. Она помогает найти обрезанный текст и обход перевода. Это не настоящий перевод и не проверка шрифтов, арабской письменности или вёрстки RTL.
Начать с безопасной проверки длины
Добавьте полный PseudoTextQA.cs в проект C#. Вызывайте PseudoTextQA.Enable() из действия, доступного только при разработке, после создания интерфейса. Disable() возвращает обычный поиск сообщений; пример не сохраняет настройки проекта на диск.
using Reckfell;
public static class PseudoTextQA
{
public static void Enable()
{
const string prefix = "internationalization/pseudolocalization/";
ProjectSettings.SetSetting(prefix + "replace_with_accents", false);
ProjectSettings.SetSetting(prefix + "double_vowels", false);
ProjectSettings.SetSetting(prefix + "fake_bidi", false);
ProjectSettings.SetSetting(prefix + "override", false);
ProjectSettings.SetSetting(prefix + "skip_placeholders", true);
ProjectSettings.SetSetting(prefix + "expansion_ratio", 0.5f);
ProjectSettings.SetSetting(prefix + "prefix", "[");
ProjectSettings.SetSetting(prefix + "suffix", "]");
TranslationServer.ReloadPseudolocalization();
TranslationServer.PseudolocalizationEnabled = true;
}
public static void Disable()
{
TranslationServer.PseudolocalizationEnabled = false;
}
}При английском переводе Ready вызов Translate в этом режиме возвращает [Ready]. Число символов заполнения с каждой стороны равно исходной длине, умноженной на expansion_ratio/2, с округлением вниз; обрамление добавляется отдельно. Результат не становится ровно на 50% длиннее для любой строки: короткий текст может не получить подчёркиваний. Для более жёсткой проверки увеличьте коэффициент.
Режим сохраняет составные строки форматирования, потому что добавляет текст по краям, не меняя содержимое сообщения. Disable() оставляет параметры преобразования в памяти, отключая их автоматическое применение. Enable() снова устанавливает указанные параметры.
Настройки и обновление во время игры
В Project Settings включите Advanced и откройте General → Internationalization → Pseudolocalization. Префикс настроек — internationalization/pseudolocalization/.
| Настройка | Действие |
|---|---|
| use_pseudolocalization | Включение при запуске; для работающей игры переключайте TranslationServer.PseudolocalizationEnabled |
| replace_with_accents | Заменяет поддерживаемые латинские символы вариантами с диакритикой |
| double_vowels | Удваивает поддерживаемые гласные, удлиняя слова |
| fake_bidi | Вставляет управляющие символы направления; это не полная симуляция RTL |
| override | Заменяет символы звёздочками, кроме распознанных заполнителей при включённом пропуске |
| expansion_ratio | Добавляет подчёркивания с двух сторон по исходной длине |
| prefix / suffix | Обрамляет преобразованный текст |
| skip_placeholders | Сохраняет ограниченный синтаксис заполнителей, описанный ниже |
После изменения значений ProjectSettings во время игры вызовите ReloadPseudolocalization. Метод перечитывает параметры преобразования и отправляет уведомление о смене перевода. Он не читает use_pseudolocalization для переключения активного состояния: задавайте PseudolocalizationEnabled отдельно. Изменения не становятся постоянной настройкой, пока ваш код явно их не сохранит.
Код, вычисляющий текст интерфейса, должен пересчитывать его по уведомлению. Если проверяете отдельный TranslationDomain, изменение его параметров само не уведомляет весь интерфейс: обновляйте потребителей этого домена самостоятельно.
Ограничение заполнителей: C# не защищён автоматически
В текущем движке skip_placeholders распознаёт простые двухсимвольные последовательности: %s, %c, %d, %o, %x, %X и %f. Это не полноценный парсер printf или формата C#.
- При включённом override строка Hi %s до обрамления превращается в ***%s: заполнитель сохраняется.
- Hi {0} превращается в ******: заполнитель C# уничтожается даже при включённом skip_placeholders.
- Формат с шириной поля, например %02d, тоже не защищён.
Для шаблонов string.Format используйте пример с заполнением по краям выше. Диакритику и замену звёздочками проверяйте отдельно на обычном тексте. Успешный пример с %s не доказывает сохранность любого форматирования.
Ограничение множественных форм
Translate применяет включённую псевдолокализацию, в том числе к отсутствующему ключу. TranslatePlural сейчас возвращает выбранную форму без этого автоматического преобразования. Поэтому неизменившийся счётчик сам по себе не доказывает обход локализации.
Для явной проверки сначала выберите форму, затем примените Pseudolocalize, потом подставьте число. Используйте безопасное заполнение по краям из примера выше:
string form = TranslationServer.TranslatePlural("ITEM", "ITEMS", count).ToString();
if (TranslationServer.PseudolocalizationEnabled)
form = TranslationServer.Pseudolocalize(form).ToString();
label.Text = string.Format(form, count);Разместите инструкции внутри метода, где count и label уже определены. Pseudolocalize выполняет явное преобразование даже при выключенном свойстве включения; условие предотвращает это в обычной игре. Отключайте автоматический перевод у Label, получающего уже вычисленный текст, как в полном примере счётчика.
Что смотреть при проверке
Проверьте узкие кнопки, переносы текста, подсказки, диалоги и фокус клавиатуры/контроллера при минимальном поддерживаемом размере окна. Расширенный текст и все элементы должны оставаться доступными. Проверьте и настоящий текст ru/en: псевдолокализованный английский не заменяет проверку перевода.
Неизменившийся текст может обходить Translate, иметь отключённый автоматический перевод или оставаться в кеше после включения теста. Помеченный текст тоже может быть непереведённым ключом: отсутствующие ключи преобразуются. Проверяйте каталог, а не количество скобок.
Для арабского и иврита проверяйте настоящий смешанный текст и конкретные элементы интерфейса. fake_bidi обрамляет строки управляющими символами, но не доказывает правильность формы символов, зеркального расположения элементов или порядка чтения. Латинские буквы с диакритикой также не проверяют покрытие шрифта для китайского, японского и корейского.
Перед выпуском отключите тест и сбросьте намеренно сохранённую настройку запуска. В движке проверены точные преобразования, округление, ограничения заполнителей и множественных форм, уведомления после перечитывания настроек и полный пример. Работа с предпросмотром редактора, обрезка текста на экране, шрифты, вёрстка RTL и экспортированные сборки этим запуском не проверялись.