Pull to refresh

Аспекты локализации. Основные ошибки разработчиков

Reading time5 min
Views3.3K
Как показала первая заметка, тема локализации игр волнует сердца многих. Бурные ностальгические воспоминания Хабровчан призвали к активной деятельности одного из переводчиков, можно сказать, легендарной игры «НеВерьВХудо», и, надеюсь, совместно мы сможем удовлетворить интерес читателей, и реализовать небольшой цикл статей.
Как мне кажется, будет неплохо разбить материал на два типа:
  • Записки локализатора.
    Всякие наиболее яркие истории из жизни локализаторов. (Надеюсь к этой теме подтянутся и другие люди, кто работает или работал в этой области).
  • Аспекты локализации.
    Технические детали связанные с локализацией игр и не только.

Итак, снова подниму вопрос, почему же творения «пиратской локализации» зачастую такие страшные на вид и что же мешало сделать все по-человечески.

О сколько нам открытий чудных приносит разработчик-друг...

Почти самая основная часть локализации это все что связано с текстом и его отображением на экране. И вроде бы казалось, что тут сложного? Вытащил текст, перевел, вставил назад и ура — игра готова. Но на этом этапе, оказывается, могут подстерегать множество сюрпризов.

Зарубежные игры, особенно старые, под DOS, в подавляющем большинстве были написаны исключительно для одного языка – английского. Разработчики не заморачивались над продумыванием системы обработки и вывода текста. Строки во многих случаях используют однобайтовую кодировку:
char* textString=”Some text”
Ну и что тут такого? Все хорошо, но вот только значение char лежит в диапазоне от -128 до 127. Т.к. русские буквы в кодировке cp1251 имеют коды 0xC0..0xFF, они будут рассматриваться программой как отрицательные числа. Часто разработчики на входящие строки ставят фильтр который пропускает диапазон букв и символов только английского языка (0x20..0x7f), и понятное дело что русские буквы будут просто пропущены. Чтобы побороть эту проблему приходится выискивать в exe'шнике все места где обрабатываются строки и переписывать знаковые операции на без знаковые (обычно замена MOVSX на MOVZX), изменять диапазоны фильтров и прочее. Но это занимает кучу времени и не всегда удается в полной мере.
Кроме этих проблем возникают еще и другие, связанные с различием обработки букв в разных языках. Например встречаются игры, где разработчики посчитали что меню где все пункты написаны большими буквами смотрится красивее. Отлично, но они принудительно переводят текст в верхний регистр используя свою функцию, что не всегда корректно работает с русским языком. И в результате, например, вместо слова «ЗАГРУЗКА» на экране отображается что-нибудь типа «ЗАцРфЗКА» или еще какие-нибудь сюрпризы.

Вспомним Чернышевского и зададимся тем же вопросом «Что делать?».
Лучше всего использовать Unicode. Но если уж использовать — то правильно и в полной мере.
Часто доводилось встречать игры в которых ресурсы хранятся в двухбайтовой кодировке UTF-16, но на этом счастье и заканчивается. Потому что разработчики поленились переписывать код и использовали старые наработки где обрабатываются однобайтовые строки. Как это выглядит? В худшем случае входная Unicode строка проходит гениальную функцию разработчика где от двухбайтового кода берется первый байт и заносится в новую строку. Это, в принципе, работает для английского и европейского языков (0x0020..0x00FF), но вот русские буквы уже не пройдут (0x410..0x44F). Чтобы не сильно мучиться, можно перекодировать русский текст из cp1251 в двухбайтный. Что в принципе решает эту проблему, но иногда дает другую. Например игра использует системные TTF фонты, и на экране вместо русского мы увидит набор европейских символов (что-то типа Âäçèáâ). Но об этом позднее. Как лечить? Переписать функцию и использовать нормальные системные преобразования WideCharToMultiByte и MultiByteToWideChar с указанием правильных таблиц символов. Все это касается как UTF-16 так и UTF-8.

Вообще правильное использование системных функций должно войти в привычку для разработчика который хочет продвигать свой продукт на другие языковые регионы. Сколько же проблем создает недальновидная разработка. К примеру в самом начале встречались игры которые просто не хотели запускаться на русской системе Windows. Например один из глюков — разработчики выбирали из списка DirectX видеоадаптер по его английскому названию, тогда как в русском Windows оно выдается по-русски. В принципе метод вообще неправильный, но применялся. Некоторые ошибки не хотят понять и по сей день. Сколько уже было у вас проблем когда в русской версии Windows игра не хочет сохраняться? Проблема очень простая, но проявляется и в официальных локализациях, и в пиратских. Дело в том, что игра пытается сохранить файлы в папку «Мои Документы». Но по причине неправильного преобразования кодировок, русское название папки «Мои Документы» превращается в набор символов которые нельзя использовать как имя файла и система возвращает игре ошибку. Несколько раз встречал «хитрое» решение проблемы — вместо папки «Мои Документы» использовали папку «Application Data» которая во всех версиях Windows на английском языке. Но и тут случаются проблемы, если пользователь использовал в своем логине русские буквы, то получим что-то вроде «Documents and Settings\Пользователь\Application Data» что снова приводит к ошибке. Если вы игрок и столкнулись с таким, остается только одно — переименовать папку «Мои Документы» во что-то английское и использовать логин только на английском языке. Если же хотите исправить ошибку, нужно найти место обработки сохранений и пропатчить путь принудительно. Например, "%s\GameName\SaveData" где параметр %s скорее всего будет заменен на путь к «Мои Документы», можно прописать как «C:\GameName\SaveData». Игра не обидится, и будет сохраняться. (Правда это может повлечь нарушение прав доступа если игрок не имеет прав администратора).

Еще один сюрприз может подстерегать, если разработчик решил что использование имен файлов вместо локализированных строк это хорошая идея. Тут очень важно правильно обрабатывать таблицы кодировок, иначе можно получить эффект, что вроде имя файла на русском, а в игре показывается непонятно что. Или сохраняешь файл из игры, с нормальным русским названием, а на диске появляется нечто — что потом даже удалить нельзя. Или вообще не сохраняется. Самый простой пример — сохранение профиля Player. Очень часто его так и оставляют на английском языке и отнюдь не от хорошей жизни. Честно говоря к не английским именам файлов у меня особое отношение еще со времен когда Norton Disk Doctor успешно «лечил» такие файлы. Программа ушла, но привычка осталась — я до сих пор стараюсь не использовать русские буквы в именах файлов.

Также одна из интересных проблем которая не решена во многих играх и по сей день. Клавиатурный ввод. В русском Windows стандартным является то, что русская раскладка стоит основной. И после запуска игры часто бывает что персонаж не хочет двигаться. Если почитать readme, то можно найти скромное упоминание о том, что «рекомендуется выбрать Английскую раскладку как раскладку по умолчанию». Я уже не говорю о том что бывает трудно что-либо напечатать по-русски, например в игровом чате. Но в последнее время, к счастью, это уже редкость.

И напоследок в этом разделе, вспомню такую ситуацию. Вы купили официальную локализацию игры, радостно пришли домой, установили, запустили — а там все на английском. Вот досада :( Все дело в гениальной задумке некоторых разработчиков. По их мнению, язык в игре должен быть тем же, что указан в региональных настройках. Но вот досада, что если у меня стоит Английский Windows и региональные настройки не «Россия» а играть на русском хочется? Хорошо если есть выбор языка внутри игры, но бывает что нет. Реализация такого алгоритма основана на функции GetSystemDefaultLangID которая и возвращает текущий код языка в системе. Далее следует проверка по таблице доступных в игре языков, и если вашего языка нет, то выбирается Английский. Лечить можно переустановкой региональных настроек, как советуется иногда в readme (и это лишь для того чтобы запустить игру!) Если же вам не хочется менять свою систему под прихоти игры, можно найти вызов этой функции и подменить результат на нужный вам.

На сегодня хватит. В следующей серии читайте вольное повествование о увлекательном процессе озвучки игр, и также история о том, так ли пиратская локализация отличается от официальной?
Tags:
Hubs:
Total votes 61: ↑57 and ↓4+53
Comments23

Articles