Разделять логику игры и её текст - это всегда хорошее архитектурное решение. Даже если вы не планируете переводить игру на другие языки или работать в команде, вы сможете работать над литературной составляющей отдельно от хитрого программного кода.

В Salet встроена простая система переводов текста игр. В игре-примере она не используется для простоты кода, но вы можете встретить её в других проектах. Вы можете использовать любую другую систему, но дальше я опишу именно стандартную.

Для подключения напишите примерно такой код в начале игры:

i18n.push("ru", require('../../game/language/ru.coffee'))
i18n.push("en", require('../../game/language/en.coffee'))

и начать шаблон HTML с тега, который укажет язык перевода:

<html lang="en">

В этом примере используются два языка: русский и английский. Файлы перевода находятся в каталоге game/translations и называются ru.coffee и en.coffee. Английский перевод при этом соединяется со стандартным набором строк, включённым в Salet.

Каждый файл перевода - это обычный массив CoffeeScript со строками. Он выглядит примерно так:

module.exports = {
  no_local_storage: "Локальное хранилище недоступно."
  erase_message: "Это навсегда удалит вашего персонажа и немедленно вернёт вас на старт игры. Вы уверены?"
  start_game: "Начать игру"
  begin: (salet) -> """
  """
}

Каждый элемент этого массива имеет своё уникальное название. Элемент может быть обычной строкой (которая обрамляется одинарными или двойными кавычками), многострочной строкой (обрамляется тремя двойными кавычками подряд) или функцией, которая возвращает строку.

В самой игре это используется при помощи функции .l(): "название строки".l(параметр функции перевода). Это выглядит так:

room 'start',
  dsc: """
<center class="transient">[#{ "start_game".l() }](start1)</center>
  """

room 'start1',
  dsc: () -> 
    "begin".l(salet)

В этом примере описание комнаты start собирается из двух переводных строк. Строка с названием "start_game" - это обычная строка, и она вызывается как "start_game".l(); строка "begin" - это функция, которой передаётся системный объект salet, поэтому она вызывается как "begin".l(salet).

Файлы перевода - это отдельные модули, поэтому они не "видят" код игры и все функции в нём. Вы можете объявлять дополнительные функции в самих файлах перевода, но если они не зависят от языка перевода, то лучше делать это в основном коде.

Если Salet не нашёл строку с указанным названием в указанном файле перевода, то он возвращает её название.

Дополнительная возможность: вы можете менять атрибут lang тега html в самой игре. Таким образом, возможен перевод "на лету."

  • ru/guide/i18n.txt
  • Последние изменения: 2016/09/20 13:51
  • (внешнее изменение)