08 ноября 2010

Локализация (часть 2)

Всем привет! Давно не появлялся тут, отдыхал вроде как... А сейчас вот решил написать еще немного про локализацию проекта "Тайны притяжения". Как-то раз я уже говорил, какие могут быть трудности при смене языка интерфейса, какие вообще изменения придется вносить в программу. А сейчас, когда игру уже пришлось локализовать на английский, немецкий и польский языки, проблема переброса программы на рельсы другого языка стала более ясной, как бы имеется опыт.

Итак, в чем вообще может быть проблемы? Сначала о "Текстах/диалогах", о которых я писал в первой части. Во-первых, текст, который нужно вывести на экране, на разных языках имеет разные размеры (количество слов и символов просто разное). На русском: "ты где?", на английском "where are you?"... если же такой текст выводится на подложке - то нужно думать, как изменять размеры подложек программно или заготавливать разные для разных языков. Но у нас все проще, каждый элемент с текстом - это всего лишь картинка. Поэтому перевод игры заключается в копировании текста на новом языке взамен старого, сохранении в png-изображении и подсовывании игре. Но тут снова возникает проблема с размерами текста, точнее - с его позицией. Вот есть у нас такая ситуация:
После перевода на другой язык, баллон с текстом может "поехать", так как текста больше/меньше и он будет занимать другое положение. Поэтому пришлось под каждый язык править скрипты, изменяя значения положений баллонов с текстами на экране. Благо, это дело безболезненное и довольно быстрое.
В "Меню" пока править никаких числовых значений не приходилось - новые картинки довольно хорошо вписываются.
А вот с "Вводом текста с клавиатуры" были проблемы. И довольно затяжные.
Начну с того, что я использую картинку со шрифтом + файл текстурных координат каждой буквы для Ascii символов. Итак, английский + русский языки в таком варианте вводятся правильно, без ошибок. При изменении дополнительного языка (русского) на немецкий возникли проблемы, о которых я спрашивал на форуме. Если кратко: печатаю ü, а выводится u. "Безобразие" - подумал я! Замечательно, что Fantom, подсказал почитать здесь про различные кодировки. Читаю - вроде делаю все также, через ToAscii, все вроде правильно, но не получается, хоть тресни! А потом я читаю внимательнее фразу:
"Есть та же ToAsciiEx и ToUnicodeEx, которые используют в качестве дополнительного параметра текущие локали, но мы их рассматривать не будем, будем так сказать зреть в корень". И тут я понял - "значит нужно точно попробовать использовать ToAsciiEx"... Попробовал, получилось, обрадовался, внедрил и теперь все работает! Так кратенько можно описать следующие мои действия... Код выглядит просто:

Function GetCharFromVirtualKey(Key: Word): string;
var
   keyboardState: TKeyboardState;
   layout, asciiResult: Integer; 
begin
layout := GetKeyboardLayout(0);

GetKeyboardState(keyboardState);
SetLength(Result, 2);
asciiResult := ToAsciiEx(key, MapVirtualKey(key, 0), keyboardState, @Result[1], 0, layout); 

  case asciiResult of
    0: Result := '';
    1: SetLength(Result, 1);
    2:;
    else
      Result := '';
  end;
end;

где  key - это значение из буфера клавиатуры, доставаемый так:

GetKeyboardState(keyboardState);
  for i := 0 to 255 do
    if keyboardState[i] and $80 <> 0 then
      ResultChar := GetCharFromVirtualKey(i);

И все заработало!
Потом, правда, была новая история с польским языком. Сгенерил картинку-шрифта, подсовываю - а в игре полная ерунда. Долго мучился и думал, что же не так?! Решил для проверки заново сгенерить картинку-шрифта для немецкого языка и расстроился - опять проблемы! Полный шок - только недавно (месяц назад) я генерил этой же самой тулзой картинку для немецкого языка, и все работало, а сейчас одни артефакты на экране, вот такая мистика! Начал дебажить, нашел, что при сохранении шрифт почему-то считается моноширинным, из-за этого текстурные координаты неверны, текст плывет. Пошаманил, зачем-то вызвал ReLoadWindowsFont() перед сохранением и все встало на свои места! Картинка сохранилась верно, текстурные координаты - тоже. И снова проблемы - польский язык не хотел работать, на экране появлялись не те символы, что должны быть. В итоге начал рыться в значениях, выдаваемых GetKeyboardLayout(), которые были отрицательными (что странно для меня и сейчас). Но это не помогло. А помог случай - попробовал поменять в тулзе настройку Font'а с
Font.Charset := BALTIC_CHARSET;
на
Font.Charset := EASTEUROPE_CHARSET;
и теперь уж все получилось окончательно! Оказывается, плохие знания географии сыграли отрицательную роль при локализации. Символы расположены на разных местах и при печатании определялось правильное значение из таблицы Ascii, но символ в картинке-шрифте был другой, что и ввело меня в ступор.
Наверно, я все это описал слишком запутанно...
но в итоге суть такова:
  1. художник меняет все баллоны с текстом, надписи в меню и т.д... я просто подсовываю все это в пак-файл игры и по необходимости правлю скрипты, располагая картинки более красивым образом.
  2. для генерации шрифта для написания имени профиля, а также названий уровней в карте, использую самописную тулзу, которая создает два файла: картинку-шрифт и файл с текстурными координатами символов на этой картинке.
  3. код, описанный выше, выдает символ из Ascii таблицы, который нажал пользователь - после этого остается только вывести этот символ штатным методом. 
В итоге я сумел набрать вот такой себе ник:
Можно сказать освоил польскую клавиатуру за пару дней.
Все, устал описывать все эти моменты ;) Пойду лучше попрограммирую для отдыха, чего и вам всем желаю!

Сообщения, схожие по тематике:

0 коммент.:

Отправить комментарий