Current time: 25.09.2021, 22:04 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Создание скриптов с поддержкой мультиязычности
» SN:T + json
Author Message
Berserker Offline
Administrators

Posts: 15388
Post: #1
Кирпич 



1. Формат ERT устарел и не рекомендуется к применению.

2. В папке мода создаётся файл Lang\*.json, например Lang\имя мода.json.

3. Файл имеет следующий формат в кодировке UTF-8:
Code:
{
  "ключ 1-го уровня": {
    "ключ 2-го уровня": {
      "ключ 3-го уровня": "значение",
      "ключ 3-го уровня": "значение"
    }
  }
}

4. Вложенность и количество уровней определяется объёмом текста в моде и личным решением автора мода. Минимальным и достаточным вариантом выступают 1 уровень группировки с аббревиатурой мода и один уровень для каждого конкретного переводимого текста.

Пример для мода Battle Heroes:
Code:
{
  "bh": {
    "skill_diplomacy": "Дипломатия",
    "tournament_win_message": "Вы победили в турнире!"
  }
}

5. В текстах перевода могут быть подстановочные параметры (placeholders), которые в момент перевода должны быть заменены на числа/строки. Такие параметры заключаются между символами "@"..."@".

Пример:
Code:
{
  "bh": {
    "exp_gain_msg": "Вы получили @exp@ опыта"
  }
}

6. Получить перевод из ЕРМ можно через SN:T$1/?$2/[#3/#4...];
$1 - составной ключ перевода, где ключи разных уровней разделяются точками. Пример: ^bh.exp_gain_msg^

?$2 - в какую строку поместить перевод
#3 - название очередного параметра
#4 - значение очередного параметра

Пример:
Предполагается, что в v600 хранится опыт, полученный героем.
Поддерживается до 7-и пар параметр-значение в ЕРМ и неограниченное число в плагинах/Lua.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
16.02.2020 22:49
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3921
Post: #2

Вопросы остались.
1. Количество json-файлов в каталоге Lang ограничено? Хочется для каждой опции иметь отдельный языковой файл.
2. Можно ли подтягивать json-файлы из data/s, чтобы языковой файл лежал рядом со скриптом?
3. Как все-таки задать для одного ключа разноязычные значения? Если разными составными частями ключа, типа ^bh.exp_gain_msg.ru^, то как определить используемый язык в ERM, чтобы подставить этот самый "ru" или "en"?

Еще в changelog'е нашел:
Hints from Mod\Data\Buttons\*.btn files are now automatically translated. No need to include *.btn files in localizations.

А в этом случае где задаются и как подтягиваются разноязычные hint'ы? Примера не нашел...


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
17.02.2020 01:14
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 15388
Post: #3

Algor,
1. Ограниченно возможностями файловой системы. То есть нет.
2. Нет, скрипты Lua/ERM/из карты/плагины могут быть в разных местах, но место файлам локализации в одном универсальном.
3. О языке думать не нужно. Файл json пишется на одном языке. Затем пишется мод-перевод на любой другой язык, например your mod rus.json или your mod pl.json. Я просто добавляю аббревиатуру языка к имени файла. xxx.json оригинал, xxx cn.json для китайского.

Ключи-значения из всех json-файлов всех модов объединяются в один словарь. Ключи из приоритетных модов имеют приоритет. Файлы в модах-локализациях могут иметь произвольные названия, но рекомендуется использовать имя, отличное от файла оригинала.

Пример:
Базовый мод на русском, есть три ключа А, Б, В.
Есть мод-англификатор с каким нибудь XXX eng.json, где только ключ Б.
Игрок будет видеть сообщение Б на английском, а А и В на русском. Если же перекрыть файл полностью, вместо А и В будут названия ключей. Таким образом частичные и устаревшие переводы поддерживаются.


----------------------------------
Для кнопок аналогично, ищется по ключу перевод. Ключ из какого мода приоритетнее, тот и задействован. Посмотри на Quick Savings мод оригинал и его перевод из WoG Rus.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.02.2020 01:22
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3921
Post: #4

Berserker Wrote:Затем пишется мод-перевод на любой другой язык, например your mod rus.json
Ну, то есть, все равно отдельный мод в отдельном каталоге? Если да, то печально. Весь смысл вопроса в том, чтобы все языки лежали в одном моде, а для простоты перевода - в одном файле, например:

   "ru_RU": {"skill_diplomacy": "Дипломатия"}
   "en_EN": {"skill_diplomacy": "Diplomacy"}
   "cn_CN": {"skill_diplomacy": "<неведомая клинопись>"}

_Lang.erm:

*.erm:


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
17.02.2020 11:18
Visit this user's website Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2608
Post: #5

(16.02.2020 16:40)Algor Wrote:  Berserker, а есть возможность/пример использования SN:T и мультиязычного json? Даже не так: как в игре получить используемый язык?
Если хоть как то поможет, то определение языка (английский или русский) можно использовать так (Подробнее):


game bug fixes extended.dll || My Plugins
17.02.2020 11:38
Visit this user's website Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3921
Post: #6

Berserker, как вариант можно поставлять в одном моде несколько json-ов в каталоге Lang:
0_en_US.modname.json
1_ru_RU.modname.json.off
2_cn_CN.modname.json.off
3_pl_PL.modname.json.off
...
и инструкцию убрать ".off" у файла для своего языка. en_EN можно не убирать - будет базовым, если в каком-то из переводов не все позиции переведены.
Но это, к сожалению, не решает проблему с локализацией нетекстовых элементов (картинки/голос).
Но для ES количество json'ов будет слишком велико, а сливать тексты всех опций в один файл мне категорически не хочется.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
17.02.2020 19:05
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 15388
Post: #7

Algor, пусть будут разные моды. Их могут хранить и поддерживать совсем разные люди. сам занимался локализациями под себя. И машинный перевод обновлять проще. Прогнать по основному, выделить изменённые и новые ключи, перевести. А в одном моде хоть 100 файлов json по одному на опцию.

В целом политика такая. Текст, как и картинки с надписями — это просто игровой ресурс. Игра не знает, из каких ресурсов она состоит. Поэтому строгого понятия языка нет. Мод пишется на одном основном языке, как будто других нет. Чаще всего пользователь скачает только одну локализацию из официального или фанатских источников. Другие ему не нужны. Бывает, автор забивает на перевод, люди пользуются альтернативами.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
17.02.2020 20:12
Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 323
Post: #8

Berserker, начиная с какой версии эры работает?


The dreams you kill will break your heart
22.02.2020 01:05
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 15388
Post: #9

ElfbI, с 2.6.2.


Algor, тебе достаточно двух модов. Основного и одной локализации на английский. В каждом по папке Lang\*.json с отдельным файлом json для каждой опции, если хочется точечного разбиения.

Quote:"ru_RU": {"skill_diplomacy": "Дипломатия"}
"en_EN": {"skill_diplomacy": "Diplomacy"}
"cn_CN": {"skill_diplomacy": "<неведомая клинопись>"}
Такой подход не даёт раздлетить языковые данные по людям и проектам — это раз. Требует наличия фиксированного основного и резервного языков — это да. Не поддерживает частичный перевод без резервного языка — это три.

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

Quote:Если хоть как то поможет, то определение языка (английский или русский) можно использовать так (Подробнее):

    !!UN:C8401436/4/?y1; [тип языка: 0-английский, 1-русский]
Вот так просьба не делать. Не нужно никаких предположений о языке игры и копаний в памяти. Если у меня *.txt ресурс на польском, мне всё равно, где там код ВоГа костыльно пытается хранить двуязычие, а другие моды костыльно определить мой фиксированный язык.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
22.02.2020 02:58
Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 323
Post: #10

Тогда не пойму, где ошибся. ERA 2.8.8 Ставлю в z1 произвольный текст - все ок, пытаюсь получить перевод, пустой вопрос.
[#3/#4...] необязательно, как я понял :
В ерм:

в Mods\ElfbI Pandora\Lang\ElfbI Pandora.json
Code:
{
  "pandora90": {
    "open_box_q": "Ящик Пандоры. Вы хотите открыть ящичек?"
  }
}
И сразу вопрос, как быть с выделением текста {}


The dreams you kill will break your heart
(This post was last modified: 22.02.2020 03:24 by ElfbI.)
22.02.2020 03:16
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3921
Post: #11

!!SN:T^pandora90.open_box_q^/?z1; получаем значение ключа


(17.02.2020 15:47)Berserker Wrote:  Algor, тебе достаточно двух модов. Основного и одной локализации на английский.
...и одного для локализации на польский, и одного для локализации на китайский. Доводы понятны, механизм тоже. Хотелось бы как-то совместить в одном... подумаю еще.


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
22.02.2020 03:26
Visit this user's website Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 323
Post: #12

Algor, в примере
$1 - составной ключ перевода, где ключи разных уровней разделяются точками. Пример: ^bh.exp_gain_msg^

Но вы правы при этом - все заработало


The dreams you kill will break your heart
(This post was last modified: 22.02.2020 03:29 by ElfbI.)
22.02.2020 03:28
Find all posts by this user Quote this message in a reply
Algor Away
Administrators

Posts: 3921
Post: #13

Ну так у тебя
ключ первого уровня = pandora90
ключ второго уровня = open_box_q
итого составной = pandora90.open_box_q
разве не так?


BattleHeroes Rus/Eng | ERA scripts (+ReMagic) Rus/Eng
22.02.2020 03:30
Visit this user's website Find all posts by this user Quote this message in a reply
ElfbI Offline

Posts: 323
Post: #14

Algor, это я копипастил сюда ошибся. Ключ первого уровня на самом деле был ep

Работает без первого ключа вообще. С ключом через точку - пустой вопрос.


Code:
{
  "ep": {
    "open_box_q": "Ящик Пандоры. Вы хотите открыть ящичек?"
  }
}


The dreams you kill will break your heart
(This post was last modified: 22.02.2020 03:34 by ElfbI.)
22.02.2020 03:33
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 15388
Post: #15

Символы {} можно смело использовать. Экранировать внутри строк нужно табы, переводы строк, сами двойные кавычки. \t, \n, \"


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
22.02.2020 03:33
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2021 MyBB Group