瀏覽代碼

Merge pull request #256 from Niko-McLys/master

Updated and added russian translate
vlaaad 3 年之前
父節點
當前提交
c31eb4b5df
共有 64 個文件被更改,包括 2709 次插入64 次删除
  1. 62 0
      docs/ru/manuals/ads.md
  2. 154 0
      docs/ru/manuals/android.md
  3. 82 64
      docs/ru/manuals/bob.md
  4. 51 0
      docs/ru/manuals/caching-assets.md
  5. 11 0
      docs/ru/manuals/debugging.md
  6. 24 0
      docs/ru/manuals/design.md
  7. 114 0
      docs/ru/manuals/editor-keyboard-shortcuts.md
  8. 49 0
      docs/ru/manuals/editor-preferences.md
  9. 201 0
      docs/ru/manuals/editor-scripts.md
  10. 129 0
      docs/ru/manuals/editor-styling.md
  11. 46 0
      docs/ru/manuals/editor-templates.md
  12. 124 0
      docs/ru/manuals/extensions-best-practices.md
  13. 155 0
      docs/ru/manuals/extensions-build-variants.md
  14. 48 0
      docs/ru/manuals/extensions-defold-sdk.md
  15. 57 0
      docs/ru/manuals/extensions-details.md
  16. 270 0
      docs/ru/manuals/extensions-manifest-merge-tool.md
  17. 54 0
      docs/ru/manuals/extensions-script-api.md
  18. 284 0
      docs/ru/manuals/extensions.md
  19. 99 0
      docs/ru/manuals/getting-help.md
  20. 44 0
      docs/ru/manuals/iac.md
  21. 二進制
      docs/ru/manuals/images/editor/custom_project_templates.png
  22. 二進制
      docs/ru/manuals/images/editor/editor-styling-color.png
  23. 二進制
      docs/ru/manuals/images/editor/editor-styling-fonts.png
  24. 二進制
      docs/ru/manuals/images/editor/preferences_code.png
  25. 二進制
      docs/ru/manuals/images/editor/preferences_extensions.png
  26. 二進制
      docs/ru/manuals/images/editor/preferences_general.png
  27. 二進制
      docs/ru/manuals/images/graphics/component-hierarchy.png
  28. 二進制
      docs/ru/manuals/images/input/actions.png
  29. 二進制
      docs/ru/manuals/images/input/[email protected]
  30. 二進制
      docs/ru/manuals/images/input/consuming.png
  31. 二進制
      docs/ru/manuals/images/input/[email protected]
  32. 二進制
      docs/ru/manuals/images/input/game.png
  33. 二進制
      docs/ru/manuals/images/input/[email protected]
  34. 二進制
      docs/ru/manuals/images/input/game_paused.png
  35. 二進制
      docs/ru/manuals/images/input/[email protected]
  36. 二進制
      docs/ru/manuals/images/input/gamepad_bindings.png
  37. 二進制
      docs/ru/manuals/images/input/gamepad_setting.png
  38. 二進制
      docs/ru/manuals/images/input/[email protected]
  39. 二進制
      docs/ru/manuals/images/input/gamepads.png
  40. 二進制
      docs/ru/manuals/images/input/[email protected]
  41. 二進制
      docs/ru/manuals/images/input/input_binding.png
  42. 二進制
      docs/ru/manuals/images/input/[email protected]
  43. 二進制
      docs/ru/manuals/images/input/input_key_bindings.png
  44. 二進制
      docs/ru/manuals/images/input/input_stack.png
  45. 二進制
      docs/ru/manuals/images/input/[email protected]
  46. 二進制
      docs/ru/manuals/images/input/key_bindings.png
  47. 二進制
      docs/ru/manuals/images/input/marked_text.png
  48. 二進制
      docs/ru/manuals/images/input/[email protected]
  49. 二進制
      docs/ru/manuals/images/input/mouse_bindings.png
  50. 二進制
      docs/ru/manuals/images/input/overview.png
  51. 二進制
      docs/ru/manuals/images/input/[email protected]
  52. 二進制
      docs/ru/manuals/images/input/proxy.png
  53. 二進制
      docs/ru/manuals/images/input/[email protected]
  54. 二進制
      docs/ru/manuals/images/input/setting.png
  55. 二進制
      docs/ru/manuals/images/input/[email protected]
  56. 二進制
      docs/ru/manuals/images/input/text_bindings.png
  57. 二進制
      docs/ru/manuals/images/input/touch_bindings.png
  58. 二進制
      docs/ru/manuals/images/nintendo-switch/register-defold.png
  59. 二進制
      docs/ru/manuals/images/nintendo-switch/register-nintendo.png
  60. 213 0
      docs/ru/manuals/input-gamepads.md
  61. 53 0
      docs/ru/manuals/input-key-and-text.md
  62. 121 0
      docs/ru/manuals/input-mouse-and-touch.md
  63. 222 0
      docs/ru/manuals/input.md
  64. 42 0
      docs/ru/manuals/nintendo-switch.md

+ 62 - 0
docs/ru/manuals/ads.md

@@ -0,0 +1,62 @@
+---
+title: Реклама в Defold
+brief: Показ различных видов рекламы - распространенный способ монетизации мобильных и веб игр. В этом руководстве показано несколько способов монетизации игры с помощью рекламы.
+---
+
+# Реклама
+
+Реклама стала очень распространенным способом монетизации веб-игр и мобильных игр и превратилась в миллиардную индустрию. Как разработчик вы получаете деньги в зависимости от количества людей, просматривающих рекламу, которую вы показываете в своей игре. Обычно все просто: больше зрителей - больше денег, но на то, сколько вам заплатят, влияют и другие факторы:
+
+* Качество рекламы - релевантные объявления с большей вероятностью привлекут внимание игроков.
+* Формат объявления - баннерная реклама обычно оплачивается меньше, а полноэкранная реклама, просмотренная от начала до конца, оплачивается больше.
+* Рекламная сеть - сумма, которую вам заплатят, варьируется от рекламной сети к рекламной сети.
+
+::: sidenote
+CPM = стоимость за тысячу. Сумма, которую рекламодатель платит за одну тысячу просмотров. CPM варьируется между рекламными сетями и форматами объявлений.
+:::
+
+## Виды рекламы
+
+Существует множество различных видов рекламы, которые можно использовать в играх. Некоторые из наиболее распространенных - баннерная реклама, интерстициальная реклама и реклама с вознаграждением:
+
+### Межстраничная реклама
+
+Межстраничная реклама основана на тексте, изображении или видео и занимает относительно небольшую часть экрана, обычно в верхней или нижней его части. Баннерную рекламу очень легко реализовать, и она очень хорошо подходит для казуальных одноэкранных игр, где легко зарезервировать область экрана для рекламы. Баннерная реклама максимально увеличивает экспозицию, пока пользователи играют в вашу игру без перерыва.
+
+### Интерстициальная реклама
+
+Интерстициальная реклама - это большие полноэкранные объявления с анимацией, а иногда и интерактивным медиаконтентом. Интерстициальная реклама обычно показывается между уровнями или игровыми сессиями, поскольку это естественный перерыв в игровом процессе. Интерстициальная реклама обычно генерирует меньше просмотров, чем баннерная реклама, но ее стоимость (CPM) намного выше, чем у баннерной рекламы, что приводит к значительному общему доходу от рекламы.
+
+### Вознаграждаемая реклама
+
+Вознаграждаемая реклама (также известная как стимулирующая реклама) является необязательной и поэтому менее навязчивой, чем многие другие виды рекламы. Вознаграждаемая реклама, как правило, представляет собой полноэкранную рекламу, подобную интерстициальной рекламе. Пользователь может выбрать вознаграждение в обмен на просмотр рекламы - например, добычу, монеты, жизни, время или другую внутриигровую валюту или выгоду. Реклама с вознаграждением обычно имеет самую высокую стоимость (CPM), но количество просмотров напрямую зависит от количества пользователей. Вознаграждаемые объявления будут иметь высокую эффективность только в том случае, если вознаграждение достаточно ценно и предлагается в нужное время.
+
+
+## Рекламные сети
+
+Портал [Defold Asset Portal](/tags/stars/ads/) содержит несколько активов, которые интегрируются с поставщиками рекламы:
+
+* [AdMob](https://defold.com/assets/admob-defold/) - Показ рекламы с помощью сети Google AdMob.
+* [Enhance](https://defold.com/assets/enhance/) - Поддерживает несколько различных рекламных сетей. Требуется дополнительный шаг после сборки.
+* [Facebook Instant Games](https://defold.com/assets/facebookinstantgames/) - Показывать рекламу в вашей игре Facebook Instant Game.
+* [IronSource](https://defold.com/assets/ironsource/) - Показывать рекламу, используя рекламную сеть IronSource.
+* [Unity Ads](https://defold.com/assets/defvideoads/) - показ рекламы с помощью сети Unity Ads.
+
+
+# Как интегрировать рекламу в вашу игру
+
+Когда вы выбрали рекламную сеть для интеграции в свою игру, вам необходимо следовать инструкциям по установке и использованию данного ассета. Как правило, сначала нужно добавить расширение: [project dependency](/manuals/libraries/#setting-up-library-dependencies). После добавления ассета в ваш проект вы можете приступить к интеграции и вызвать функции, специфичные для актива, для загрузки и показа рекламы.
+
+
+# Комбинирование рекламы и покупок в приложении
+
+В мобильных играх довольно часто предлагается [In-app purchase](/manuals/iap), чтобы избавиться от рекламы навсегда.
+
+
+## Подробнее для изучения
+
+Существует множество онлайн-ресурсов, на которых можно найти информацию об оптимизации доходов от рекламы:
+
+* Google AdMob [Монетизация мобильных игр с помощью рекламы](https://admob.google.com/home/resources/monetize-mobile-game-with-ads/)
+* Game Analytics [Популярные форматы рекламы и как их использовать](https://gameanalytics.com/blog/popular-mobile-game-ad-formats.html)
+* deltaDNA [Размещение рекламы в играх: 10 советов экспертов](https://deltadna.com/blog/ad-serving-in-games-10-tips/)

+ 154 - 0
docs/ru/manuals/android.md

@@ -0,0 +1,154 @@
+---
+title: Разработка на Defold для платформы Android
+brief: Это руководство описывает, как создавать и запускать приложения Defold на устройствах Android
+---
+
+# Разработка для Android
+
+Устройства Android позволяют свободно запускать на них собственные приложения. Очень легко создать версию вашей игры и скопировать ее на устройство Android. В этом руководстве описаны шаги, связанные с созданием вашей игры для Android. В процессе разработки  рекомендуется запускать игру через [development app](/manuals/dev-app), так как оно позволяет осуществлять горячую перезагрузку контента и кода по беспроводной связи прямо на устройство.
+
+## Android и процесс подписания Google Play
+
+Android требует, чтобы все APK были подписаны цифровым сертификатом перед установкой на устройство или обновлением. Если вы используете Android App Bundles, вам нужно подписать только ваш пакет приложений перед загрузкой в Play Console, а [Play App Signing](https://developer.android.com/studio/publish/app-signing#app-signing-google-play) позаботится обо всем остальном. Однако вы также можете вручную подписать свое приложение для загрузки в Google Play, других магазинов приложений и для распространения вне магазинов.
+
+При создании пакета Android-приложений в редакторе Defold или с помощью [development app](/manuals/dev-app), вы можете указать файл keystore (содержащий ваш сертификат и ключ) и пароль keystore, который будет использоваться при подписании вашего приложения. Если вы этого не сделаете, Defold создаст отладочное keystore и будет использовать его при подписании пакета приложений.
+
+::: important
+Вы **никогда** не загружайте свое приложение в Google Play, если оно было подписано с использованием отладочного хранилища ключей. Всегда используйте специальное хранилище ключей, которое вы создали сами.
+:::
+
+## Создание хранилища ключей
+
+::: sidenote
+Процесс подписи Android в Defold изменился в версии 1.2.173 с использования отдельного ключа и сертификата на keystore. [Дополнительная информация в сообщении форума](https://forum.defold.com/t/upcoming-change-to-the-android-build-pipeline/66084).
+:::
+
+Вы можете создать хранилище ключей с помощью [Android Studio](https://developer.android.com/studio/publish/app-signing#generate-key) или из терминала/командной строки:
+
+```bash
+keytool -genkey -v -noprompt -dname "CN=John Smith, OU=Area 51, O=US Air Force, L=Unknown, ST=Nevada, C=US" -keystore mykeystore.keystore -storepass 5Up3r_53cR3t -alias myAlias -keyalg RSA -validity 9125
+```
+
+В результате будет создан файл keystore с именем `mykeystore.keystore`, содержащий ключ и сертификат. Доступ к ключу и сертификату будет защищен паролем `5Up3r_53cR3t`. Ключ и сертификат будут действительны в течение 25 лет (9125 дней). Сгенерированные ключ и сертификат будут идентифицированы псевдонимом `myAlias`.
+
+::: important
+Обязательно храните хранилище ключей и связанный с ним пароль в безопасном месте. Если вы подписываете и загружаете свои приложения в Google Play самостоятельно, а keystore или пароль keystore утерян, вы не сможете обновить приложение в Google Play. Вы можете избежать этого, используя Google Play App Signing и позволяя Google подписывать ваши приложения за вас.
+:::
+
+
+## Создание пакета приложений для Android
+
+Редактор позволяет легко создать отдельный пакет приложений для вашей игры. Перед созданием пакета вы можете указать, какую иконку (иконки) использовать для приложения, установить код версии и т.д. в "game.project" [файл настроек проекта](/manuals/project-settings/#android).
+
+Для создания пакета выберите в меню <kbd>Project ▸ Bundle... ▸ Android Application...</kbd>.
+
+Если вы хотите, чтобы редактор автоматически создавал случайные отладочные сертификаты, оставьте поля *Keystore* и *Keystore password* пустыми:
+
+![Подписание пакета Android](images/android/sign_bundle.png)
+
+Если вы хотите подписать свой пакет определенным хранилищем ключей, укажите *Keystore* и *Keystore password*. Ожидается, что *Keystore* будет иметь расширение файла `.keystore`, а пароль будет храниться в текстовом файле с расширением `.txt`:
+
+![Подписание пакета Android](images/android/sign_bundle2.png)
+
+Defold поддерживает создание файлов APK и AAB. Выберите APK или AAB из выпадающего списка Bundle Format.
+
+Нажмите <kbd>Create Bundle</kbd>, когда вы настроите параметры пакета приложений. Затем вам будет предложено указать, где на вашем компьютере будет создан пакет.
+
+![Файл пакета приложения Android](images/android/apk_file.png)
+
+### Установка пакета приложений для Android
+
+### Установка APK
+
+Файл *.apk* можно скопировать на устройство с помощью инструмента `adb` (см. ниже) или в Google Play через [консоль разработчика Google Play](https://play.google.com/apps/publish/).
+
+```
+$ adb install Defold\ examples.apk
+4826 КБ/с (18774344 байта за 3,798 с)
+  pkg: /data/local/tmp/my_app.apk
+Успех
+```
+
+#### Установка AAB
+
+Файл *.aab* можно загрузить в Google Play через [консоль разработчика Google Play](https://play.google.com/apps/publish/). Также можно сгенерировать *.apk* файл из *.aab* файла для локальной установки с помощью [Android bundletool](https://developer.android.com/studio/command-line/bundletool).
+
+## Разрешения
+
+Движок Defold требует ряд различных разрешений для работы всех функций движка. Разрешения определяются в `AndroidManifest.xml`, указанном в "game.project" [файл настроек проекта](/manuals/project-settings/#android). Подробнее о разрешениях Android можно прочитать в [официальных документах](https://developer.android.com/guide/topics/permissions/overview). В манифесте по умолчанию запрашиваются следующие разрешения:
+
+### android.permission.INTERNET и android.permission.ACCESS_NETWORK_STATE (Уровень защиты: нормальный)
+Позволяет приложениям открывать сетевые сокеты и получать доступ к информации о сетях. Эти разрешения необходимы для доступа в Интернет. ([Android official docs](https://developer.android.com/reference/android/Manifest.permission#INTERNET)) и ([Android official docs](https://developer.android.com/reference/android/Manifest.permission#ACCESS_NETWORK_STATE)).
+
+### android.permission.WRITE_EXTERNAL_STORAGE (Уровень защиты: опасный)
+Позволяет приложению записывать данные во внешнее хранилище. Начиная с уровня API 19, это разрешение не требуется для чтения/записи файлов в специфических для вашего приложения каталогах, возвращаемых Context.getExternalFilesDir(String) и Context.getExternalCacheDir(). Это разрешение необходимо, если вы собираетесь сохранять/загружать файлы с диска (используя io.* или sys.save/load) за пределами папки, указанной [sys.get_save_file()](/ref/sys/#sys.get_save_file:application_id-file_name) и имеете `android:minSdkVersion`, установленный уровень менее 19 в манифесте Android. ([Официальные документы Android](https://developer.android.com/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE)).
+
+### android.permission.WAKE_LOCK (Уровень защиты: нормальный)
+Позволяет использовать блокировку PowerManager WakeLocks для предотвращения засыпания процессора или затемнения экрана. Это разрешение необходимо для временного предотвращения засыпания устройства при получении push-уведомления. ([Официальные документы Android](https://developer.android.com/reference/android/Manifest.permission#WAKE_LOCK))
+
+## Android Debug Bridge
+
+Инструмент командной строки `adb` - это простая в использовании и универсальная программа, которая используется для взаимодействия с устройствами Android. Вы можете загрузить и установить `adb` как часть Android SDK Platform-Tools, для Mac, Linux или Windows.
+
+Загрузите Android SDK Platform-Tools с сайта: https://developer.android.com/studio/releases/platform-tools. Вы найдете инструмент *adb* в */platform-tools/*. Также, пакеты для конкретной платформы можно установить через соответствующие менеджеры пакетов.
+
+Ubuntu Linux:
+
+```
+$ sudo apt-get install android-tools-adb
+```
+
+Fedora 18/19:
+
+```
+$ sudo yum install android-tools
+```
+
+macOS (Homebrew)
+
+```
+$ brew cask install android-platform-tools
+```
+
+Вы можете убедиться, что `adb` работает, подключив устройство Android к компьютеру через USB и выполнив следующую команду:
+
+```
+$ adb devices
+List of devices attached
+31002535c90ef000    device
+```
+
+Если устройство не отображается, убедитесь, что на устройстве Android включена *USB-отладка*. Откройте *Настройки* устройства и найдите *Опции разработчика* (или *Разработка*).
+
+![Включите отладку USB](images/android/usb_debugging.png)
+
+## Отладка пакета приложений
+
+Пакет, собранный в режиме отладки (т.е. "Debug" выбран в качестве варианта при сборке), будет отправлять весь свой консольный вывод в системный журнал Android. Получите доступ к журналу с помощью инструмента `adb` и дайте команду `logcat`. Возможно, вы захотите отфильтровать вывод по тегу (`-s [tagname]`):
+
+```
+$ adb logcat -s "defold"
+--------- beginning of /dev/log/system
+--------- beginning of /dev/log/main
+I/defold  ( 6210): INFO:DLIB: SSDP started (ssdp://192.168.0.97:58089, http://0.0.0.0:38637)
+I/defold  ( 6210): INFO:ENGINE: Defold Engine 1.2.50 (8d1b912)
+I/defold  ( 6210): INFO:ENGINE: Loading data from:
+I/defold  ( 6210): INFO:ENGINE: Initialised sound device 'default'
+I/defold  ( 6210):
+D/defold  ( 6210): DEBUG:SCRIPT: Hello there, log!
+...
+```
+
+
+## Использование AndroidX
+AndroidX - это значительное улучшение оригинальной библиотеки поддержки Android, которая больше не поддерживается. Пакеты AndroidX полностью заменяют библиотеку поддержки, предоставляя паритет возможностей и новые библиотеки. Большинство расширений Android на [портале ассетов](/assets) поддерживают AndroidX. Если вы не хотите использовать AndroidX, вы можете отключить его в пользу старой библиотеки поддержки Android:
+
+1. Если у вас уже есть манифест приложения, добавьте `jetifier: false` в `armv7-android` и `arm64-android`.
+
+2. Если у вас нет файла манифеста приложения, перейдите по ссылке [Defold App Manifest generator](https://britzl.github.io/manifestation/) и установите флажок "Use Android Support lib".
+
+![](images/android/enable_supportlibrary.png)
+
+
+## FAQ
+:[Android FAQ](../shared/android-faq.md)

+ 82 - 64
docs/ru/manuals/bob.md

@@ -18,70 +18,88 @@ Bob запускается из оболочки или из командной
 ```text
 $ java -jar bob.jar --help
 usage: bob [options] [commands]
-  -a,--archive                       Build archive
- -ar,--architectures <arg>           comma separated list of architectures
-                                     to include for the platform, for example
-                                     "arm64-android,armv7-android"
-  -u,--auth <arg>                    User auth token
-     --binary-output <arg>           Location where built engine binary
-                                     will be placed. Default is
-                                     "<build-output>/<platform>/"
- -br,--build-report <arg>            Filepath where to save a build report
-                                     as JSON
- -brhtml,--build-report-html <arg>   Filepath where to save a build report
-                                     as HTML
-     --build-server <arg>            The build server (when using native
-                                     extensions)
- -bo,--bundle-output <arg>           Bundle output directory
-     --bundle-format <apk|aab>       Which format to generate Android bundle in
-  -d,--debug                         Use debug version of dmengine (when
-                                     bundling). Deprecated, use --variant
-                                     instead
-     --debug-ne-upload               Outputs the files sent to build server as
-                                     upload.zip
-     --defoldsdk <arg>               What version of the defold sdk (sha1)
-                                     to use
-     --exclude-build-folder          Comma separated list of folders to exclude
-                                     from the build
-  -e,--email <arg>                   User email
-  -h,--help                          This help message
-  -i,--input <arg>                   Source directory. Default is current
-                                     directory
-     --identity <arg>                Sign identity (iOS)
-  -k,--keep-unused                   Keep unused resources in archived
-                                     output
-     --keystore <arg>                Which keystore file to use when signing the
-                                     Android bundle.
-     --keystore-pass <arg>           Path to file with keystore password used to
-                                     when bundling for Android.
-     --keystore-alias <arg>          Name of alias from provided keystore to use
-                                     when bundling for Android.
-  -l,--liveupdate <arg>              yes if liveupdate content should be
-                                     published
- -mp,--mobileprovisioning <arg>      mobileprovisioning profile (iOS)
-  -o,--output <arg>                  Output directory. Default is
-                                     "build/default"
-  -p,--platform <arg>                Platform (when bundling)
-  -r,--root <arg>                    Build root directory. Default is
-                                     current directory
-     --settings <arg>                Path to a game project settings
-                                     file. more than one occurrance are
-                                     allowed. the settings files are
-                                     applied left to right.
-     --strip-executable              Strip the dmengine of debug symbols
-                                     (when bundling iOS or Android)
- -tc,--texture-compression <arg>     Use texture compression as specified
-                                     in texture profiles
- -tp,--texture-profiles <arg>        Use texture profiles (deprecated)
-     --use-vanilla-lua               Only ships vanilla source code (i.e.
-                                     no byte code)
-  -v,--verbose                       Verbose output
-     --variant <arg>                 Specify debug, release or headless
-                                     version of dmengine (when bundling)
-     --version                       Prints the version number to the
-                                     output
-     --with-symbols                  Generate the symbol file (if
-                                     applicable)
+-a,--archive                            Build archive
+-ar,--architectures <arg>               Comma separated list of
+                                        architectures to include for the
+                                        platform
+   --archive-resource-padding <arg>     The alignment of the resources in
+                                        the game archive. Default is 4
+-bf,--bundle-format <arg>               Format of the created bundle
+                                        (Android: 'apk' and 'aab')
+   --binary-output <arg>                Location where built engine
+                                        binary will be placed. Default is
+                                        "<build-output>/<platform>/"
+-bo,--bundle-output <arg>               Bundle output directory
+-br,--build-report <arg>                Filepath where to save a build
+                                        report as JSON
+-brhtml,--build-report-html <arg>       Filepath where to save a build
+                                        report as HTML
+   --build-artifacts <arg>              If left out, will default to
+                                        build the engine. Choices:
+                                        'engine', 'plugins'. Comma
+                                        separated list.
+   --build-server <arg>                 The build server (when using
+                                        native extensions)
+-ce,--certificate <arg>                 DEPRECATED! Certificate (Android)
+-d,--debug                              Use debug version of dmengine
+                                        (when bundling). Deprecated, use
+                                        --variant instead
+   --debug-ne-upload                    Outputs the files sent to build
+                                        server as upload.zip
+   --defoldsdk <arg>                    What version of the defold sdk
+                                        (sha1) to use
+-e,--email <arg>                        User email
+   --exclude-build-folder <arg>         Comma separated list of folders
+                                        to exclude from the build
+-h,--help                               This help message
+-i,--input <arg>                        Source directory. Default is
+                                        current directory
+   --identity <arg>                     Sign identity (iOS)
+-k,--keep-unused                        Keep unused resources in archived
+                                        output
+-ks,--keystore <arg>                    Deployment keystore used to sign
+                                        APKs (Android)
+-ksa,--keystore-alias <arg>             The alias of the signing key+cert
+                                        you want to use (Android)
+-ksp,--keystore-pass <arg>              Pasword of the deployment
+                                        keystore (Android)
+-l,--liveupdate <arg>                   Yes if liveupdate content should
+                                        be published
+-mp,--mobileprovisioning <arg>          mobileprovisioning profile (iOS)
+-o,--output <arg>                       Output directory. Default is
+                                        "build/default"
+-p,--platform <arg>                     Platform (when bundling)
+-pk,--private-key <arg>                 DEPRECATED! Private key (Android)
+-r,--root <arg>                         Build root directory. Default is
+                                        current directory
+   --resource-cache-local <arg>         Path to local resource cache.
+   --resource-cache-remote <arg>        URL to remote resource cache.
+   --resource-cache-remote-pass <arg>   Password/token to authenticate
+                                        access to the remote resource
+                                        cache.
+   --resource-cache-remote-user <arg>   Username to authenticate access
+                                        to the remote resource cache.
+   --settings <arg>                     Path to a game project settings
+                                        file. More than one occurrance
+                                        are allowed. The settings files
+                                        are applied left to right.
+   --strip-executable                   Strip the dmengine of debug
+                                        symbols (when bundling iOS or
+                                        Android)
+-tc,--texture-compression <arg>         Use texture compression as
+                                        specified in texture profiles
+-tp,--texture-profiles <arg>            Use texture profiles (deprecated)
+-u,--auth <arg>                         User auth token
+   --use-vanilla-lua                    Only ships vanilla source code
+                                        (i.e. no byte code)
+-v,--verbose                            Verbose output
+   --variant <arg>                      Specify debug, release or
+                                        headless version of dmengine
+                                        (when bundling)
+   --version                            Prints the version number to the
+                                        output
+   --with-symbols                       Generate the symbol file (if
+                                        applicable)
 ```
 
 Доступные команды:

+ 51 - 0
docs/ru/manuals/caching-assets.md

@@ -0,0 +1,51 @@
+---
+title: Кэширование ассетов
+brief: В этом руководстве объясняется, как использовать кэш ассетов для ускорения сборки.
+---
+
+# Кэширование ассетов
+
+Игры, созданные с помощью Defold, обычно собираются за несколько секунд, но по мере роста проекта увеличивается и количество ассетов. Компиляция шрифтов и сжатие текстур могут занимать значительное время в большом проекте, поэтому кэш ассетов существует для ускорения сборки, перестраивая только те ассеты, которые изменились, и используя уже скомпилированные ассеты из кэша для неизмененных активов.
+
+Defold использует трехуровневый кэш:
+
+1. Проектный кэш
+2. Локальный кэш
+3. Удаленный кэш
+
+
+## Проектный кэш
+
+По умолчанию Defold будет кэшировать скомпилированные ассеты в папке `build/default` проекта Defold. Кэш проекта ускоряет последующие сборки, так как перекомпилировать нужно только измененные ассеты, а ассеты без изменений будут использоваться из кэша проекта. Этот кэш всегда включен и используется как редактором, так и инструментами командной строки.
+
+Кэш проекта можно удалить вручную, удалив файлы в `build/default` или выполнив команду `clean` из [командной строки сборщика Боба](/manuals/bob).
+
+
+## Локальный кэш
+
+Добавлен в Defold 1.2.187
+
+Локальный кэш - это дополнительный второй кэш, в котором скомпилированные ассеты хранятся во внешнем файловом месте на той же машине или на сетевом диске. Благодаря внешнему расположению, содержимое кэша сохраняется при очистке кэша проекта. Он также может быть общим для нескольких разработчиков, работающих над одним проектом. В настоящее время кэш доступен только при сборке с помощью инструментов командной строки. Он включается с помощью опции `resource-cache-local`:
+
+```sh
+java -jar bob.jar --resource-cache-local /Users/john.doe/defold_local_cache
+```
+
+Доступ к скомпилированным ассетам из локального кэша осуществляется на основе вычисленной контрольной суммы, которая учитывает версию движка Defold, имена и содержимое исходных ассетов, а также параметры сборки проекта. Это гарантирует уникальность кэшированных активов и возможность совместного использования кэша несколькими версиями Defold.
+
+::: sidenote
+Файлы, хранящиеся в локальном кэше, хранятся неограниченное время. Разработчик должен вручную удалять старые/неиспользуемые файлы.
+:::
+
+
+## Удаленный кэш
+
+Добавлен в Defold 1.2.187
+
+Удаленный кэш - это дополнительный третий кэш, в котором скомпилированные ассеты хранятся на сервере, а доступ к ним осуществляется через HTTP-запрос. В настоящее время кэш доступен только при сборке с помощью инструментов командной строки. Он включается с помощью опции `resource-cache-remote`:
+
+```sh
+java -jar bob.jar --resource-cache-remote http://192.168.0.100/
+```
+
+Как и в случае с локальным кэшем, доступ ко всем активам из удаленного кэша осуществляется на основе вычисленной контрольной суммы. Доступ к кэшированным активам осуществляется с помощью методов HTTP-запросов GET, PUT и HEAD. Defold не предоставляет сервер удаленного кэша. Разработчик должен настроить его самостоятельно. Пример [базового Python-сервера можно посмотреть здесь](https://github.com/britzl/httpserver-python).

+ 11 - 0
docs/ru/manuals/debugging.md

@@ -0,0 +1,11 @@
+---
+title: Отладка в Defold
+brief: Это руководство показывает способы отладки, присутствующие в Defold.
+---
+
+# Отладка
+
+Defold содержит встроенный отладчик Lua с возможностью проверки. Вместе со встроенными [инструментами профилирования](/manuals/profiling) это мощный инструмент, который может помочь найти причину ошибок в логике вашей игры или помочь проанализировать проблемы производительности. Defold также предоставляет журналы сбоев для тех редких случаев, когда происходит сбой самого движка.
+
+* Узнайте больше об [отладке игровой логики](/manuals/debugging-game-logic).
+* Узнайте больше об [отладке нативного кода](/manuals/debugging-native-code).

+ 24 - 0
docs/ru/manuals/design.md

@@ -0,0 +1,24 @@
+---
+title: Дизайн Defold
+brief: Философия дизайна Defold
+---
+
+# Дизайн Defold
+
+Defold был создан со следующими целями:
+
+- Быть полной профессиональной производственной платформой "под ключ" для игровых команд.
+- Быть простым и понятным, предоставляя четкие решения общих архитектурных проблем разработки игр и рабочих процессов.
+- Быть молниеносной платформой разработки, идеальной для интерактивной разработки игр.
+- Быть высокопроизводительным во время выполнения.
+- Быть по-настоящему мультиплатформенным.
+
+Дизайн редактора и движка тщательно проработан для достижения этих целей. Некоторые наши дизайнерские решения отличаются от тех, к которым вы, возможно, привыкли, если у вас есть опыт работы с другими платформами, например:
+
+- Мы требуем статического объявления дерева ресурсов и всех именований. Это требует от вас некоторых первоначальных усилий, но значительно облегчает процесс разработки в долгосрочной перспективе.
+- Мы поощряем передачу сообщений между простыми инкапсулированными сущностями.
+- Объектно-ориентированное наследование отсутствует.
+- Наши API являются асинхронными.
+- Конвейер рендеринга управляется кодом и полностью настраивается.
+- Все наши файлы ресурсов представлены в простых текстовых форматах, оптимально структурированных для слияния в Git, а также для импорта и обработки внешними инструментами.
+- Ресурсы могут быть изменены и "горячо" перезагружены в запущенную игру, что позволяет очень быстро проводить итерации и эксперименты.

+ 114 - 0
docs/ru/manuals/editor-keyboard-shortcuts.md

@@ -0,0 +1,114 @@
+---
+title: Клавиатурные сочетания в редакторе
+brief: В данном руководстве показаны текущие сочетания клавиш и способы их настройки.
+---
+
+# Клавиатурные сочетания
+
+## Стандартные
+
+| Комманда | Windows | macOS | Linux |
+|---------|---------|-------|-------|
+| Вверх | <kbd>Up</kbd> | <kbd>Up</kbd> | <kbd>Up</kbd> |
+| Ввод | <kbd>Enter</kbd> | <kbd>Enter</kbd> | <kbd>Enter</kbd> |
+| Вернуть | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> |
+| Влево | <kbd>Left</kbd> | <kbd>Left</kbd> | <kbd>Left</kbd> |
+| Вниз | <kbd>Down</kbd> | <kbd>Down</kbd> | <kbd>Down</kbd> |
+| Вправо | <kbd>Right</kbd> | <kbd>Right</kbd> | <kbd>Right</kbd> |
+| Вставить | <kbd>Ctrl</kbd>+<kbd>V</kbd> | <kbd>Cmd</kbd>+<kbd>V</kbd> | <kbd>Ctrl</kbd>+<kbd>V</kbd> |
+| Вставка табуляции | <kbd>Tab</kbd> | <kbd>Tab</kbd> | <kbd>Tab</kbd> |
+| Выбрать следующее событие | <kbd>Ctrl</kbd>+<kbd>D</kbd> | <kbd>Cmd</kbd>+<kbd>D</kbd> | <kbd>Ctrl</kbd>+<kbd>D</kbd> |
+| Выделить всё | <kbd>Ctrl</kbd>+<kbd>A</kbd> | <kbd>Cmd</kbd>+<kbd>A</kbd> | <kbd>Ctrl</kbd>+<kbd>A</kbd> |
+| Выделить конец строки | <kbd>Shift</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>End</kbd> |
+| Выделить конец файла | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> |
+| Выделить начало строки |  | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
+| Выделить начало текста строки | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> |
+| Выделить начало файла | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> |
+| Выделить ниже | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> |
+| Выделить предыдущее слово | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> |
+| Выделить рамку | <kbd>F</kbd> | <kbd>F</kbd> | <kbd>F</kbd> |
+| Выделить слева | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> |
+| Выделить справа | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> |
+| Выделить страницу выше | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> |
+| Выделить страницу ниже | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> |
+| Выйти | <kbd>Esc</kbd> | <kbd>Esc</kbd> | <kbd>Esc</kbd> |
+| Вырезать | <kbd>Ctrl</kbd>+<kbd>X</kbd> | <kbd>Cmd</kbd>+<kbd>X</kbd> | <kbd>Ctrl</kbd>+<kbd>X</kbd> |
+| Выровнить камеру | <kbd>Period</kbd> | <kbd>Period</kbd> | <kbd>Period</kbd> |
+| Выход | <kbd>Ctrl</kbd>+<kbd>Q</kbd> | <kbd>Cmd</kbd>+<kbd>Q</kbd> | <kbd>Ctrl</kbd>+<kbd>Q</kbd> |
+| Горячая перезагрузка | <kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>R</kbd> | <kbd>Ctrl</kbd>+<kbd>R</kbd> |
+| Добавить (дополнительно) | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> |
+| Добавить | <kbd>A</kbd> | <kbd>A</kbd> | <kbd>A</kbd> |
+| Документация | <kbd>F1</kbd> | <kbd>F1</kbd> | <kbd>F1</kbd> |
+| Закрыть | <kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Ctrl</kbd>+<kbd>W</kbd> |
+| Закрыть всё | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> |
+| Заменить следующее | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> |
+| Заменить слово |  | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> |  |
+| Инструмент масштабирования | <kbd>R</kbd> | <kbd>R</kbd> | <kbd>R</kbd> |
+| Инструмент перемещения | <kbd>W</kbd> | <kbd>W</kbd> | <kbd>W</kbd> |
+| Инструмент поворота | <kbd>E</kbd> | <kbd>E</kbd> | <kbd>E</kbd> |
+| Инструмент стирания | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> |
+| Искать в файлах | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> |
+| Найти далее | <kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Ctrl</kbd>+<kbd>G</kbd> |
+| Найти предыдущее | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> |
+| Найти слово | <kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Ctrl</kbd>+<kbd>F</kbd> |
+| Начало файла | <kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Ctrl</kbd>+<kbd>Home</kbd> |
+| Новый файл | <kbd>Ctrl</kbd>+<kbd>N</kbd> | <kbd>Cmd</kbd>+<kbd>N</kbd> | <kbd>Ctrl</kbd>+<kbd>N</kbd> |
+| Остановка отладчика | <kbd>Shift</kbd>+<kbd>F5</kbd> |  | <kbd>Shift</kbd>+<kbd>F5</kbd> |
+| Отдалить | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> | <kbd>Cmd</kbd>+<kbd>'-'</kbd> | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> |
+| Открыть | <kbd>Ctrl</kbd>+<kbd>O</kbd> | <kbd>Cmd</kbd>+<kbd>O</kbd> | <kbd>Ctrl</kbd>+<kbd>O</kbd> |
+| Открыть ассет | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>P</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> |
+| Отменить | <kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Ctrl</kbd>+<kbd>Z</kbd> |
+| Параметры | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> | <kbd>Cmd</kbd>+<kbd>Comma</kbd> | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> |
+| Перезагрузка таблицы стилей |  | <kbd>Ctrl</kbd>+<kbd>R</kbd> |  |
+| Переименовать | <kbd>F2</kbd> | <kbd>F2</kbd> | <kbd>F2</kbd> |
+| Перейти в конец строки | <kbd>End</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>End</kbd> |
+| Перейти в конец файла | <kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Ctrl</kbd>+<kbd>End</kbd> |
+| Перейти в начало | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> |
+| Перейти в начало строки |  | <kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
+| Перейти в начало текста строки | <kbd>Home</kbd> | <kbd>Home</kbd> | <kbd>Home</kbd> |
+| Перейти к следующему слову | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> |
+| Перейти к строке | <kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Ctrl</kbd>+<kbd>L</kbd> |
+| Переключение точки остановки | <kbd>F9</kbd> | <kbd>F9</kbd> | <kbd>F9</kbd> |
+| Переключение фильтров видимости | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> |
+| Пересобрать | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> |
+| Переукомплектовать | <kbd>Ctrl</kbd>+<kbd>U</kbd> | <kbd>Cmd</kbd>+<kbd>U</kbd> | <kbd>Ctrl</kbd>+<kbd>U</kbd> |
+| Перешагнуть | <kbd>F10</kbd> | <kbd>F10</kbd> | <kbd>F10</kbd> |
+| Повторно | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> |
+| Показать паллет | <kbd>Space</kbd> | <kbd>Space</kbd> | <kbd>Space</kbd> |
+| Показать последнее скрытое | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> |
+| Показать подсказки | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> |
+| Показать/скрыть комментарий | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> | <kbd>Cmd</kbd>+<kbd>Slash</kbd> | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> |
+| Показать/скрыть левую панель | <kbd>F6</kbd> | <kbd>F6</kbd> | <kbd>F6</kbd> |
+| Показать/скрыть нижняя панель | <kbd>F7</kbd> | <kbd>F7</kbd> | <kbd>F7</kbd> |
+| Показать/скрыть правую панель | <kbd>F8</kbd> | <kbd>F8</kbd> | <kbd>F8</kbd> |
+| Показать/скрыть руководства по компонентам | <kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>Cmd</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>H</kbd> |
+| Предыдущее слово | <kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Alt</kbd>+<kbd>Left</kbd> | <kbd>Ctrl</kbd>+<kbd>Left</kbd> |
+| Предыдущий шаг | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> |
+| Приблизить | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Cmd</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> |
+| Приостановить сцену | <kbd>Ctrl</kbd>+<kbd>T</kbd> | <kbd>Cmd</kbd>+<kbd>T</kbd> | <kbd>Ctrl</kbd>+<kbd>T</kbd> |
+| Продолжить | <kbd>F5</kbd> | <kbd>F5</kbd> | <kbd>F5</kbd> |
+| Разделить выделенное на строки | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> |
+| Сборка | <kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Ctrl</kbd>+<kbd>B</kbd> |
+| Сдвинуть вверх | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> |
+| Сдвинуть вниз | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> |
+| Скопировать | <kbd>Ctrl</kbd>+<kbd>C</kbd> | <kbd>Cmd</kbd>+<kbd>C</kbd> | <kbd>Ctrl</kbd>+<kbd>C</kbd> |
+| Скрыть выбранное | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> |
+| Следующее слово | <kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Ctrl</kbd>+<kbd>Right</kbd> |
+| Следующий шаг | <kbd>F11</kbd> | <kbd>F11</kbd> | <kbd>F11</kbd> |
+| Сохранить всё | <kbd>Ctrl</kbd>+<kbd>S</kbd> | <kbd>Cmd</kbd>+<kbd>S</kbd> | <kbd>Ctrl</kbd>+<kbd>S</kbd> |
+| Страница вверх | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> |
+| Страница вниз | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> |
+| Удалить | <kbd>Delete</kbd> | <kbd>Delete</kbd> | <kbd>Delete</kbd> |
+| Удалить в обратном направлении | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> |
+| Удалить до конца строки | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Cmd</kbd>+<kbd>Delete</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
+| Удалить предыдущее слово | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> | <kbd>Alt</kbd>+<kbd>Backspace</kbd> | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> |
+| Удалить следующее слово | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Alt</kbd>+<kbd>Delete</kbd> | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
+| Удалить строку |  | <kbd>Ctrl</kbd>+<kbd>D</kbd> |  |
+| Удалить табуляцию | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd>  |
+
+
+## Настройка сочетаний клавиш
+
+Вы можете настроить сочетания клавиш, создав файл конфигурации (например, `keymap.edn` в вашем домашнем каталоге). Затем перейдите <kbd>File ▸ Preferences</kbd>, и измените <kbd>Path to custom keymap</kbd> к уже созданному файлу. Вам необходимо перезапустить Defold после установки этого параметра, а также каждый раз, когда вы редактируете файл keymap.
+
+Вы можете просмотреть и скачать сочетания клавиш для: [Windows](examples/keymap_win.edn), [MacOS](examples/keymap_macos.edn) and [Linux](examples/keymap_linux.edn)

+ 49 - 0
docs/ru/manuals/editor-preferences.md

@@ -0,0 +1,49 @@
+---
+title: Настройки редактора
+brief: Вы можете изменить настройки редактора из окна Preferences.
+---
+
+# Настройки редактора
+
+Вы можете изменить настройки редактора из окна Preferences. Окно настроек открывается в <kbd>File -> Preferences</kbd>.
+
+## Общие сведения
+
+![](images/editor/preferences_general.png)
+
+Включить Сжатие Текстур
+: Включает [сжатие текстур](/manuals/texture-profiles) для всех сборок, сделанных в редакторе.
+
+Escape Quits Game
+: Завершите запущенную сборку вашей игры с помощью кнопки <kbd>Esc</kbd>.
+
+Track Active Tab in Asset Browser
+: Файл, редактированный на выбранной вкладке в панели *Editor*, будет выбран в браузере ассетов (также известном как панель *Asset*).
+
+Path to custom keymap
+: Полный путь к файлу, содержащий [пользовательские сочетания клавиш](/manuals/editor-keyboard-shortcuts).
+
+Code editor font
+: Имя установленного в системе шрифта, для использования в редакторе програмного кода.
+
+
+## Програмный код
+
+![](images/editor/preferences_code.png)
+
+Custom Editor
+: Полный путь к внешнему редактору. На macOS это должен быть путь к исполняемому файлу внутри .app (например: `/Applications/Atom.app/Contents/MacOS/Atom`).
+
+Open File
+: Шаблон, используемый пользовательским редактором для указания файла, который нужно открыть. Шаблон `{file}` будет заменен именем файла, который нужно открыть.
+
+Open File at Line
+: Шаблон, используемый пользовательским редактором для указания того, какой файл открыть и на какой номер строки. Шаблон `{file}` будет заменен именем открываемого файла, а `{line}` - номером строки.
+
+
+## Расширения
+
+![](images/editor/preferences_extensions.png)
+
+Build Server
+: URL-адрес сервера сборки, используемый при сборке проекта, содержащего [собственные расширения](/manuals/extensions). Можно добавить имя пользователя и токена к URL для аутентифицированного доступа к серверу сборки. Используйте следующую нотацию для указания имени пользователя и токена: `username:[email protected]`. Аутентифицированный доступ требуется для сборок Nintendo Switch и при запуске собственного экземпляра сервера сборки с включенной аутентификацией. [Оратитесь к документации по серверу сборки](https://github.com/defold/extender/blob/dev/README_SECURITY.md) для получения дополнительной информации).

+ 201 - 0
docs/ru/manuals/editor-scripts.md

@@ -0,0 +1,201 @@
+---
+title: Скрипты редактора
+brief: Это руководство объясняет, как расширить редактор с помощью Lua
+---
+
+# Скрипты редактора
+
+Вы можете создавать пользовательские пункты меню и хуки жизненного цикла редактора, используя файлы Lua со специальным расширением: `.editor_script`. Используя эту систему, вы можете настраивать редактор для улучшения рабочего процесса разработки.
+
+## Время выполнения скрипта редактора
+
+Сценарии редактора выполняются внутри редактора, в Lua VM, эмулированной Java VM. Все скрипты работают в одном едином окружении, а это означает, что они могут взаимодействовать друг с другом. Вы можете подключать модули Lua, также как и файлы `.script`. Помните версии Lua, которые работают внутри редактора, отличаются, поэтому убедитесь, что ваш общий код совместим. Редактор использует Lua версии 5.2.x, а точнее [luaj](https://github.com/luaj/luaj), которая в настоящее время является единственным жизнеспособным решением для запуска Lua на JVM. Кроме этого, есть некоторые ограничения:
+- нет пакетов `debug` и `coroutine`;
+- нет `os.execute` - мы предоставляем более удобный и безопасный способ выполнения shell-скриптов в разделе [actions](#actions);
+- нет пакетов `os.tmpname` и `io.tmpfile` - в настоящее время скрипты редактора могут обращаться к файлам только внутри каталога проекта;
+- в настоящее время нет `os.rename`, хотя мы хотим его добавить;
+- нет `os.exit` и `os.setlocale`.
+
+Все расширения редактора, определенные в сценариях редактора, загружаются при открытии проекта. При извлечении библиотек, расширения перезагружаются, поскольку в библиотеках, от которых вы зависите, могут быть новые скрипты редактора. Во время этой перезагрузки изменения в ваших собственных скриптах редактора не учитываются, поскольку вы можете находиться в процессе их изменения. Чтобы перезагрузить и их, нужно выполнить команду Project → Reload Editor Scripts.
+## Анатомия `.editor_script`
+
+Каждый скрипт редактора должен возвращать модуль, подобный этому:
+```lua
+local M = {}
+
+function M.get_commands()
+  -- TODO
+end
+
+return M
+```
+Затем редактор собирает все скрипты редактора, определенные в проекте и библиотеках, загружает их в единую Lua VM и вызывает их при необходимости (подробнее об этом в разделах [commands](#commands) и [lifecycle hooks](#lifecycle-hooks)).
+
+## API редактора
+
+Вы можете взаимодействовать с редактором, используя пакет `editor`, который определяет этот API:
+- `editor.platform` - строка, либо `"x86_64-win32"` для Windows, `"x86_64-darwin"` для macOS, либо `"x86_64-linux"` для Linux.
+- `editor.get(node_id, property)` - получить значение определённого узла внутри редактора. Узлы в редакторе - это различные сущности, такие как файлы скриптов или коллекций, игровые объекты внутри коллекций, json-файлы, загруженные в качестве ресурсов, и т.д. `node_id` - это пользовательские данные, которые передаются в скрипт редактора самим редактором. Также вместо id узла можно передать путь к ресурсу, например `"/main/game.script"`. `property` - это строка. В настоящее время поддерживаются следующие свойства:
+  - `"path"` - путь к файлу из папки проекта для *resources* - сущностей, существующих в виде файлов. Пример возвращаемого значения: `"/main/game.script"`.
+  - `"text"` - текстовое содержимое ресурса, редактируемое как текст (например, файлы скриптов или json). Пример возвращаемого значения: `"function init(self)\nend"`. Обратите внимание, что это не то же самое, что читать файл лучше с помощью `io.open()`, потому что вы можете редактировать файл, не сохраняя его, и эти правки доступны только при обращении к свойству `"text"`.
+  - некоторые свойства отображаются в Properties, которые были выделены в Outline. Поддерживаются такие типы свойств контура:
+    - strings
+    - booleans
+    - numbers
+    - vec2/vec3/vec4
+    - resources
+
+    Обратите внимание, что некоторые из этих свойств могут быть доступны только для чтения, а некоторые могут быть недоступны в различных контекстах, поэтому вы должны использовать `editor.can_get`, прежде чем читать их, и `editor.can_set`, прежде чем заставить редактор установить их. Наведите курсор на имя свойства в Properties, чтобы увидеть всплывающую подсказку с информацией о том, как это свойство именуется в скриптах редактора. Вы можете установить свойства ресурса на nil, установив значение `""`.
+- `editor.can_get(node_id, property)` — проверьте, можете ли вы получить это свойство, чтобы `editor.get()` не выдал ошибку
+- `editor.can_set(node_id, property)` — проверьте, не приведет ли действие `"set"` с этим свойством к ошибке
+
+## Команды
+
+Если модуль сценария редактора определяет функцию `get_commands`, она будет вызываться при перезагрузке расширения, и возвращенные команды будут доступны для использования внутри редактора в строке меню или в контекстных меню на панелях Assets и Outline. Например:
+```lua
+local M = {}
+
+function M.get_commands()
+  return {
+    {
+      label = "Remove Comments",
+      locations = {"Edit", "Assets"},
+      query = {
+        selection = {type = "resource", cardinality = "one"}
+      },
+      active = function(opts)
+        local path = editor.get(opts.selection, "path")
+        return ends_with(path, ".lua") or ends_with(path, ".script")
+      end,
+      run = function(opts)
+        local text = editor.get(opts.selection, "text")
+        return {
+          {
+            action = "set",
+            node_id = opts.selection,
+            property = "text",
+            value = strip_comments(text)
+          }
+        }
+      end
+    },
+    {
+      label = "Minify JSON"
+      locations = {"Assets"},
+      query = {
+        selection = {type = "resource", cardinality = "one"}
+      },
+      active = function(opts)
+        return ends_with(editor.get(opts.selection, "path"), ".json")
+      end,
+      run = function(opts)
+        local path = editor.get(opts.selection, "path")
+        return {
+          {
+            action = "shell",
+            command = {"./scripts/minify-json.sh", path:sub(2)}
+          }
+        }
+      end
+    }
+  }
+end
+
+return M
+```
+Редактор ожидает, что `get_commands()` вернет массив таблиц, каждая из которых описывает отдельную команду. Описание команды состоит из:
+
+- `label` (обязательно) - текст пункта меню, который будет отображаться пользователю
+- `locations` (обязательно) - массив из `"Edit"`, `"View"`, `"Assets"` или `"Outline"`, описывает место, где эта команда должна быть доступна. `"Edit"` и `"View"` означают строку меню сверху, `"Assets"` означает контекстное меню в панели Assets, а `"Outline"` означает контекстное меню в панели Outline.
+- `query` - способ для команды запросить у редактора необходимую информацию и определить, над какими данными она работает. Для каждого ключа в таблице `query` будет соответствующий ключ в таблице `opts`, который обратные вызовы `active` и `run` получают в качестве аргумента. Поддерживаемые ключи:
+  - `selection` означает, что эта команда действительна, когда есть что-то выбранное, и она действует на это выбранное.
+    - `type` - это тип выбранных узлов, которые интересуют команду, в настоящее время допустимы такие типы:
+      - `"resource"` - в Assets и Outline, ресурс - это выделенный элемент, который имеет соответствующий файл. В строке меню (Edit или View), ресурс - это открытый в данный момент файл;
+      - `"outline"` - то, что может быть показано в контуре. В Outline это выделенный элемент, в строке меню - открытый файл;
+    - `cardinality` определяет, сколько выделенных элементов должно быть. Если `"one"`, выбор, переданный в обратный вызов команды, будет единственным идентификатором узла. Если `"many"`, то выборка, передаваемая в обратный вызов команды, будет массивом из одного или нескольких идентификаторов узлов.
+- `active` - обратный вызов, который выполняется для проверки того, что команда активна, ожидается, что он вернет булево значение. Если `locations` включают `"Assets"` или `"Outline"`, `active` будет вызван при показе контекстного меню. Если местоположения включают `"Edit"` или `"View"`, active будет вызываться при каждом взаимодействии пользователя, например, при наборе текста на клавиатуре или щелчке мышью, поэтому убедитесь, что `active` работает относительно быстро.
+- `run` - обратный вызов, который выполняется, когда пользователь выбирает пункт меню, ожидается, что он вернет массив [actions](#actions).
+
+## Действия
+
+Действие - это таблица, описывающая, что должен сделать редактор. Каждое действие имеет ключ `action`. Действия бывают двух видов: отменяемые и не отменяемые.
+
+### Отменяемые действия
+
+
+Существующие отменяемые действия:
+- `"set"` — установка свойства узла в редакторе на некоторое значение. Пример:
+  ```lua
+  {
+    action = "set",
+    node_id = opts.selection,
+    property = "text",
+    value = "current time is " .. os.date()
+  }
+  ```
+  `"set"` действие требует наличия этих ключей:
+  - `node_id` — идентификатора узла данных пользователя. Также вы можете использовать путь к ресурсу, вместо идентификатора узла, полученного от редактора, например `"/main/game.script"`;
+  - `property` — свойство узла для установки, в настоящее время поддерживается только `"text"`;
+  - `value` — новое значение для свойства. Для свойства `"text"` это должна быть строка.
+
+### Неотменяемые действия
+
+Неотменяемые действие, очищает историю отмены, поэтому, если вы хотите отменить такое действие, вам придется использовать другие средства, например, контроль версий.
+
+Существующие неотменяемые действия:
+- `"shell"` — выполняет сценарий оболочки. Пример:
+  ```lua
+  {
+    action = "shell",
+    command = {
+      "./scripts/minify-json.sh",
+      editor.get(opts.selection, "path"):sub(2) -- trim leading "/"
+    }
+  }
+  ```
+  Действие `"shell"` требует ключ `command`, который представляет собой массив команд и их аргументов. Основное отличие от `os.execute` заключается в том, что поскольку это потенциально опасная операция, редактор покажет диалог подтверждения, спрашивающий пользователя, хочет ли он выполнить эту команду. Он будет помнить каждую команду, которую пользователь уже разрешил.
+
+### Действие при смешивании и побочные эффекты
+
+Вы можете смешивать отменяемые и неотменяемые действия. Действия выполняются последовательно, поэтому в зависимости от порядка действий вы потеряете возможность отменить часть команды.
+
+Вместо того чтобы возвращать действия из функций, которые их ожидают, вы можете просто читать и записывать в файлы напрямую, используя `io.open()`. Это вызовет перезагрузку ресурсов, которая очистит историю отмены.
+
+## Хуки жизненного цикла
+
+Существует специально обработанный файл скрипта редактора: `hooks.editor_script`, расположенный в корне вашего проекта, в том же каталоге, что и `game.project`. Этот и только этот скрипт редактора будет получать события жизненного цикла от редактора. Пример такого файла:
+```lua
+local M = {}
+
+function M.on_build_started(opts)
+  local file = io.open("assets/build.json", "w")
+  file:write("{\"build_time\": \"".. os.date() .."\"}")
+  file:close()
+end
+
+return M
+```
+
+Каждый хук жизненного цикла может возвращать действия или записывать в файлы в директории проекта.
+
+Существующие хуки жизненного цикла, которые могут определять `/hooks.editor_script`:
+- `on_build_started(opts)` — выполняется, когда игра собирается для запуска локально или на удаленной цели. Ваши изменения, будь то возвращенные действия или обновленное содержимое файлов, появятся в собранной игре. Вызов ошибки из этого хука прервет сборку. `opts` - это таблица, содержащая следующие ключи:
+  - `platform` — строка в формате `%arch%-%os%`, описывающая, для какой платформы он создан, в настоящее время всегда то же значение, что и в `editor.platform`.
+- `on_build_finished(opts)` — выполняется, когда сборка закончена успешно или нет `opts` представляет собой таблицу со следующими ключами:
+  - `platform` — также как и в `on_build_started`
+  - `success` — успешна ли сборка `true` или `false`
+- `on_bundle_started(opts)` — выполняется, при создании пакета или сборки HTML5-версии игры. Как и в случае с `on_build_started`, изменения, вызванные этим хуком, появятся в пакете, а ошибки прервут упаковывание. `opts` будет иметь такие ключи:
+  - `output_directory` — путь к файлу, указывающий на каталог с выводом пакета, например `"/path/to/project/build/default/__htmlLaunchDir"`
+  - `platform` — платформа, на которой игра упаковывается. Список возможных вариантов платформы см. в [Bob manual](/manuals/bob).
+  - `variant` — вариант упаковывания `"debug"`, `"release"` или `"headless"`
+- `on_bundle_finished(opts)` — выполняется, когда упаковывание завершается, независимо от того, успешно или нет. `opts` - это таблица с теми же данными, что и `opts` в `on_bundle_started`, плюс ключ `success`, указывающий на успешность сборки.
+- `on_target_launched(opts)` — выполняется, когда пользователь запускает игру и она успешно запускается. `opts` содержит ключ `url`, указывающий на запущенный сервис движка, например, `"http://127.0.0.1:35405"`
+- `on_target_terminated(opts)` — выполняется при закрытии запущенной игры, имеет те же опции, что и `on_target_launched`
+
+Обратите внимание, что хуки жизненного цикла в настоящее время являются функцией только для редактора, и они не выполняются Бобом при упаковывании из командной строки.
+
+## Скрипты редактора в библиотеках
+
+Вы можете опубликовать библиотеки для использования другими людьми, содержащие команды, и они будут автоматически подхвачены редактором. Хуки, с другой стороны, не могут быть подхвачены автоматически, так как они должны быть определены в файле, который находится в корневой папке проекта, а библиотеки раскрывают только вложенные папки. Это сделано для большего контроля над процессом сборки: вы по-прежнему можете создавать хуки жизненного цикла как простые функции в файлах `.lua`, чтобы пользователи вашей библиотеки могли включать и использовать их в своих проектах `/hooks.editor_script`.
+
+Также обратите внимание, что хотя зависимости отображаются в Assets, они не существуют как файлы (это записи в zip-архиве), поэтому в настоящее время нет простого способа выполнить сценарий оболочки, который вы предоставляете в зависимости. Если вам это необходимо, вам придется извлечь предоставленные сценарии, получив их текст с помощью `editor.get()` и записав их куда-нибудь с помощью `file:write()`, например, в папку `build/editor-scripts/your-extension-name`.

+ 129 - 0
docs/ru/manuals/editor-styling.md

@@ -0,0 +1,129 @@
+---
+title: Стилизация редактора
+brief: Вы можете изменить цвета, типографику и другие визуальные аспекты редактора с помощью пользовательской таблицы стилей.
+---
+
+# Стилизация редактора
+
+Вы можете изменить цвета, типографику и другие визуальные аспекты редактора с помощью пользовательской таблицы стилей:
+
+* Создайте папку с именем `.defold` в домашнем каталоге пользователя.
+  * На Windows `C:\Users\**Your Username**\.defold`
+  * На macOS `/Users/**Your Username**/.defold`
+  * На Linux `~/.defold`
+* Создайте файл `editor.css` в папке `.defold`.
+
+При запуске редактор загрузит вашу пользовательскую таблицу стилей и применит ее поверх стиля по умолчанию. Редактор использует JavaFX для пользовательского интерфейса, а таблицы стилей практически идентичны файлам CSS, используемым в браузере для применения атрибутов стиля к элементам веб-страницы. Таблицы стилей по умолчанию [доступны на GitHub](https://github.com/defold/defold/tree/editor-dev/editor/styling/stylesheets/base).
+
+## Изменение цветов
+
+Цвета по умолчанию определены в [`_palette.scss`](https://github.com/defold/defold/blob/editor-dev/editor/styling/stylesheets/base/_palette.scss) и выглядят следующим образом:
+
+```
+* {
+	// Background
+	-df-background-darker:    derive(#212428, -10%);
+	-df-background-dark:      derive(#212428, -5%);
+	-df-background:           #212428;
+	-df-background-light:     derive(#212428, 10%);
+	-df-background-lighter:   derive(#212428, 20%);
+
+	// Component
+	-df-component-darker:     derive(#464c55, -20%);
+	-df-component-dark:       derive(#464c55, -10%);
+	-df-component:            #464c55;
+	-df-component-light:      derive(#464c55, 10%);
+	-df-component-lighter:    derive(#464c55, 20%);
+
+	// Text & icons
+	-df-text-dark:            derive(#b4bac1, -10%);
+	-df-text:                 #b4bac1;
+	-df-text-selected:        derive(#b4bac1, 20%);
+
+  и так далее...
+```
+
+Основная тема разделена на три группы цветов (с более темными и более светлыми вариантами):
+
+* Цвет фона - цвет фона в панелях, окнах, диалогах
+* Цвет компонентов - кнопки, ручки полосы прокрутки, контуры текстовых полей
+* Цвет текста - текст и значки
+
+Например, если вы добавите это в вашу пользовательскую таблицу стилей `editor.scss` в папке `.defold` в домашней папке пользователя:
+
+```
+* {
+	-df-background-darker:    derive(#0a0a42, -10%);
+	-df-background-dark:      derive(#0a0a42, -5%);
+	-df-background:           #0a0a42;
+	-df-background-light:     derive(#0a0a42, 10%);
+	-df-background-lighter:   derive(#0a0a42, 20%);
+}
+```
+
+В редакторе вы получите следующий вид:
+
+![](images/editor/editor-styling-color.png)
+
+
+## Изменение шрифтов
+
+Редактор использует два шрифта: `Dejavu Sans Mono` для кода и однострочного текста (ошибки) и `Source Sans Pro` для остальной части пользовательского интерфейса. Значения шрифтов находятся в основном в [`_typography.scss`](https://github.com/defold/defold/blob/editor-dev/editor/styling/stylesheets/base/_typography.scss) и выглядят следующим образом:
+
+```
+@font-face {
+  src: url("SourceSansPro-Light.ttf");
+}
+
+@font-face {
+  src: url("DejaVuSansMono.ttf");
+}
+
+$default-font-mono: 'Dejavu Sans Mono';
+$default-font: 'Source Sans Pro';
+$default-font-bold: 'Source Sans Pro Semibold';
+$default-font-italic: 'Source Sans Pro Italic';
+$default-font-light: 'Source Sans Pro Light';
+
+.root {
+    -fx-font-size: 13px;
+    -fx-font-family: $default-font;
+}
+
+Text.strong {
+  -fx-font-family: $default-font-bold;
+}
+
+and so on...
+```
+
+Основной шрифт определяется в корневом элементе, что позволяет легко заменить шрифт в большинстве мест. Добавьте это в ваш `editor.scss`:
+
+```
+@import url('https://fonts.googleapis.com/css2?family=Architects+Daughter&display=swap');
+
+.root {
+    -fx-font-family: "Architects Daughter";
+}
+```
+
+В редакторе вы получите следующий вид:
+
+![](images/editor/editor-styling-fonts.png)
+
+Также можно использовать локальный шрифт вместо веб-шрифта:
+
+```
+@font-face {
+  font-family: 'Comic Sans MS';
+  src: local("cs.ttf");
+}
+
+.root {
+  -fx-font-family: 'Comic Sans MS';
+}
+```
+
+::: sidenote
+Шрифт редактора кода определяется отдельно в настройках редактора!
+:::

+ 46 - 0
docs/ru/manuals/editor-templates.md

@@ -0,0 +1,46 @@
+---
+title: Шаблоны редактора
+brief: Вы можете добавить собственные пользовательские шаблоны проектов в окне New Project.
+---
+
+# Шаблоны редактора
+
+Вы можете добавить собственные пользовательские шаблоны проектов в окне New Project:
+
+![пользовательские шаблоны проектов](images/editor/custom_project_templates.png)
+
+Для того чтобы добавить одну или несколько новых вкладок с пользовательскими шаблонами проекта, необходимо добавить файл `welcome.edn` в папку `.defold` в домашнем каталоге пользователя:
+
+* Создайте папку с именем `.defold` в домашнем каталоге пользователя.
+  * На Windows `C:\Users\**Your Username**\.defold`
+  * На macOS `/Users/**Your Username**/.defold`
+  * На Linux `~/.defold`
+* Создайте файл `welcome.edn` в папке `.defold`.
+
+В файле `welcome.edn` используется формат расширяемой нотации данных. Пример:
+
+```
+{:new-project
+  {:categories [
+    {:label "My Templates"
+     :templates [
+          {:name "My project"
+           :description "My template with everything set up the way I want it."
+           :image "empty.svg"
+           :zip-url "https://github.com/britzl/template-project/archive/master.zip"
+           :skip-root? true},
+          {:name "My other project"
+           :description "My other template with everything set up the way I want it."
+           :image "empty.svg"
+           :zip-url "https://github.com/britzl/template-other-project/archive/master.zip"
+           :skip-root? true}]
+    }]
+  }
+}
+```
+
+В результате будет создан список шаблонов, показанный на скриншоте выше.
+
+::: sidenote
+Вы можете использовать только изображения шаблонов [поставляемые вместе с редактором](https://github.com/defold/defold/tree/dev/editor/resources/welcome/images).
+:::

+ 124 - 0
docs/ru/manuals/extensions-best-practices.md

@@ -0,0 +1,124 @@
+---
+title: Нативные расширения - Лучшие Практики
+brief: В этом руководстве описаны лучшие методы разработки нативных расширений.
+---
+
+# Лучшие Практики
+
+Написание кроссплатформенного кода может быть сложным, но есть некоторые способы облегчить его разработку и поддержку. В этом руководстве мы перечислим некоторые способы, с помощью которых мы в Defold работаем с кроссплатформенным нативным кодом и API.
+
+## Код Defold
+
+В движке Defold мы используем C++ очень мало. Фактически, большинство кода C-подобна. Мы избегаем шаблонов, за исключением нескольких контейнерных классов, из-за того, что шаблоны увеличивают как время компиляции, так и размер исполняемого файла.
+
+### C++ версия
+
+Исходный код Defold собирается с использованием версии C++ по умолчанию каждого компилятора (см. [Native Extensions - Best Practices](/manuals/extensions-best-practices/)).
+
+Мы избегаем использования последних возможностей или версий C++. В основном потому, что у нас уже есть все необходимое для создания игрового движка. Следить за последними возможностями C++ - трудоемкая задача, и чтобы действительно освоить эти возможности, потребуется много драгоценного времени.
+
+Для разработчиков расширений это также является дополнительным преимуществом, поскольку мы поддерживаем стабильный ABI. Также стоит отметить, что использование последних возможностей C++ может помешать компиляции кода на разных платформах из-за различной поддержки.
+
+### Стандартные Библиотеки Шаблонов - STL
+
+Поскольку движок Defold не использует никакого кода STL, за исключением некоторых алгоритмов и математики (std::sort, std::upper_bound и т.д.), но вы можете использовать STL в своем расширении.
+
+Опять же, имейте в виду, что несовместимость ABI может помешать вам при использовании вашего расширения в сочетании с другими расширениями или библиотеками сторонних производителей
+
+Избегая (сильно шаблонизированных) библиотек STL, мы также улучшаем время сборки и, что более важно, размер исполняемого файла.
+
+#### Строки
+
+В движке Defold мы используем `const char*` вместо `std::string`.
+
+`std::string` - распространенный подводный камень при смешивании различных версий C++ или версий компилятора: вы получите несоответствие ABI.
+Для нас лучше использовать `const char*` и несколько вспомогательных функций.
+
+### Создание скрытых функций
+
+По возможности используйте ключ `static` для функций, локальных для вашего блока компиляции. Это позволяет компилятору выполнять некоторые оптимизации, что может как улучшить производительность, так и уменьшить размер исполняемого файла.
+
+## Библиотеки сторонних производителей
+
+При выборе сторонней библиотеки для использования (независимо от языка) мы учитываем, по крайней мере, следующие моменты:
+
+* Функциональность - Решает ли он конкретную проблему, которая у вас есть?
+* Производительность - Влечет ли он за собой затраты на производительность во время выполнения?
+* Размер библиотеки - Насколько больше будет конечный исполняемый файл? Приемлемо ли это?
+* Зависимости - Требуются ли дополнительные библиотеки?
+* Поддержка - В каком состоянии находится библиотека? Много ли у нее открытых проблем? Поддерживается ли она до сих пор?
+* Лицензия - Можно ли ее использовать для этого проекта?
+
+
+## Зависимости с открытым исходным кодом
+
+Всегда убеждайтесь, что у вас есть доступ к зависимостям. Например, если вы зависите от чего-то на GitHub, ничто не помешает тому, что репозиторий будет удален, или внезапно изменит направление или владельца. Вы можете уменьшить этот риск, сделав форк репозитория и используя свой форк вместо изначального проекта.
+
+Код из этой библиотеки будет внедрен в вашу игру, поэтому убедитесь, что библиотека делает то, что должна делать, и ничего больше!
+
+
+## Структура проекта
+
+При создании расширения есть несколько вещей, которые помогают как в его разработке, так и в поддержании.
+
+### Lua API
+
+Должен быть только один Lua API и одна его реализация. Это значительно облегчает одинаковое поведение для всех платформ.
+
+Если рассматриваемая платформа не поддерживает расширение, мы рекомендуем просто не регистрировать модуль Lua вообще.
+Таким образом, вы можете обнаружить поддержку, проверив наличие nil:
+
+    if myextension ~= nil then
+        myextension.do_something()
+    end
+
+### Структура папки
+
+Вот структура папок, которую мы часто используем для наших расширений.
+
+    /root
+        /input
+        /main                            -- Все файлы для актуального примера проекта
+            /...
+        /myextension                     -- Фактическая корневая папка расширения
+            ext.manifest
+            /include                     -- Внешние включения, используемые другими расширениями
+            /libs
+                /<platform>              -- Внешние библиотеки для всех поддерживаемых платформ
+            /src
+                myextension.cpp          -- Lua API расширения и функции жизненного цикла расширения
+                                            Также содержимое общих реализаций ваших функций Lua API.
+                myextension_private.h    -- Ваш внутренний API, который будет реализован на каждой платформе (например, `myextension_Init` и т.д.)
+                myextension.mm           -- Если для iOS/macOS необходимы нативные вызовы. Реализует `myextension_Init` и т.д. для iOS/macOS
+                myextension_android.cpp  -- Если для Android необходимы вызовы JNI. Реализуется `myextension_Init` и т.д. для Android
+                /java
+                    /<platform>          -- Любые java-файлы, необходимые для Android
+            /res                         -- Любые ресурсы, необходимые для платформы
+            /external
+                README.md                -- Заметки/скрипты о том, как собрать или упаковать любые внешние библиотеки
+        /bundleres                       -- Ресурсы, для которых должны быть созданы связки (см. game.project и параметр [bundle_resources setting]([physics scale setting])(/manuals/project-settings/#project))
+            /<platform>
+        game.project
+        game.appmanifest                 -- Любая дополнительная информация о конфигурации приложения
+
+
+Обратите внимание, что `myextension.mm` и `myextension_android.cpp` нужны только в том случае, если вы делаете специфические нативные вызовы для данной платформы.
+
+#### Папки платформы
+
+В некоторых местах мы используем архитектуру платформы в качестве имени папки, чтобы знать, какие файлы использовать при компиляции/комплектации приложения.
+Они имеют такую форму:
+
+    <architecture>-<platform>
+
+Текущий список таков:
+
+    arm64-ios, armv7-ios, x86_64-ios, arm64-android, armv7-android, x86_64-linux, x86_64-osx, x86_64-win32, x86-win32
+
+Например, поместите библиотеки для конкретной платформы в раздел:
+
+    /libs
+        /arm64-ios
+                            /libFoo.a
+        /arm64-android
+                            /libFoo.a

+ 155 - 0
docs/ru/manuals/extensions-build-variants.md

@@ -0,0 +1,155 @@
+---
+title: Нативные расширения - Варианты сборки
+brief: Это руководство описывает различные варианты сборок, которые может создавать Defold, и то, как они взаимодействуют с нативными расширениями и движком.
+---
+
+# Нативные расширения - Варианты сборки
+
+## Варианты Сборки
+
+Когда вы собираете игру, вам нужно выбрать тип движка, который вы хотите использовать.
+
+  * Debug
+  * Release
+  * Headless
+
+Эти различные версии также называются `вариантами сборки`.
+
+Примечание: Когда вы выберете `Build and run`, вы получите отладочную версию.
+
+### Debug
+
+В этом типе исполняемого файла еще остались функции отладки, такие как профилирование, протоколирование и горячая перезагрузка. Этот вариант выбирается во время разработки игры.
+
+### Release
+
+В этом варианте функции отладки отключены. Этот вариант выбирается, когда игра готова к выпуску в магазин приложений.
+
+### Headless
+
+Этот исполняемый файл запускается без графики и звука. Это означает, что вы можете запускать игровые юнит/дымовые тесты на CI-сервере или даже иметь его в качестве игрового сервера в облаке.
+
+## App Manifest
+
+С помощью функции Native Extensions вы можете не только добавлять в движок нативный код, но и удалять стандартные части движка. Например, если вам не нужен физический движок, вы можете удалить его из исполняемого файла.
+
+Мы поддерживаем это с помощью файла, называемого `App Manifest` (.appmanifest). В таком файле вы можете указать, какие библиотеки или символы удалить, или, возможно, добавить флаги компиляции
+
+Эта функция находится в стадии разработки и совершенствования.
+
+### Комбинированный контекст
+
+Манифест приложения фактически имеет ту же структуру и синтаксис, что и манифест расширения. Это позволяет нам объединять контексты для одной платформы вместе при окончательной сборке.
+
+А сам Defold имеет свой собственный манифест сборки в качестве основы (`build.yml`). Для каждого расширения, которое собирается, манифесты объединяются следующим образом:
+
+	manifest = merge(game.appmanifest, ext.manifest, build.yml)
+
+Это делается для того, чтобы пользователь мог переопределить поведение по умолчанию движка, а также каждого расширения. И, на последнем этапе соединения, мы объединяем манифест приложения с манифестом Defold:
+
+	manifest = merge(game.appmanifest, build.yml)
+
+### Редактирование
+
+В настоящее время этот процесс можно выполнить вручную, но мы рекомендуем нашим пользователям использовать [Manifestation](https://britzl.github.io/manifestation/) инструмент для создания манифеста приложения. В конечном итоге создание и изменение манифестов приложений будет осуществляться в редакторе.
+
+### Синтаксис
+
+Вот пример из [Manifestation](https://britzl.github.io/manifestation/) для справки (Может быть изменен. Не копируйте этот файл напрямую. Вместо этого используйте онлайн-инструмент):
+
+	platforms:
+	    x86_64-osx:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    x86_64-linux:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    js-web:
+	        context:
+	            excludeLibs: []
+	            excludeJsLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    wasm-web:
+	        context:
+	            excludeLibs: []
+	            excludeJsLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    x86-win32:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    x86_64-win32:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    armv7-android:
+	        context:
+	            excludeLibs: []
+	            excludeJars: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    armv7-ios:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+	    arm64-ios:
+	        context:
+	            excludeLibs: []
+	            excludeSymbols: []
+	            libs: []
+	            linkFlags: []
+
+
+#### Белый список
+
+Для всех ключевых слов мы применяем фильтр белых списков. Это делается для того, чтобы избежать незаконной работы с путями и доступа к файлам вне папки загрузки сборки.
+
+#### linkFlags
+
+Здесь вы можете добавить флаги для компилятора конкретной платформы
+
+#### libs
+
+Этот флаг используется только в том случае, если вы хотите добавить библиотеку, которая является частью платформы или Defold SDK. Все библиотеки в расширениях вашего приложения добавляются автоматически, и вы не должны добавлять их в этот флаг. Вот пример, в котором 3D-физика удалена из движка:
+
+    x86_64-linux:
+        context:
+            excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision"]
+            excludeSymbols: []
+            libs: ["physics_2d"]
+            linkFlags: []
+
+#### Флаги исключений
+
+Эти флаги используются для удаления вещей, ранее определенных в контексте платформы. Вот пример того, как удалить расширение Facebook из движка (обратите внимание на `(.*)`, которое является регулярным выражением, чтобы помочь удалить нужные элементы).
+
+    armv7-android:
+        context:
+            excludeLibs: ["facebookext"]
+            excludeJars: ["(.*)/facebooksdk.jar","(.*)/facebook_android.jar"]
+            excludeSymbols: ["FacebookExt"]
+            libs: []
+            linkFlags: []
+
+#### Где список всех флагов, библиотек, символов???
+
+Мы могли бы разместить некоторые из них здесь, но мы также считаем, что наше время лучше потратить на завершение функции перемещения конфигурации манифеста в редактор, сделав это простым шагом для пользователя.
+
+Тем временем мы будем обновлять инструмент [Manifestation](https://britzl.github.io/manifestation/).

+ 48 - 0
docs/ru/manuals/extensions-defold-sdk.md

@@ -0,0 +1,48 @@
+---
+title: Нативные расширения - Defold SDK
+brief: В этом руководстве описывается работа с Defold SDK при создании нативных расширений.
+---
+
+# Defold SDK
+
+Defold SDK содержит необходимую функциональность для объявления нативного расширения, а также взаимодействия с низкоуровневым нативным слоем платформы, на котором работает приложение, и высокоуровневым слоем Lua, в котором создается игровая логика.
+
+## Использование
+
+Используете Defold SDK, включив заголовочный файл `dmsdk/sdk.h`:
+
+    #include <dmsdk/sdk.h>
+
+Доступные функции SDK документированы в [API reference](/ref/dmExtension/). SDK содержит следующие пространства имен с функциями:
+
+* [Align](/ref/dmAlign/) - Макросы выравнивания. Используются для совместимости с компилятором
+* [Array](/ref/dmArray/) - Шаблонный массив с проверкой границ.
+* [Buffer](/ref/dmBuffer/) - API для буферов данных как основного способа взаимодействия между системами. Для буфера создания также существует [Lua API](/ref/buffer/).
+* [Condition Variable](/ref/dmConditionVariable/) - API для условной переменной независимого от платформы синхронизации mutex.
+* [ConfigFile](/ref/dmConfigFile/) - Функции доступа к файлу конфигурации. Файл конфигурации является скомпилированной версией файла game.project.
+* [Connection Pool](/ref/dmConnectionPool/) - API для пула сокетных соединений.
+* [Crypt](/ref/dmCrypt/) - API с криптографическими функциями.
+* [DNS](/ref/dmDNS/) - API с функциями DNS.
+* [Engine](/ref/dmEngine/) - API с основной функциональностью движка для получения доступа к файлам конфигурации, внутреннему веб-серверу, реестру игровых объектов и т.д.
+* [Extension](/ref/dmExtension/) - Функции для создания и управления нативными библиотеками расширений движка.
+* [Game Object](/ref/dmGameObject/) - API для манипулирования игровыми объектами.
+* [Graphics](/ref/dmGraphics/) - Встроенные графические функции, специфичные для конкретной платформы.
+* [Hash](/ref/dmHash/) - Хеш-функции.
+* [HID](/ref/dmHid/) - API для генерации программных событий ввода.
+* [HTTP Client](/ref/dmHttpClient/) - API для взаимодействия с HTTP-клиентами.
+* [Json](/ref/dmJson/) - API для независимого от платформы парсинга json-файлов.
+* [Log](/ref/dmLog/) - Функции ведения журнала.
+* [Math](/ref/dmMath/) - API с математическими функциями.
+* [Mutex](/ref/dmMutex/) - API для независимого от платформы синхронизации mutex.
+* [SSL Socket](/ref/dmSSLSocket/) - API для функций защищенных сокетов.
+* [Script](/ref/dmScript/) - Встроенные функции для создание скриптов.
+* [Socket](/ref/dmSocket/) - API для функций сокетов.
+* [String Functions](/ref/dmStringFunc/) - API для манипуляций со строками.
+* [Thread](/ref/dmThread/) - API для создания потоков.
+* [Time](/ref/dmTime/) - API для универсального времени и функций времени.
+* [URI](/ref/dmURI/) - API для манипуляций с URI.
+* [Web Server](/ref/dmWebServer/) - API для простого высокоуровневого однопоточного веб-сервера, основанного на dmHttpServer.
+* [Shared Library](/ref/sharedlibrary/) - Утилитные функции для экспорта/импорта общих библиотек.
+* [Sony vector Math Library](../assets/Vector_Math_Library-Overview.pdf) - Библиотека Sony Vector Math в основном предоставляет функции, используемые в трехмерной графике для трехмерных и четырехмерных векторных операций, матричных операций и операций с кватернионами.
+
+Если вам нужен заголовочный файл `dmsdk/sdk.h` для кода в выбранном вами редакторе, его можно найти [здесь в основном репозитории GitHub для Defold](https://github.com/defold/defold/blob/dev/engine/sdk/src/dmsdk/sdk.h) с [заголовочными файлами для отдельных пространств имен](https://github.com/defold/defold/tree/dev/engine/dlib/src/dmsdk/dlib).

+ 57 - 0
docs/ru/manuals/extensions-details.md

@@ -0,0 +1,57 @@
+---
+title: Нативные расширения - Подробнее
+brief: В этом руководстве описаны некоторые подробности о системе сборки, используемой для нативных расширений.
+---
+
+# Настройка сборки для Defold
+
+Здесь мы приводим некоторые важные сведения о сборке, чтобы максимально упростить интеграцию с вашими расширениями.
+
+Вот некоторые моменты, которые следует учитывать при создании расширения для движка Defold. Для получения более общих рекомендаций по разработке кроссплатформенного нативного кода, а также расширений/Lua APIs, пожалуйста, обратитесь к [Нативные Расширения - Лучшие Практики](/manuals/extensions-best-practices).
+
+## C++ версия
+
+В самом движке мы не используем C++ версии выше C++98. Хотя вы можете использовать более высокую версию для создания своего расширения, имейте в виду, что более высокая версия может содержать изменения ABI. Это может сделать невозможным использование вашего расширения в сочетании с другими расширениями в движке или в хранилище ассетов.
+
+При создании библиотек (например, расширений) полезно придерживаться наименьшего целевого знаменателя.
+
+## Toolchain
+
+### Версии SDK
+
+Для получения наиболее точного списка версий проверьте с помощью [build.py](./scripts/build.py).
+
+* Android: NDK 20r, Build Tools 23.0.2, Api Level 16 for armv7 and Api level 21 for arm64
+* iOS: iPhoneOS13.5.sdk
+* macOS: MacOSX10.15.sdk
+* Windows: WindowsKits 10.0, Microsoft Visual Studio 2019
+* Linux: Ubuntu 16.04, clang 9, libssl-dev, uuid-dev, libxi-dev, libopenal-dev, libgl1-mesa-dev, libglw1-mesa-dev, freeglut3-dev
+* Html5: Emscripten 1.39.16
+
+### C++ версия + ABI совместимость
+
+* Linux: `clang 9`
+* Android:`clang` using `NDK r20`
+* Html5: `Emscripten 1.39.16`
+* Win32: `Microsoft Visual Studio 2019` (`clang 9` on build server)
+* iOS/macOS: `apple-clang` (`clang 9` on build server)
+
+Для iOS/macOS мы используем `-miphoneos-version-min=9.0` и `-mmacosx-version-min=10.7` соответственно.
+
+Мы не указываем конкретную версию C++, поэтому используем версию по умолчанию каждого компилятора.
+
+## Win32 + Clang
+
+Недавнее дополнение - возможность собирать сборки для Windows с помощью clang.
+Это позволяет ускорить сборку на наших серверах, а также оптимизировать наши сборки.
+
+## Статическая связка
+
+Пользовательский движок построен с использованием статической связки.
+Основная причина заключается в том, что на iOS версии < 8 несколько исполняемых двоичных файлов в .ipa не допускаются в App Store. 
+
+## Никаких исключений из C++
+
+Мы не используем никаких исключений в движке.
+Они обычно не используются в игровых движках, поскольку данные (в основном) известны заранее, во время разработки.
+Удаление поддержки исключений C++ уменьшает размер исполняемого файла и улучшает производительность во время выполнения.

+ 270 - 0
docs/ru/manuals/extensions-manifest-merge-tool.md

@@ -0,0 +1,270 @@
+---
+title: Нативные расширения - Инструменты Слияния Манифестов
+brief: В данном руководстве описывается работа по слиянию манифестов приложений
+---
+
+# Манифесты приложений
+
+Для некоторых платформ мы поддерживаем расширения, поставляющие фрагменты (или заглушки) манифестов приложений.
+Он может быть частью `AndroidManifest.xml`, `Info.plist` или `engine_template.html`.
+
+Каждая заглушка манифеста расширения будет применяться последовательно, начиная с базового манифеста приложения.
+Базовый манифест - это либо манифест по умолчанию (в `builtins\manifests\<platforms>\...`), либо пользовательский манифест, указанный пользователем.
+
+## Именования и Структуры
+
+Манифесты расширения должны быть помещены в определенную структуру, чтобы расширение функционировало по назначению.
+
+    /myextension
+        ext.manifest
+        /manifests
+            /android
+                AndroidManifest.xml
+            /ios
+                Info.plist
+            /osx
+                Info.plist
+            /web
+                engine_template.html
+
+
+## Android
+
+Платформа Android уже имеет инструмент слияния манифестов (основанный на `ManifestMerger2`), и мы используем его внутри `bob.jar` для слияния манифестов.
+Для получения полного набора инструкций по изменению манифестов Android, пожалуйста, обратитесь к [документации](https://developer.android.com/studio/build/manifest-merge)
+
+::: important
+Если вы не установите `android:targetSdkVersion` в манифесте расширения, следующие разрешения, они будут добавлены автоматически: `WRITE_EXTERNAL_STORAGE`, `READ_PHONE_STATE`, `READ_EXTERNAL_STORAGE`. Подробнее об этом можно прочитать в официальной [документации](https://developer.android.com/studio/build/manifest-merge#implicit_system_permissions).
+Мы рекомендуем использовать: `<uses-sdk android:targetSdkVersion=“{{android.target_sdk_version}}” />`
+:::
+### Пример
+
+Базовый манифест:
+
+```xml
+    <?xml version='1.0' encoding='utf-8'?>
+    <manifest xmlns:android='http://schemas.android.com/apk/res/android'
+            package='com.defold.testmerge'
+            android:versionCode='14'
+            android:versionName='1.0'
+            android:installLocation='auto'>
+        <uses-feature android:required='true' android:glEsVersion='0x00020000' />
+        <uses-sdk android:minSdkVersion='9' android:targetSdkVersion='26' />
+        <application android:label='Test Project' android:hasCode='true'>
+        </application>
+        <uses-permission android:name='android.permission.VIBRATE' />
+    </manifest>
+```
+
+Манифест расширения:
+
+```xml
+    <?xml version='1.0' encoding='utf-8'?>
+    <manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.defold.testmerge'>
+         <uses-sdk android:targetSdkVersion=“{{android.target_sdk_version}}” />
+        <uses-feature android:required='true' android:glEsVersion='0x00030000' />
+        <application>
+            <meta-data android:name='com.facebook.sdk.ApplicationName'
+                android:value='Test Project' />
+            <activity android:name='com.facebook.FacebookActivity'
+              android:theme='@android:style/Theme.Translucent.NoTitleBar'
+              android:configChanges='keyboard|keyboardHidden|screenLayout|screenSize|orientation'
+              android:label='Test Project' />
+        </application>
+    </manifest>
+```
+
+Результат:
+
+```xml
+    <?xml version='1.0' encoding='utf-8'?>
+    <manifest xmlns:android='http://schemas.android.com/apk/res/android'
+        package='com.defold.testmerge'
+        android:installLocation='auto'
+        android:versionCode='14'
+        android:versionName='1.0' >
+        <uses-sdk
+            android:minSdkVersion='9'
+            android:targetSdkVersion='26' />
+        <uses-permission android:name='android.permission.VIBRATE' />
+        <uses-feature
+            android:glEsVersion='0x00030000'
+            android:required='true' />
+        <application
+            android:hasCode='true'
+            android:label='Test Project' >
+            <meta-data
+                android:name='com.facebook.sdk.ApplicationName'
+                android:value='Test Project' />
+            <activity
+                android:name='com.facebook.FacebookActivity'
+                android:configChanges='keyboard|keyboardHidden|screenLayout|screenSize|orientation'
+                android:label='Test Project'
+                android:theme='@android:style/Theme.Translucent.NoTitleBar' />
+        </application>
+    </manifest>
+```
+
+## iOS / macOS
+
+Для `Info.plist` мы используем нашу собственную реализацию для объединения двух списков свойств.
+Они могут работать со списками и словарями.
+
+### Пример
+
+Базовый манифест:
+
+```xml
+    <?xml version='1.0' encoding='UTF-8'?>
+    <!DOCTYPE plist PUBLIC '-//Apple//DTD PLIST 1.0//EN' 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>
+    <plist version='1.0'>
+    <dict>
+            <key>NSAppTransportSecurity</key>
+            <dict>
+                <key>NSExceptionDomains</key>
+                <dict>
+                    <key>foobar.net</key>
+                    <dict>
+                        <key>testproperty</key>
+                        <true/>
+                    </dict>
+                </dict>
+            </dict>
+            <key>INT</key>
+            <integer>8</integer>
+            <key>REAL</key>
+            <real>8.0</real>
+            <key>BASE64</key>
+            <data>SEVMTE8gV09STEQ=</data>
+    </dict>
+    </plist>
+```
+
+Манифест расширения:
+
+```xml
+    <?xml version='1.0' encoding='UTF-8'?>
+    <!DOCTYPE plist PUBLIC '-//Apple//DTD PLIST 1.0//EN' 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>
+    <plist version='1.0'>
+    <dict>
+        <key>NSAppTransportSecurity</key>
+        <dict>
+            <key>NSExceptionDomains</key>
+            <dict>
+                <key>facebook.com</key>
+                <dict>
+                    <key>NSIncludesSubdomains</key>
+                    <true/>
+                    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+                    <false/>
+                </dict>
+            </dict>
+        </dict>
+        <key>INT</key>
+        <integer>42</integer>
+    </dict>
+    </plist>
+```
+
+Результат:
+
+```xml
+    <?xml version='1.0'?>
+    <!DOCTYPE plist SYSTEM 'file://localhost/System/Library/DTDs/PropertyList.dtd'>
+    <plist version='1.0'>
+        <dict>
+            <key>NSAppTransportSecurity</key>
+            <dict>
+                <key>NSExceptionDomains</key>
+                <dict>
+                    <key>foobar.net</key>
+                    <dict>
+                        <key>testproperty</key>
+                        <true/>
+                    </dict>
+                    <key>facebook.com</key>
+                    <dict>
+                        <key>NSIncludesSubdomains</key>
+                        <true/>
+                        <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
+                        <false/>
+                    </dict>
+                </dict>
+            </dict>
+            <key>INT</key>
+            <integer>8</integer>
+            <key>REAL</key>
+            <real>8.0</real>
+            <key>BASE64</key>
+            <data>SEVMTE8gV09STEQ=</data>
+            <key>INT</key>
+            <integer>42</integer>
+        </dict>
+    </plist>
+```
+
+
+## HTML5
+
+Для html-шаблона мы дали название каждому разделу, чтобы можно было их сопоставить (например, "engine-start").
+Вы можете указать атрибуты `merge` или `keep`. По умолчанию используется `merge`.
+
+### Пример
+
+Базовый манифест:
+
+```html
+    <!DOCTYPE html>
+    <html>
+    <body>
+     <script id='engine-loader' type='text/javascript' src='dmloader.js'></script>
+     <script id='engine-setup' type='text/javascript'>
+     function load_engine() {
+         var engineJS = document.createElement('script');
+         engineJS.type = 'text/javascript';
+         engineJS.src = '{{exe-name}}_wasm.js';
+         document.head.appendChild(engineJS);
+     }
+     </script>
+     <script id='engine-start' type='text/javascript'>
+         load_engine();
+     </script>
+    </body>
+    </html>
+```
+
+Манифест расширения:
+
+```html
+    <html>
+    <body>
+     <script id='engine-loader' type='text/javascript' src='mydmloader.js'></script>
+     <script id='engine-start' type='text/javascript' merge='keep'>
+         my_load_engine();
+     </script>
+    </body>
+    </html>
+```
+
+Результат:
+
+```html
+    <!doctype html>
+    <html>
+    <head></head>
+    <body>
+        <script id='engine-loader' type='text/javascript' src='mydmloader.js'></script>
+        <script id='engine-setup' type='text/javascript'>
+            function load_engine() {
+                var engineJSdocument.createElement('script');
+                engineJS.type = 'text/javascript';
+                engineJS.src = '{{exe-name}}_wasm.js';
+                document.head.appendChild(engineJS);
+            }
+        </script>
+        <script id='engine-start' type='text/javascript' merge='keep'>
+            my_load_engine(
+        </script>
+    </body>
+    </html>
+```

+ 54 - 0
docs/ru/manuals/extensions-script-api.md

@@ -0,0 +1,54 @@
+---
+title: Добавление автозаполнения редактора в нативные расширения
+brief: В этом руководстве объясняется, как создать определение API сценария, чтобы редактор Defold мог обеспечить автозаполнение для пользовательских расширения.
+---
+
+# Автозаполнение для нативных расширений
+
+Редактор Defold обеспечивает автоматическое заполнение предложений для всех функций API Defold и генерирует предложения для модулей Lua, необходимых для ваших скриптов. Однако редактор не может автоматически предоставлять предложения по автозаполнению для функций, предоставляемых родными расширениями. Родное расширение может предоставить определение API в отдельном файле, чтобы обеспечить автоматическое заполнение предложений также для API расширения
+
+
+## Создание определения API в скрипте
+
+Файл определения API скрипта имеет расширение `.script_api`. Он должен быть в формате [YAML](https://yaml.org/) и находиться вместе с файлами расширения. Ожидаемый формат определения API скрипта следующий:
+
+```yml
+- name: The name of the extension
+  type: table
+  desc: Extension description
+  members:
+  - name: Name of the first member
+    type: Member type
+    desc: Member description
+    # если тип члена - "function"
+    parameters:
+    - name: Name of the first parameter
+      type: Parameter type
+      desc: Parameter description
+    - name: Name of the second parameter
+      type: Parameter type
+      desc: Parameter description
+    # если тип члена - "function"
+    returns:
+    - name: Name of first return value
+      type: Return value type
+      desc: Return value description
+    examples:
+    - desc: First example of member usage
+    - desc: Second example of member usage
+
+  - name: Name of the second member
+    ...
+```
+
+Типы могут быть любыми из `table, string, boolean, number, function`. Если значение может иметь несколько типов, оно записывается как `[type1, type2, type3]`.
+:::sidenote
+В настоящее время типы не отображаются в редакторе. Рекомендуется все же предоставить их, чтобы они были доступны, когда редактор будет поддерживать отображение информации о типах.
+:::
+
+## Примеры
+
+Примеры использования приведены в следующих проектах:
+
+* [Расширение для Facebook](https://github.com/defold/extension-facebook/tree/master/facebook/api)
+* [Расширение для WebView](https://github.com/defold/extension-webview/blob/master/webview/api/webview.script_api)

+ 284 - 0
docs/ru/manuals/extensions.md

@@ -0,0 +1,284 @@
+---
+title: Написание нативных расширений для Defold
+brief: Это руководство объясняет, как написать нативное расширение для игрового движка Defold и как скомпилировать его с помощью облачного конструктора с нулевой настройкой.
+---
+
+# Нативные расширения
+
+Если вам необходимо пользовательское взаимодействие с внешним программным или аппаратным обеспечением на низком уровне, где Lua недостаточно, Defold SDK позволяет писать расширения для движка на C, C++, Objective C, Java или Javascript, в зависимости от целевой платформы. Типичными случаями использования нативных расширений являются:
+
+- Взаимодействие с конкретным оборудованием, например, с камерой на мобильных телефонах.
+- Взаимодействие с внешними API низкого уровня, например, API рекламной сети, которые не позволяют взаимодействовать через сетевые API, где можно было бы использовать Luasocket.
+- Высокопроизводительные вычисления и обработка данных.
+
+## Платформа для сборки
+
+Defold предоставляет точку входа для нативных расширений с нулевой настройкой и облачным решением для сборки. Любое нативное расширение, разработанное и добавленное в игровой проект, либо напрямую, либо через [Library Project](/manuals/libraries/), становится частью содержимого проекта. Нет необходимости создавать специальные версии движка и распространять их среди членов команды, это происходит автоматически - любой член команды, который собирает и запускает проект, получит исполняемый файл движка для конкретного проекта со всеми встроенными расширениями.
+
+![Облачная сборка](images/extensions/cloud_build.png)
+
+## Планировка проекта
+
+Чтобы создать новое расширение, создайте папку в корне проекта. Эта папка будет содержать все настройки, исходный код, библиотеки и ресурсы, связанные с расширением. Конструктор расширений распознает структуру папок и соберет все исходные файлы и библиотеки.
+
+```
+ myextension/
+ │
+ ├── ext.manifest
+ │
+ ├── src/
+ │
+ ├── include/
+ │
+ ├── lib/
+ │   └──[platforms]
+ │
+ ├── manifests/
+ │   └──[platforms]
+ │
+ └── res/
+     └──[platforms]
+
+```
+*ext.manifest*
+: Папка расширения _должна_ содержать файл *ext.manifest*. Этот файл представляет собой файл формата YAML, который подхватывается конструктором расширений. Минимальный файл манифеста должен содержать название расширения.
+
+*src*
+: Эта папка должна содержать все файлы исходного кода.
+
+*include*
+: Эта опциональная папка содержит все включаемые файлы.
+
+*lib*
+: Эта опциональная папка содержит все скомпилированные библиотеки, от которых зависит расширение. Файлы библиотек должны быть помещены в подпапки с именем `platform`, или `architecure-platform`, в зависимости от того, какие архитектуры поддерживаются вашими библиотеками.
+
+  :[platforms](../shared/platforms.md)
+
+*manifests*
+: Эта опциональная папка содержит дополнительные файлы, используемые в процессе сборки или комплектации. Подробнее см. ниже.
+
+*res*
+: Эта опциональная папка содержит любые дополнительные ресурсы, от которых зависит расширение. Файлы ресурсов должны быть помещены в подпапки, названные по `platform`, или `architecure-platform`, как и подпапки "lib". Также допускается подпапка `common`, содержащая файлы ресурсов, общие для всех платформ.
+
+### Файлы манифеста
+
+Опциональная папка *manifests* расширения содержит дополнительные файлы, используемые в процессе сборки и комплектации. Файлы должны быть помещены во вложенные папки, названные по `платформе`:
+
+* `android` - В эту папку помещается файл-заглушка манифеста, который будет объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)). Папка также может содержать файл `build.gradle` с зависимостями, которые должны быть разрешены Gradle ([пример](https://github.com/defold/extension-facebook/blob/master/facebook/manifests/android/build.gradle)). Наконец, папка может также содержать ноль или более файлов ProGuard (экспериментально).
+* `ios` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
+* `osx` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
+* `web` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
+
+
+## Совместное использование расширения
+
+Расширения рассматриваются так же, как и любые другие ассеты в вашем проекте, и ими можно делиться таким же образом. Если папка нативного расширения добавлена в качестве папки библиотеки, она может быть совместно использована другими пользователями как зависимость. Для получения дополнительной информации обратитесь к руководству [Library project manual](/manuals/libraries/).
+
+
+## Простой пример расширения
+
+Давайте создадим очень простое расширение. Сначала создадим новую корневую папку *myextension* и добавим в нее файл *ext.manifest*, содержащий имя расширения "MyExtension". Обратите внимание, что имя является символом C++ и должно совпадать с первым аргументом `DM_DECLARE_EXTENSION` (см. ниже).
+
+![Манифест](images/extensions/manifest.png)
+
+```yaml
+# C++ symbol in your extension
+name: "MyExtension"
+```
+
+Расширение состоит из одного файла C++, *myextension.cpp*, который создается в папке "src".
+
+![C++ файл](images/extensions/cppfile.png)
+
+Исходный файл расширения содержит следующий код:
+
+```cpp
+// myextension.cpp
+// Определения расширения lib
+#define LIB_NAME "MyExtension"
+#define MODULE_NAME "myextension"
+
+// включаем Defold SDK
+#include <dmsdk/sdk.h>
+
+static int Reverse(lua_State* L)
+{
+    // Количество ожидаемых элементов в стеке Lua после того, 
+    // как эта структура выйдет из области видимости
+    DM_LUA_STACK_CHECK(L, 1);
+
+    // Проверка и получение строки параметра из стека
+    char* str = (char*)luaL_checkstring(L, 1);
+
+    // Развернем строку
+    int len = strlen(str);
+    for(int i = 0; i < len / 2; i++) {
+        const char a = str[i];
+        const char b = str[len - i - 1];
+        str[i] = b;
+        str[len - i - 1] = a;
+    }
+
+    // Поместим развернутую строку в стек
+    lua_pushstring(L, str);
+
+    // Вернем значение 1
+    return 1;
+}
+
+// Функции, открытые для Lua
+static const luaL_reg Module_methods[] =
+{
+    {"reverse", Reverse},
+    {0, 0}
+};
+
+static void LuaInit(lua_State* L)
+{
+    int top = lua_gettop(L);
+
+    // Регистрация имен Lua
+    luaL_register(L, MODULE_NAME, Module_methods);
+
+    lua_pop(L, 1);
+    assert(top == lua_gettop(L));
+}
+
+dmExtension::Result AppInitializeMyExtension(dmExtension::AppParams* params)
+{
+    return dmExtension::RESULT_OK;
+}
+
+dmExtension::Result InitializeMyExtension(dmExtension::Params* params)
+{
+    // Инициализация Lua
+    LuaInit(params->m_L);
+    printf("Registered %s Extension\n", MODULE_NAME);
+    return dmExtension::RESULT_OK;
+}
+
+dmExtension::Result AppFinalizeMyExtension(dmExtension::AppParams* params)
+{
+    return dmExtension::RESULT_OK;
+}
+
+dmExtension::Result FinalizeMyExtension(dmExtension::Params* params)
+{
+    return dmExtension::RESULT_OK;
+}
+
+
+// Defold SDK использует макрос для установки точек входа расширения:
+//
+// DM_DECLARE_EXTENSION(symbol, name, app_init, app_final, init, update, on_event, final)
+
+// MyExtension это символ C++, который содержит все соответствующие данные расширения.
+// Он должно совпадать с полем имени в `ext.manifest`
+DM_DECLARE_EXTENSION(MyExtension, LIB_NAME, AppInitializeMyExtension, AppFinalizeMyExtension, InitializeMyExtension, 0, 0, FinalizeMyExtension)
+```
+
+Обратите внимание на макрос `DM_DECLARE_EXTENSION`, который используется для объявления различных точек входа в код расширения. Первый аргумент `символ` должен соответствовать имени, указанному в *ext.manifest*. Для этого простого примера нет необходимости в точках входа "update" или "on_event", поэтому в этих местах макросу присваивается `0`.
+
+Теперь осталось только создать проект (<kbd>Project ▸ Build and Launch</kbd>). Это загрузит расширение в конструктор расширений, который запустит движок с включенным в него новым расширением. Если сборщик столкнется с какими-либо ошибками, появится диалог с ошибками сборки.
+
+Чтобы протестировать расширение, создайте игровой объект и добавьте компонент скрипта с некоторым тестовым кодом:
+
+```lua
+local s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+local reverse_s = myextension.reverse(s)
+print(reverse_s) --> ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba
+```
+
+Вот и все! Мы создали полностью работающее нативное расширение.
+
+
+## Жизненный цикл расширения
+
+Как мы видели выше, макрос `DM_DECLARE_EXTENSION` используется для объявления различных точек входа в код расширения:
+
+`DM_DECLARE_EXTENSION(symbol, name, app_init, app_final, init, update, on_event, final)`
+
+Точки входа позволят вам запускать код в различных точках жизненного цикла расширения:
+
+* Запуск движка
+  * Запуск систем движка
+  * Расширение `app_init`
+  * Расширение `init` - Все API Defold были инициализированы. Это рекомендуемый момент жизненного цикла расширения, когда создаются привязки Lua к коду расширения.
+  * Запуск скрипта - Вызываются функции `init()` файлов скриптов.
+* Цикл движка
+  * Обновление движка
+    * Расширение `update`
+    * Обновление скрипта - Вызывается функция `update()` файлов скриптов.
+  * События движка (window minimize/maximize etc)
+    * Расширение `on_event`
+* Выключение движка (или перезагрузка)
+  * Завершения скрипта - Вызывается функция `final()` файлов скриптов.
+  * Расширение `final`
+  * Расширение `app_final`
+
+## Определенные идентификаторы платформы
+
+Следующие идентификаторы определяются разработчиком на каждой соответствующей платформе:
+
+* DM_PLATFORM_WINDOWS
+* DM_PLATFORM_OSX
+* DM_PLATFORM_IOS
+* DM_PLATFORM_ANDROID
+* DM_PLATFORM_LINUX
+* DM_PLATFORM_HTML5
+
+## Построение журналов сервера
+
+Журналы сервера сборки доступны, если проект использует нативные расширения. Журнал сервера сборки (`log.txt`) загружается вместе с движком при сборке проекта и хранится в файле `.internal/%platform%/build.zip`, а также распаковывается в папку сборки вашего проекта.
+
+## Файл ext.manifest
+
+Помимо названия расширения, файл манифеста может содержать флаги компиляции для конкретной платформы, флаги компоновки, библиотеки и фреймворки. Если файл *ext.manifest* не содержит сегмента "platforms", или платформа отсутствует в списке, платформа, для которой вы собираете пакет, будет собрана, но без дополнительных флагов.
+
+Вот пример:
+
+```yaml
+name: "AdExtension"
+
+platforms:
+    arm64-ios:
+        context:
+            frameworks: ["CoreGraphics", "CFNetwork", "GLKit", "CoreMotion", "MessageUI", "MediaPlayer", "StoreKit", "MobileCoreServices", "AdSupport", "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreMotion", "CoreTelephony", "CoreVideo", "Foundation", "GLKit", "JavaScriptCore", "MediaPlayer", "MessageUI", "MobileCoreServices", "OpenGLES", "SafariServices", "StoreKit", "SystemConfiguration", "UIKit", "WebKit"]
+            flags:      ["-stdlib=libc++"]
+            linkFlags:  ["-ObjC"]
+            libs:       ["z", "c++", "sqlite3"]
+            defines:    ["MY_DEFINE"]
+
+    armv7-ios:
+        context:
+            frameworks: ["CoreGraphics", "CFNetwork", "GLKit", "CoreMotion", "MessageUI", "MediaPlayer", "StoreKit", "MobileCoreServices", "AdSupport", "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreMotion", "CoreTelephony", "CoreVideo", "Foundation", "GLKit", "JavaScriptCore", "MediaPlayer", "MessageUI", "MobileCoreServices", "OpenGLES", "SafariServices", "StoreKit", "SystemConfiguration", "UIKit", "WebKit"]
+            flags:      ["-stdlib=libc++"]
+            linkFlags:  ["-ObjC"]
+            libs:       ["z", "c++", "sqlite3"]
+            defines:    ["MY_DEFINE"]
+```
+
+### Разрешенные ключи
+
+Допустимыми ключами для компиляционных флагов, специфичных для конкретной платформы, являются:
+
+* `frameworks` - Фреймворки Apple, которые необходимые для сборки (iOS и OSX)
+* `flags` - Флаги, которые должны быть переданы компилятору
+* `linkFlags` - Флаги, которые должны быть переданы компоновщику
+* `libs` - Библиотеки, необходимые включения при компоновке
+* `defines` - Определения установки при сборке
+* `aaptExtraPackages` - Отдельное имя пакета, которое должно быть сгенерировано (Android)
+* `aaptExcludePackages` - Регулярные выражения (или точные названия) пакетов для исключения (Android
+* `aaptExcludeResourceDirs` - Регулярные выражения (или точные названия) каталоги ресурсов для исключения (Android)
+
+## Примеры расширений
+
+* [Базовый пример расширения](https://github.com/defold/template-native-extension) (the extension from this manual)
+* [Пример расширения для Android](https://github.com/defold/extension-android)
+* [Пример расширения для HTML5](https://github.com/defold/extension-html5)
+* [Расширение видеоплеера для macOS, iOS и Android](https://github.com/defold/extension-videoplayer)
+* [Расширение камеры для macOS и iOS](https://github.com/defold/extension-camera)
+* [Расширение покупок внутри приложения для iOS и Android](https://github.com/defold/extension-iap)
+* [Расширение Firebase Analytics для iOS и Android](https://github.com/defold/extension-firebase-analytics)
+
+[Портал ассетов в Defold](https://www.defold.com/assets/), также содержит много нативных расширений.

+ 99 - 0
docs/ru/manuals/getting-help.md

@@ -0,0 +1,99 @@
+---
+title: Как получить помощь
+brief: В этом руководстве описано, как получить помощь, если вы столкнулись с проблемой при использовании Defold.
+---
+
+# Получение помощи
+
+Если вы столкнулись с проблемой при использовании Defold, мы хотели бы услышать от вас, чтобы мы могли исправить проблему и/или помочь вам решить ее! Существует несколько способов обсудить проблемы, а также сообщить о них. Выберите тот способ, который подходит вам больше всего:
+
+## Решение проблемы на форуме
+
+Хороший способ обсудить проблему и получить помощь - задать вопрос на нашем [форуме](https://forum.defold.com). Разместите в категориях [Вопросы](https://forum.defold.com/c/questions) или в [Ошибки](https://forum.defold.com/c/bugs), в зависимости от типа вашей проблемы. Пользуйтесь [Поиском](https://forum.defold.com/search), прежде чем задавать свой вопрос/проблему, так как, возможно, уже есть решение вашей проблемы.
+
+Если у вас несколько вопросов, создайте несколько сообщений. Не задавайте несвязанные вопросы в одном сообщении.
+
+### Необходимая информация
+Мы не сможем оказать поддержку, если вы не предоставите необходимую информацию:
+
+**Название**
+Обязательно используйте короткое и описательное название. Хорошим заголовком будет "Как переместить игровой объект в направлении его поворота?" или "Как погасить спрайт?". Плохим заголовком будет "Мне нужна помощь в использовании Defold!" или "Моя игра не работает!".
+
+**Опишите ошибку (ОБЯЗАТЕЛЬНО)**
+Четкое и краткое описание того, что представляет собой ошибка.
+
+**Описание действий(ОБЯЗАТЕЛЬНО)**
+Воспроизведения последовательности действий:
+1. Перехожу к '...'
+2. Нажимаю на '....'
+3. Прокручиваю вниз до '....'
+4. Вижу ошибку
+
+**Ожидаемый результат (ОБЯЗАТЕЛЬНО)**
+Четкое и краткое описание того, что, как вы ожидали, должно произойти.
+
+**Версия Defold (ОБЯЗАТЕЛЬНО):**
+  - Версия [например. 1.2.155]
+
+**Платформы (ОБЯЗАТЕЛЬНО):**
+ - Платформы: [например. iOS, Android, Windows, macOS, Linux, HTML5]
+ - OS: [например. iOS 8.1, Windows 10, High Sierra]
+ - Устройство: [например. iPhone 6]
+
+**Приложение исходных файлов (ОПЦИОНАЛЬНО):**
+Пожалуйста, приложите минимальную часть содержимого проекта, в котором воспроизводится ошибка. Это очень поможет человеку, пытающемуся исследовать и исправить ошибку.
+
+**Журналы (ОПЦИОНАЛЬНО):**
+Пожалуйста, предоставьте соответствующие журналы движка, редактора или сервера сборки. Узнайте, [где](#log-files) хранятся журналы.
+
+**Возможное решение (ОПЦИОНАЛЬНО):**
+Если существует предполагаемое решение, пожалуйста, опишите его здесь.
+
+**Скриншоты экрана (ОПЦИОНАЛЬНО):**
+При необходимости добавьте скриншоты, чтобы объяснить суть проблемы.
+
+**Дополнительные сведения (ОПЦИОНАЛЬНО):**
+Добавьте сюда любой другой контекст о проблеме.
+
+
+### Код совместного использования
+Когда вы делитесь кодом, рекомендуется делиться кодом в виде текста, а не в виде скриншотов. Обмен кодом в виде текста облегчает поиск, позволяет выделить ошибки, предложить и внести изменения. Делитесь кодом, вставив в него \`\`\`\` или отступив на 4 пробела.
+
+Пример:
+
+\`\`\`
+print("Hello code!")
+\`\`\`
+
+Результат:
+
+```
+print("Hello code!")
+```
+
+
+## Сообщить о проблеме редактора
+
+Редактор предоставляет удобный способ сообщения о проблемах. Выберите опцию меню <kbd>Help->Report Issue</kbd> из редактора, чтобы сообщить о проблеме.
+
+![](images/getting_help/report_issue.png)
+
+Выбор этого пункта меню приведет вас к трекеру проблем на GitHub. Предоставьте [файлы журнала](#log-files), информацию о вашей операционной системе, шаги по воспроизведению проблемы, возможные обходные пути и т.д.
+
+::: sidenote
+Для отправки сообщения об ошибке таким способом вам потребуется учетная запись на GitHub.
+:::
+
+
+## Обсудите проблему в Discord
+
+Если вы столкнулись с проблемой при использовании Defold, вы можете попробовать задать вопрос в [Discord](https://www.defold.com/discord/). Однако мы рекомендуем размещать сложные вопросы и подробные обсуждения на форуме. Также обратите внимание, что мы не принимаем сообщения об ошибках, отправленные через Discord.
+
+
+# Файлы журналов
+
+Движок, редактор и сервер сборки генерируют журнальную информацию, которая может быть очень ценной при обращении за помощью и отладке проблемы. Всегда предоставляйте файлы журналов, когда сообщаете о проблеме:
+
+* [Журналы движка](/manuals/debugging-game-and-system-logs)
+* [Журналы редактора](/manuals/editor#editor-logs)
+* [Build server logs](/manuals/extensions#build-server-logs)

+ 44 - 0
docs/ru/manuals/iac.md

@@ -0,0 +1,44 @@
+---
+title: Связь между приложениями в Defold
+brief: Связь между приложениями позволяет определять аргументы запуска, используемые при запуске приложения. В этом руководстве объясняется API Defold и весь доступный функционал.
+---
+
+# Связь между приложениями
+
+В большинстве операционных систем приложения могут быть запущены несколькими способами:
+
+* Из списка установленных приложений.
+* Из ссылки на конкретное приложение.
+* Из push-уведомления.
+* В качестве последнего шага процесса установки.
+
+В случае, когда приложение запускается по ссылке, уведомлению или при установке, можно передать дополнительные аргументы, такие как referrer или deep-link при запуске, по специфической для приложения ссылке или уведомлению. Defold предоставляет унифицированный способ получения информации о том, как приложение было вызвано с помощью встроенных расширений.
+
+## Установка расширения
+
+Чтобы начать использовать расширение Связи между приложениями, необходимо добавить его в качестве зависимости в файл `game.project`. Последняя стабильная версия доступна по URL-адресу зависимости:
+```
+https://github.com/defold/extension-iac/archive/master.zip
+```
+
+Мы рекомендуем использовать ссылку на zip-файл [конкретного выпуска](https://github.com/defold/extension-iac/releases).
+
+## Использование расширения
+
+API очень прост в использовании. Вы предоставляете расширению функцию и обратную связь слушателя.
+
+```
+local function iac_listener(self, payload, type)
+     if type == iac.TYPE_INVOCATION then
+         -- This was an invocation
+         print(payload.origin) -- origin may be empty string if it could not be resolved
+         print(payload.url)
+     end
+end
+
+function init(self)
+     iac.set_listener(iac_listener)
+end
+```
+
+Полная документация по API доступна на странице [GitHub](https://defold.github.io/extension-iac/).

二進制
docs/ru/manuals/images/editor/custom_project_templates.png


二進制
docs/ru/manuals/images/editor/editor-styling-color.png


二進制
docs/ru/manuals/images/editor/editor-styling-fonts.png


二進制
docs/ru/manuals/images/editor/preferences_code.png


二進制
docs/ru/manuals/images/editor/preferences_extensions.png


二進制
docs/ru/manuals/images/editor/preferences_general.png


二進制
docs/ru/manuals/images/graphics/component-hierarchy.png


二進制
docs/ru/manuals/images/input/actions.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/consuming.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/game.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/game_paused.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/gamepad_bindings.png


二進制
docs/ru/manuals/images/input/gamepad_setting.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/gamepads.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/input_binding.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/input_key_bindings.png


二進制
docs/ru/manuals/images/input/input_stack.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/key_bindings.png


二進制
docs/ru/manuals/images/input/marked_text.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/mouse_bindings.png


二進制
docs/ru/manuals/images/input/overview.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/proxy.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/setting.png


二進制
docs/ru/manuals/images/input/[email protected]


二進制
docs/ru/manuals/images/input/text_bindings.png


二進制
docs/ru/manuals/images/input/touch_bindings.png


二進制
docs/ru/manuals/images/nintendo-switch/register-defold.png


二進制
docs/ru/manuals/images/nintendo-switch/register-nintendo.png


+ 213 - 0
docs/ru/manuals/input-gamepads.md

@@ -0,0 +1,213 @@
+---
+title: Использование геймпада в Defold
+brief: В этом руководстве объясняется, как работает ввод с геймпада.
+---
+
+::: sidenote
+Рекомендуется ознакомиться с общим принципом работы ввода в Defold, способами получения ввода и порядком получения ввода в файлах скрипта. Узнайте больше о системе ввода в [руководстве](/manuals/input).
+:::
+
+# Геймпады
+Триггеры геймпада позволяют связать стандартный ввод геймпада с функциями игры. Для ввода данных с геймпада предусмотрены привязки для:
+
+- Левый и правый стики (направление и щелчки)
+Левый и правый цифровые пэды. Правый пэд обычно переводится как кнопки "A", "B", "X" и "Y" на контроллере Xbox и кнопки "квадрат", "круг", "треугольник" и "крест" на контроллере Playstation соответственно.
+- Левый и правый триггеры
+- Левая и правая плечевые кнопки
+- Кнопки "Start", "Back" и другие Кнопки управления
+
+![](images/input/gamepad_bindings.png)
+
+::: important
+В приведенных ниже примерах используются действия, показанные на изображении выше. Как и в случае с любым другим вводом, вы можете называть свои действия по своему усмотрению.
+:::
+
+## Цифровые кнопки
+Цифровые кнопки генерируют события нажатия, отпускания и повтора. Пример обнаружения для цифровой кнопки (нажата или отпущена):
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("gamepad_lpad_left") then
+        if action.pressed then
+            -- start moving left
+        elseif action.released then
+            -- stop moving left
+        end
+    end
+end
+```
+
+## Аналоговые стики
+Аналоговые стики генерируют непрерывные события ввода, даже, когда стик перемещается за пределы мертвой зоны, заданной в файле настроек геймпада (см. ниже). Пример определения ввода для аналогового стика:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("gamepad_lstick_down") then
+        -- left stick was moved down
+        print(action.value) -- a value between 0.0 an -1.0
+    end
+end
+```
+
+Аналоговые стики также генерируют события нажатия и отпускания при перемещении в кардинальных направлениях выше определенного порогового значения. Это позволяет использовать аналоговый стик в качестве цифрового ввода направления:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("gamepad_lstick_down") and action.pressed then
+        -- left stick was moved to its extreme down position
+    end
+end
+```
+
+## Несколько геймпадов
+Defold поддерживает несколько геймпадов через операционную систему хоста, действия устанавливают поле `gamepad` в таблице действий на номер геймпада, с которого был осуществлен ввод:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("gamepad_start") then
+        if action.gamepad == 0 then
+          -- gamepad 0 wants to join the game
+        end
+    end
+end
+```
+
+## Соеденение и разоедининение
+Привязки ввода геймпада также предоставляют две отдельные привязки с именами `Connected` и `Disconnected` для определения того, когда геймпад подключен (даже подключенный с самого начала) или отключен.
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("gamepad_connected") then
+        if action.gamepad == 0 then
+          -- gamepad 0 was connected
+        end
+    elseif action_id == hash("gamepad_dicconnected") then
+        if action.gamepad == 0 then
+          -- gamepad 0 was dicconnected
+        end
+    end
+end
+```
+
+## Нефильтрованые данные с геймпада
+(Начиная с версии 1.2.183)
+
+Привязки ввода геймпада также предоставляют отдельную привязку с именем `Raw` для передачи нефильтрованного (без примененной мертвой зоны) ввода кнопок, осей и шляп любого подключенного геймпада.
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("raw") then
+        pprint(action.gamepad_buttons)
+        pprint(action.gamepad_axis)
+        pprint(action.gamepad_hats)
+    end
+end
+```
+
+## Файл настроек геймпадов
+В Windows в настоящее время поддерживаются только контроллеры XBox 360. Чтобы подключить контроллер 360 к машине Windows, убедитесь, что он правильно настроен. См. http://www.wikihow.com/Use-Your-Xbox-360-Controller-for-Windows
+
+Для настройки входа геймпада используется отдельный файл отображения для каждого типа аппаратного геймпада. Сопоставления геймпадов для конкретных аппаратных геймпадов задаются в файле *gamepads*. Defold поставляется со встроенным файлом gamepads с настройками для обычных геймпадов:
+
+![Настройки геймпада](images/input/gamepads.png){srcset="images/input/[email protected] 2x"}
+
+Если вам нужно создать новый файл настроек геймпада, у нас есть простой инструмент, который поможет вам в этом:
+
+[Скачать gdc.zip](https://forum.defold.com/t/big-thread-of-gamepad-testing/56032).
+
+Он включает двоичные файлы для Windows, Linux и macOS. Запустите его из командной строки:
+
+```sh
+./gdc
+```
+
+Инструмент попросит вас нажать различные кнопки на подключенном контроллере. Затем он выведет новый файл gamepads с правильными отображениями для вашего контроллера. Сохраните новый файл или объедините его с существующим файлом gamepads, затем обновите настройки в "game.project":
+
+![Настройки геймпада](images/input/gamepad_setting.png){srcset="images/input/[email protected] 2x"}
+
+### Неопознанные геймпады
+(Начиная с версии 1.2.186)
+
+Если геймпад подключен и для него не существует отображения, геймпад будет генерировать только действия "подключен", "отключен" и "сырой". В этом случае вам необходимо вручную сопоставить необработанные данные геймпада с действиями в вашей игре.
+
+## Геймпады в HTML5
+Геймпады поддерживаются в сборках HTML5 и генерируют те же события ввода, что и на других платформах. Поддержка геймпадов основана на [Gamepad API](https://www.w3.org/TR/gamepad/), который поддерживается в большинстве браузеров (см. таблицу поддержки](https://caniuse.com/?search=gamepad)). Если браузер не поддерживает Gamepad API, Defold будет молча игнорировать любые триггеры геймпада в вашем проекте. Вы можете проверить, поддерживает ли браузер Gamepad API, проверив, существует ли функция `getGamepads` для объекта `navigator`:
+
+```lua
+local function supports_gamepads()
+    return not html5 or (html5.run('typeof navigator.getGamepads === "function"') == "true")
+end
+
+if supports_gamepads() then
+    print("Platform supports gamepads")
+end
+```
+
+Если ваша игра запускается внутри `iframe`, вы также должны убедиться, что в `iframe` добавлено разрешение `gamepad`:
+
+```html
+<iframe allow="gamepad"></iframe>
+```
+
+## Геймпады на Android
+(Начиная с версии 1.2.183)
+
+Геймпады поддерживаются в сборках Android и генерируют те же события ввода, что и на других платформах. Поддержка геймпадов основана на [Android input system for key and motion events](https://developer.android.com/training/game-controllers/controller-input). Входные события Android будут переведены в события геймпада Defold с помощью того же файла *gamepad*, как описано выше.
+
+При добавлении дополнительных привязок для геймпада на Android вы можете использовать следующие таблицы поиска для перевода событий ввода Android в значения файлов *gamepad*:
+
+| Событие клавиши с кнопки    | Индекс | Версия  |
+|-----------------------------|--------|---------|
+| AKEYCODE_BUTTON_A           | 0      | 1.2.183 |
+| AKEYCODE_BUTTON_B           | 1      | 1.2.183 |
+| AKEYCODE_BUTTON_C           | 2      | 1.2.183 |
+| AKEYCODE_BUTTON_X           | 3      | 1.2.183 |
+| AKEYCODE_BUTTON_L1          | 4      | 1.2.183 |
+| AKEYCODE_BUTTON_R1          | 5      | 1.2.183 |
+| AKEYCODE_BUTTON_Y           | 6      | 1.2.183 |
+| AKEYCODE_BUTTON_Z           | 7      | 1.2.183 |
+| AKEYCODE_BUTTON_L2          | 8      | 1.2.183 |
+| AKEYCODE_BUTTON_R2          | 9      | 1.2.183 |
+| AKEYCODE_DPAD_CENTER        | 10     | 1.2.183 |
+| AKEYCODE_DPAD_DOWN          | 11     | 1.2.183 |
+| AKEYCODE_DPAD_LEFT          | 12     | 1.2.183 |
+| AKEYCODE_DPAD_RIGHT         | 13     | 1.2.183 |
+| AKEYCODE_DPAD_UP            | 14     | 1.2.183 |
+| AKEYCODE_BUTTON_START       | 15     | 1.2.183 |
+| AKEYCODE_BUTTON_SELECT      | 16     | 1.2.183 |
+| AKEYCODE_BUTTON_THUMBL      | 17     | 1.2.183 |
+| AKEYCODE_BUTTON_THUMBR      | 18     | 1.2.183 |
+| AKEYCODE_BUTTON_MODE        | 19     | 1.2.183 |
+| AKEYCODE_BUTTON_1           | 20     | 1.2.186 |
+| AKEYCODE_BUTTON_2           | 21     | 1.2.186 |
+| AKEYCODE_BUTTON_3           | 22     | 1.2.186 |
+| AKEYCODE_BUTTON_4           | 23     | 1.2.186 |
+| AKEYCODE_BUTTON_5           | 24     | 1.2.186 |
+| AKEYCODE_BUTTON_6           | 25     | 1.2.186 |
+| AKEYCODE_BUTTON_7           | 26     | 1.2.186 |
+| AKEYCODE_BUTTON_8           | 27     | 1.2.186 |
+| AKEYCODE_BUTTON_9           | 28     | 1.2.186 |
+| AKEYCODE_BUTTON_10          | 29     | 1.2.186 |
+| AKEYCODE_BUTTON_11          | 30     | 1.2.186 |
+| AKEYCODE_BUTTON_12          | 31     | 1.2.186 |
+| AKEYCODE_BUTTON_13          | 32     | 1.2.186 |
+| AKEYCODE_BUTTON_14          | 33     | 1.2.186 |
+| AKEYCODE_BUTTON_15          | 34     | 1.2.186 |
+| AKEYCODE_BUTTON_16          | 35     | 1.2.186 |
+
+([Определения клавишных событий Android](https://developer.android.com/ndk/reference/group/input#group___input_1gafccd240f973cf154952fb917c9209719))
+
+| Событие движения с оси      | Индекс |
+|-----------------------------|--------|
+| AMOTION_EVENT_AXIS_X        | 0      |
+| AMOTION_EVENT_AXIS_Y        | 1      |
+| AMOTION_EVENT_AXIS_Z        | 2      |
+| AMOTION_EVENT_AXIS_RZ       | 3      |
+| AMOTION_EVENT_AXIS_LTRIGGER | 4      |
+| AMOTION_EVENT_AXIS_RTRIGGER | 5      |
+| AMOTION_EVENT_AXIS_HAT_X    | 6      |
+| AMOTION_EVENT_AXIS_HAT_Y    | 7      |
+
+([Определения событий движения Android](https://developer.android.com/ndk/reference/group/input#group___input_1ga157d5577a5b2f5986037d0d09c7dc77d))
+
+Используйте эту таблицу поиска в сочетании с приложением для тестирования геймпада из Google Play Store, чтобы выяснить, к какому событию привязана каждая кнопка на вашем геймпаде.

+ 53 - 0
docs/ru/manuals/input-key-and-text.md

@@ -0,0 +1,53 @@
+---
+title: Ввод клавиш и текста в Defold
+brief: В этом руководстве объясняется, как работает ввод клавиш и текста.
+---
+
+::: sidenote
+Рекомендуется ознакомиться с общим принципом работы ввода в Defold, способами получения ввода и порядком получения ввода в файлах сценария. Узнайте больше о системе ввода в [руководстве](/manuals/input).
+:::
+
+# Клавишные триггеры
+Клавишные триггеры позволяют привязать ввод одной клавиши клавиатуры к игровым действиям. Каждая клавиша отдельно привязывается к соответствующему действию. Клавишные триггеры используются для привязки определенных кнопок к определенным функциям, например, для перемещения персонажа с помощью стрелок или клавиш WASD. Если вам нужно считать произвольный ввод с клавиатуры, используйте текстовые триггеры (см. ниже).
+
+![](images/input/key_bindings.png)
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("left") then
+        if action.pressed then
+            -- start moving left
+        elseif action.released then
+            -- stop moving left
+        end
+    end
+end
+```
+
+# Текстовые триггеры
+Текстовые триггеры используются для считывания произвольного текстового ввода. Существует два типа текстовых триггеров: текст и маркированный текст.
+
+![](images/input/text_bindings.png)
+
+## Функция Text
+Функция `text` захватывает обычный текстовый ввод. Он устанавливает поле `text` таблицы действий в строку, содержащую введенный символ. Действие выполняется только при нажатии кнопки, никаких действий `отпустить` или `повторить` не посылается.
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("text") then
+        -- Concatenate the typed character to the "user" node...
+        local node = gui.get_node("user")
+        local name = gui.get_text(node)
+        name = name .. action.text
+        gui.set_text(node, name)
+    end
+end
+```
+
+## Маркированный текст
+Функция `marked-text` используется в основном для азиатских клавиатур, где несколько нажатий клавиш могут соответствовать одному вводу. Например, в клавиатуре iOS "Japanese-Kana" пользователь может набирать комбинации, и в верхней части клавиатуры будут отображаться доступные символы или последовательности символов, которые можно ввести.
+
+![Ввод маркированного текста](images/input/marked_text.png){srcset="images/input/[email protected] 2x"}
+
+- Каждое нажатие клавиши генерирует отдельное действие и устанавливает поле действия `text` в текущую введенную последовательность символов ("маркированный текст").
+- Когда пользователь выбирает символ или комбинацию символов, отправляется отдельное триггерное действие типа `text` (при условии, что оно установлено в списке привязки ввода). Отдельное действие устанавливает поле действия `text` в конечную последовательность символов.

+ 121 - 0
docs/ru/manuals/input-mouse-and-touch.md

@@ -0,0 +1,121 @@
+---
+title: Сенсорный и ввод с мыши в Defold
+brief: В этом руководстве объясняется, как работают мышь и сенсорный ввод.
+---
+
+::: sidenote
+Рекомендуется ознакомиться с общим принципом работы ввода в Defold, способами получения ввода и порядком получения ввода в файлах сценария. Узнайте больше о системе ввода в [руководстве](/manuals/input).
+:::
+
+# Триггеры мыши
+Триггеры мыши позволяют привязать ввод от кнопок мыши и колеса прокрутки к игровым действиям.
+
+![](images/input/mouse_bindings.png)
+
+::: sidenote
+Вводы кнопок мыши `MOUSE_BUTTON_LEFT`, `MOUSE_BUTTON_RIGHT` м `MOUSE_BUTTON_MIDDLE` эквивалентно `MOUSE_BUTTON_1`, `MOUSE_BUTTON_2` м `MOUSE_BUTTON_3`.
+:::
+
+::: important
+В приведенных ниже примерах используются действия, показанные на изображении выше. Как и в случае с любым другим вводом, вы можете называть свои действия по своему усмотрению.
+:::
+
+## Кнопки мыши
+Кнопки мыши генерируют события нажатия, отпускания и повтора. Пример, показывающий, как обнаружить ввод для левой кнопки мыши (нажата или отпущена):
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("mouse_button_left") then
+        if action.pressed then
+            -- left mouse button pressed
+        elseif action.released then
+            -- left mouse button released
+        end
+    end
+end
+```
+
+::: important
+`MOUSE_BUTTON_LEFT` (или `MOUSE_BUTTON_1`) действия ввода отправляются и для одиночных сенсорных вводов.
+:::
+
+## Колесико мыши
+Входы колесика мыши определяют действия прокрутки. Поле `action.value` имеет значение `1`, если колесо прокручивается, и `0` в противном случае. (Действия прокрутки обрабатываются так же, как и нажатие кнопки. В настоящее время Defold не поддерживает мелкозернистый ввод прокрутки на сенсорных панелях).
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("mouse_wheel_up") then
+        if action.value == 1 then
+            -- mouse wheel is scrolled up
+        end
+    end
+end
+```
+
+## Движение мыши
+Движение мыши обрабатывается отдельно. События движения мыши не принимаются, если в привязках ввода не установлен хотя бы один триггер мыши.
+
+Движения мыши не привязаны к привязкам ввода, но `action_id` устанавливается в `nil`, а таблица `action` заполняется местоположением и дельта-перемещением позиции мыши.
+
+```lua
+function on_input(self, action_id, action)
+    if action.x and action.y then
+        -- let game object follow mouse/touch movement
+        local pos = vmath.vector3(action.x, action.y, 0)
+        go.set_position(pos)
+    end
+end
+```
+
+# Сенсорные триггеры
+Триггеры типа Single-touch и Multi-touch доступны на устройствах iOS и Android в нативных приложениях и в пакетах HTML5.
+
+![](images/input/touch_bindings.png)
+
+## Single-touch
+Триггеры типа "одиночное касание" не устанавливаются в разделе "Триггеры касания" в привязках ввода. Вместо этого **триггеры одиночного касания автоматически устанавливаются, когда вы настроили ввод кнопок мыши для `MOUSE_BUTTON_LEFT` или `MOUSE_BUTTON_1`**.
+
+## Multi-touch
+Триггеры типа мультитач заполняют таблицу в таблице действий под названием `touch`. Элементы таблицы индексируются целыми числами `1`--`N`, где `N` - количество точек касания. Каждый элемент таблицы содержит поля с входными данными:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("touch_multi") then
+        -- Spawn at each touch point
+        for i, touchdata in ipairs(action.touch) do
+            local pos = vmath.vector3(touchdata.x, touchdata.y, 0)
+            factory.create("#factory", pos)
+        end
+    end
+end
+```
+
+::: important
+Мультитач не должен назначаться на то же действие, что и ввод кнопки мыши для `MOUSE_BUTTON_LEFT` или `MOUSE_BUTTON_1`. Назначение того же действия будет эффективно отменять одно касание и не позволит вам получать события от "одиночного касания".
+:::
+
+::: sidenote
+С помощью [Defold-Input asset](https://defold.com/assets/defoldinput/) можно легко настроить виртуальные экранные элементы управления, такие как кнопки и аналоговые стики с поддержкой мультитач.
+:::
+
+
+## Обнаружение нажатия или касания на объектах
+Определение того, когда пользователь нажал или коснулся визуального компонента, является очень распространенной операцией, которая необходима во многих играх. Это может быть взаимодействие пользователя с кнопкой или другим элементом пользовательского интерфейса или взаимодействие с игровым объектом, таким как управляемый игроком юнит в стратегической игре, некоторое сокровище на уровне в dungeon crawler или quest giver в RPG. Подход к использованию варьируется в зависимости от типа визуального компонента.
+
+### Обнаружение взаимодействия с узлами графического интерфейса пользователя
+Для элементов пользовательского интерфейса существует функция `gui.pick_node(node, x, y)`, которая возвращает true или false в зависимости от того, находится ли указанная координата в границах узла пользовательского интерфейса или нет. Для получения дополнительной информации обратитесь к [документации API](/ref/gui/#gui.pick_node:node-x-y), примеру [указателя](/examples/gui/pointer_over/) или примеру [кнопки](/examples/gui/button/).
+
+### Обнаружение взаимодействия с игровыми объектами
+Для игровых объектов обнаружить взаимодействие сложнее, поскольку такие вещи, как перевод камеры и скрипт рендеринга, влияют на необходимые вычисления. Существует два общих подхода к обнаружению взаимодействия с игровыми объектами:
+
+  1. Отслеживание положения и размера игровых объектов, с которыми может взаимодействовать пользователь, и проверяет, находится ли координата мыши или касания в границах любого из объектов.
+  2. Прикрепление объекта столкновения к игровым объектам, с которыми пользователь может взаимодействовать, и один объект столкновения, который следует за мышью или пальцем, и проверяет столкновения между ними.
+
+::: sidenote
+Готовое решение для использования объектов столкновения для обнаружения пользовательского ввода с поддержкой перетаскивания и щелчка можно найти в [Defold-Input asset](https://defold.com/assets/defoldinput/).
+:::
+
+В обоих случаях необходимо преобразовать координаты мыши или сенсорного события из координат экранного пространства в координаты игровых объектов в мировом пространстве. Это можно сделать несколькими различными способами:
+
+  * Вручную отслеживайте, какой вид и проекция используется скриптом рендеринга, и используйте это для преобразования в мировое пространство и обратно. Пример этого см. в [руководстве по работе с камерой](/manuals/camera/#converting-mouse-to-world-coordinates).
+  * Используйте [стороннее решение для камеры](/manuals/camera/#third-party-camera-solutions) и воспользуйтесь предоставленными функциями преобразования экрана в мир.

+ 222 - 0
docs/ru/manuals/input.md

@@ -0,0 +1,222 @@
+---
+title: Устройтво ввода в Defold
+brief: В этом руководстве объясняется, как работает ввод, как фиксировать действия ввода и создавать последующие реакции в скрипте.
+---
+
+# Устройтво ввода
+
+Весь пользовательский ввод перехватывается движком и передается в виде действий скпритам и GUI-скриптам в игровых объектах, которые получили фокус ввода и реализуют функцию `on_input()`. В этом руководстве объясняется, как настроить привязки для перехвата ввода и как создать код, реагирующий на него.
+
+Система ввода использует набор простых и мощных концепций, позволяя вам управлять вводом так, как вы считаете нужным для вашей игры.
+
+![Привязка ввода](images/input/overview.png){srcset="images/input/[email protected] 2x"}
+
+Устройства
+: Устройства ввода, которые являются частью компьютера или мобильного устройства или подключены к нему, обеспечивают необработанный ввод данных на системном уровне в среду выполнения Defold. Поддерживаются следующие типы устройств:
+
+  1. Клавиатура (отдельные клавиши, а также ввод текста)
+  2. Мышь (положение, нажатия на кнопки и действия колесиком мыши)
+  3. Касание сенсора (на устройствах iOS и Android и HTML5 на мобильных устройствах)
+  4. Геймпады (поддерживаемые операционной системой и отображаемые в [файле](#gamepads-settings-file))
+
+Привязка ввода
+: Перед отправкой ввода в скрипт необработанный ввод от устройства преобразуется в осмысленные *actions* с помощью таблицы привязки ввода.
+
+Действия
+: Действия идентифицируются по (хешированным) именам, которые вы перечисляете в файле привязки ввода. Каждое действие также содержит соответствующие данные о вводе: нажатие или отпускание кнопки, координаты мыши и касания и т.д.
+
+Слушатели ввода
+: Любой компонент скрипта или GUI-скрипт может получать действия ввода и *фокус ввода*. Одновременно могут быть активны несколько слушателей.
+
+стек ввода
+: Список слушателей ввода. С первым получателем фокуса в нижней части  и последним получателем в верхней части соответсвенно.
+
+Выбор получаемых входных данных
+: Скрипт может выбрать получаемые входные данных, которые он получил, не позволяя слушателям, расположенным ниже по стеку, получить их.
+
+## Настройка привязок ввода
+
+Привязки ввода - это таблица в масштабе проекта, которая позволяет указать, как ввод устройства должен преобразовываться в именованные *actions*, прежде чем они будут отправлены компонентам скрипта и GUI-скрипта. Вы можете создать новый файл привязки ввода, <kbd>щелкнув правой кнопкой</kbd> в *Assets* и выбрав <kbd>New... ▸ Input Binding</kbd>. Чтобы движок использовал новый файл, измените запись *Game Binding* в "game.project".
+
+![Настройка привязки ввода](images/input/setting.png){srcset="images/input/[email protected] 2x"}
+
+Файл привязки ввода по умолчанию автоматически создается во всех новых шаблонах проектов, поэтому обычно нет необходимости создавать новый файл привязки. Файл по умолчанию называется "game.input_binding" и находится в папке "input" в корне проекта. <kbd>Двойной щелчок</kbd> на файле откроет его в редакторе:
+
+![Привязка ввода](images/input/input_binding.png){srcset="images/input/[email protected] 2x"}
+
+Чтобы создать новую привязку, нажмите кнопку <kbd>+</kbd> в нижней части соответствующего раздела типа триггера. Каждая запись имеет два поля:
+
+*Input*
+: Необработанный ввод для прослушивания, выбирается из прокручиваемого списка доступного ввода.
+
+*Action*
+: Действия, присваиваемое входным действиям имя при их создании и отправке в ваши скрипты. Одно и то же имя действия может быть присвоено нескольким входам. Например, вы можете связать клавишу <kbd>Space</kbd> и кнопку геймпада "A" с действием `jump`. Обратите внимание, что существует известная ошибка, когда сенсорный ввод, к сожалению, не могут иметь те же имена действий, что и другой ввод.
+
+## Типы триггеров
+
+Существует пять типов триггеров, которые можно создать для конкретного устройства:
+
+Клавишные триггеры
+: Одноклавишный ввод с клавиатуры. Каждая клавиша отдельно отображается на соответствующее действие. Подробнее в [руководстве](/manuals/input-key-and-text).
+
+Текстовые триггеры
+: Текстовые триггеры используются для чтения произвольного текстового ввода. Узнайте больше в [руководстве](/manuals/input-key-and-text)
+
+Триггеры мыши
+: Ввод с помощью кнопок мыши и колес прокрутки. Подробнее в [руководстве](/manuals/input-mouse-and-touch).
+
+Сенсорные триггеры
+: Single-touch и триггеры типа Multi-touch доступны на устройствах iOS и Android в нативных приложениях и в связках HTML5. Узнайте больше в [руководстве](/manuals/input-mouse-and-touch).
+
+Триггеры геймпада
+: Триггеры геймпада позволяют привязать стандартный ввод геймпада к игровым функциям. Узнайте больше в [руководстве](/manuals/input-gamepads).
+
+### Ввод с акселерометра
+
+В дополнение к пяти различным типам триггеров, перечисленным выше, Defold также поддерживает ввод данных с помощью акселерометра в собственных приложениях для Android и iOS. Установите флажок Use Accelerometer в разделе "Input" файла *game.project*.
+
+```lua
+function on_input(self, action_id, action)
+    if action.acc_x and action.acc_y and action.acc_z then
+        -- реагируем на данные акселерометра
+    end
+end
+```
+
+## Фокус ввода
+
+Чтобы прослушивать действия ввода в компоненте скрипта или GUI-скрипта, сообщение `acquire_input_focus` должно быть отправлено игровому объекту, содержащему компонент:
+
+```lua
+-- сообщаем текущему игровому объекту ("."), чтобы он получил фокус ввода
+msg.post(".", "acquire_input_focus")
+```
+
+Это сообщение инструктирует движок добавить компоненты с возможностью ввода (компоненты сценария, компоненты GUI и прокси коллекции) в игровых объектах в стек *ввода*. Компоненты игрового объекта помещаются на вершину стека ввода; компонент, добавленный последним, будет находиться на вершине стека. Обратите внимание, что если игровой объект содержит более одного компонента с возможностью ввода, все компоненты будут добавлены в стек:
+
+![стек ввода](images/input/input_stack.png){srcset="images/input/[email protected] 2x"}
+
+IЕсли игровой объект, который уже получил фокус ввода, делает это снова, его компонент(ы) перемещается(ются) на вершину стека.
+
+
+## Отправка ввода и on_input()
+
+Действия ввода отправляются в соответствии со стеком ввода данных, сверху вниз.
+
+![Отправка действий](images/input/actions.png){srcset="images/input/[email protected] 2x"}
+
+У любого компонента, который находится в стеке, содержащем функцию `on_input()`, эта функция будет вызываться, один раз для каждого действия ввода в течение кадра, со следующими аргументами:
+
+`self`
+: Текущий скрипт.
+
+`action_id`
+: Хешированное имя действия, заданное в привязках ввода.
+
+`action`
+: Таблица, содержащая полезные данные о действии, такие как значение ввода, его местоположение (абсолютная и дельта-позиция), была ли кнопка ввода `нажата` и т.д. Подробности о доступных полях действия см. в [on_input()](/ref/go#on_input).
+
+```lua
+function on_input(self, action_id, action)
+  if action_id == hash("left") and action.pressed then
+    -- сдвигаемся влево
+    local pos = go.get_position()
+    pos.x = pos.x - 100
+    go.set_position(pos)
+  elseif action_id == hash("right") and action.pressed then
+    -- сдвигаемся вправо
+    local pos = go.get_position()
+    pos.x = pos.x + 100
+    go.set_position(pos)
+  end
+end
+```
+
+
+### Фокус ввода и компоненты прокси-коллекций
+
+Каждый игровой мир, динамически загружаемый через прокси-коллекцию, имеет свой собственный стек ввода. Чтобы отправка действий достигла стека ввода загруженного мира, доверенный компонент должен находиться в стеке ввода основного мира. Все компоненты в стеке загруженного мира обрабатываются до того, как отправка продолжится в главном стеке:
+
+![Отправка действий к доверенным](images/input/proxy.png){srcset="images/input/[email protected] 2x"}
+
+::: important
+Частая ошибка - забыть отправить `acquire_input_focus` игровому объекту, содержащему компонент прокси-коллекции. Пропуск этого шага не позволяет вводу достичь любого из компонентов в стеке ввода загруженного мира.
+:::
+
+
+### Освобождение ввода
+
+Чтобы прекратить прослушивание действий ввода, отправьте игровому объекту сообщение `release_input_focus`. Это сообщение удалит все компоненты игрового объекта из стека ввода:
+
+```lua
+-- сообщим текущему игровому объекту ("."), чтобы он освободил фокус ввода.
+msg.post(".", "release_input_focus")
+```
+
+
+## Обработка ввода
+
+Компонент `on_input()` может активно контролировать, следует ли передавать действия дальше по стеку или нет:
+
+- Если `on_input()` возвращает `false`, или возврат пропущен (это подразумевает возврат `nil`, который является ложным значением в Lua), действия ввода будут переданы следующему компоненту на стеке ввода.
+
+- Если `on_input()` возвращает `true`, ввод обрабатывается. Ни один компонент, расположенный ниже по стеку ввода, не получит данные ввода. Обратите внимание, что это относится ко *всем* стекам ввода. Компонент на стеке прокси-загруженного мира может обрабатывать ввод, не позволяя компонентам на основном стеке получать ввод:
+
+![Обработка ввода](images/input/consuming.png){srcset="images/input/[email protected] 2x"}
+
+Есть много хороших примеров использования, когда обработка ввода обеспечивает простой и мощный способ переключения ввода между различными частями игры. Например, если вам нужно всплывающее меню, которое временно является единственной частью игры, которая прослушивает ввод:
+
+![Обработка ввода](images/input/game.png){srcset="images/input/[email protected] 2x"}
+
+Меню паузы изначально скрыто (отключено), а когда игрок касается элемента HUD "PAUSE", оно включается:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("mouse_press") and action.pressed then
+        -- Проверяем, нажал ли игрок кнопку PAUSE?
+        local pausenode = gui.get_node("pause")
+        if gui.pick_node(pausenode, action.x, action.y) then
+            -- Отображаем меню паузы
+            msg.post("pause_menu", "show")
+        end
+    end
+end
+```
+
+![меню паузы](images/input/game_paused.png){srcset="images/input/[email protected] 2x"}
+
+Меню паузы получает фокус ввода и ввод, предотвращая любой другой ввод, кроме того, который относится к всплывающему меню:
+
+```lua
+function on_message(self, message_id, message, sender)
+  if message_id == hash("show") then
+    -- Отображаем меню паузы.
+    local node = gui.get_node("pause_menu")
+    gui.set_enabled(node, true)
+
+    -- Получаем данные ввода.
+    msg.post(".", "acquire_input_focus")
+  end
+end
+
+function on_input(self, action_id, action)
+  if action_id == hash("mouse_press") and action.pressed then
+
+    -- делаем что-нибудь...
+
+    local resumenode = gui.get_node("resume")
+    if gui.pick_node(resumenode, action.x, action.y) then
+        -- Скрываем меню паузы
+        local node = gui.get_node("pause_menu")
+        gui.set_enabled(node, false)
+
+        -- Освобождаем ввод.
+        msg.post(".", "release_input_focus")
+    end
+  end
+
+  -- Обрабатывеам все входные данные. Все, что находится ниже в стеке ввода
+  -- никогда не увидит данные ввода, пока мы не освободим фокус ввода.
+  return true
+end
+```

+ 42 - 0
docs/ru/manuals/nintendo-switch.md

@@ -0,0 +1,42 @@
+---
+title: Разработка для Nintendo Switch
+brief: В данном руководстве описано, как получить доступ к Nintendo Switch
+---
+
+# Зарегиструйтесь в Nintendo Switch как разработчик
+
+Поддержка платформы Nintendo Switch не включена в стандартную версию Defold. Чтобы получить доступ к поддержке Nintendo Switch в Defold, вам необходимо:
+
+1. Стать спонсором сообщества Defold и получите доступ к Nintendo Switch, включенный в ваш уровень членства, и
+2. Стать зарегистрированным разработчиком игр для платформ Nintendo.
+
+
+## Станьте спонсором сообщества Defold и получите доступ к Nintendo Switch
+
+Вы можете стать спонсором сообщества Defold на [странице пожертвований сообщества Defold](/community-donations/). Также вы можете стать спонсором с доступом к Nintendo Switch, используя GitHub Sponsors или Patreon. Обратите внимание на доступные уровни и выберите тот, который включает доступ к Nintendo Switch.
+
+![](images/nintendo-switch/register-defold.png)
+
+## Зарегистрируйтесь в качестве разработчика игр для платформ Nintendo
+
+Регистрируетесь в качестве разработчика игр для платформ Nintendo на [портале разработчиков Nintendo](https://developer.nintendo.com/register):
+
+![](images/nintendo-switch/register-nintendo.png)
+
+Пройдя регистрирацию, вы получите доступ к инструментам и ресурсам разработчиков Nintendo для создания и публикации игр и приложений для современных платформ Nintendo.
+
+
+### Запрос доступа в Defold
+
+После получения одобрения от Nintendo вам необходимо войти на портал Nintendo для разработчиков, перейти на страницу Tools and Middleware и зарегистрироваться для доступа в Defold. Когда вы зарегистрируетесь для доступа в Defold, мы получим электронное письмо от Nintendo, подтверждающее, что вы являетесь зарегистрированным разработчиком Nintendo. Затем мы проверим вас как спонсора сообщества, и доступ к Nintendo Switch будет включен в ваш уровень членства.
+
+Когда мы подтвердим, что вы являетесь спонсором с доступом к Nintendo Switch, мы предоставим вам доступ к следующему:
+
+* Версии редактора Defold и инструментов командной строки Defold (bob.jar) с поддержкой комплектации для платформы Nintendo Switch.
+* К частной группе форума, где вы можете получить поддержку по вопросам Nintendo Switch.
+* Документации для Nintendo Switch
+* API к функциональности движка, специфичной для Nintendo Switch.
+
+
+## Часто задаваемые вопросы
+:[Nintendo Switch](../shared/nintendo-switch-faq.md)