Wake of Gods Forum | Форум Во Имя Богов
Создание скриптов с поддержкой мультиязычности - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+---- Forum: ЭРА / ERA (/forumdisplay.php?fid=182)
+---- Thread: Создание скриптов с поддержкой мультиязычности (/showthread.php?tid=5476)


Создание скриптов с поддержкой мультиязычности - Berserker - 16.02.2020 22:49




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.


RE: ERA Scripts 1.41 Rus, Eng - Algor - 17.02.2020 01:14

Вопросы остались.
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'ы? Примера не нашел...


RE: ERA Scripts 1.41 Rus, Eng - Berserker - 17.02.2020 01:22

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.


RE: Сборка HoMM3 ERA с модами. - Algor - 17.02.2020 11:18

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

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

_Lang.erm:

*.erm:



RE: ERA Scripts 1.41 Rus, Eng - igrik - 17.02.2020 11:38

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



RE: ERA Scripts 1.41 Rus, Eng - Algor - 17.02.2020 19:05

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'ов будет слишком велико, а сливать тексты всех опций в один файл мне категорически не хочется.


RE: ERA Scripts 1.41 Rus, Eng - Berserker - 17.02.2020 20:12

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

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


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 01:05

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


RE: Создание скриптов с поддержкой мультиязычности - Berserker - 22.02.2020 02:58

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 ресурс на польском, мне всё равно, где там код ВоГа костыльно пытается хранить двуязычие, а другие моды костыльно определить мой фиксированный язык.


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 03:16

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

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


RE: Создание скриптов с поддержкой мультиязычности - Algor - 22.02.2020 03:26

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


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


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 03:28

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

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


RE: Создание скриптов с поддержкой мультиязычности - Algor - 22.02.2020 03:30

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


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 03:33

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

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


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



RE: Создание скриптов с поддержкой мультиязычности - Berserker - 22.02.2020 03:33

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


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 03:37

Berserker, про экранирование - лучше написать в примере в шапке, мне кажется. Для меня термин не очень понятный. Как перевод строки экранировать, например?


RE: Создание скриптов с поддержкой мультиязычности - Algor - 22.02.2020 03:40

\n - перевод строки
\t - табулятор
\" -двойная кавычка
{ "ключ" : "первая строка\nвторая строка\n{\"желтая\" строка}" }


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 03:43

Algor, Berserker, спасибо за помощь, буду пытаться)


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 04:06

То, что я раньше принял за срабатывание, оказалось родным окном ящика, т к шанс на новый ящик 66%
Я пишу следующее и получаю пустой вопрос. Редактировать lua без разницы чем? Я уже не знаю, что еще.


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



RE: Создание скриптов с поддержкой мультиязычности - Berserker - 22.02.2020 04:10

ElfbI, а мод включён? Скинь весь архив мода, пожалуйста. https://dropmefiles.com


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 04:13

Berserker, https://dropmefiles.com/DHN8a

Berserker, все должно быть ок. Я вставлял тестовое сообщение в переменную перед выводом. Оно отображается. строчка 61 - пытаюсь получить ключ.

Блин, мне как-то неловко теперь - я хотел скрипт привести в нужное состояние перед опубликованием. Я не помню, он может ссылаться на внешний код:




RE: Создание скриптов с поддержкой мультиязычности - Berserker - 22.02.2020 05:33

ElfbI, json файл нужно редактировать и сохранять в редакторе, умеющим работать с кодировкой UTF-8. Например через Tools\Era_Editor_Sublime\sublime text.exe.
File - Save with encoding - UTF-8. У тебя кодировка Windows-1251 (кириллица). Вероятно, компонент работы с json порсто заменяет некорректные строки на пустые.

ElfbI, компонент json жутко молчаливый на ошибки. Даже типа не возвращает.
В Sublime Text, если используешь, ctrl + shift + p, install package, pretty json. После чего при сохранении json будут показываться ошибки. И по ctrl + alt + j.


RE: Создание скриптов с поддержкой мультиязычности - ElfbI - 22.02.2020 15:49

Berserker, спасибо, наконец-то работает. Сколько я нервов на это потратил.


RE: Ваши вопросы по ERM-скриптам - ElfbI - 06.09.2020 02:05

Можно для SN:T использовать отрицательные z?


или




RE: Ваши вопросы по ERM-скриптам - daemon_n - 06.09.2020 02:11

ElfbI, можно, но надо так
!!SN:T^jsontext.tex1^/?z-1;


RE: Ваши вопросы по ERM-скриптам - Bes - 06.09.2020 02:13

ElfbI, если верить справке (не знаю, кто там инфу готовил), то нельзя (до 2.9.14 включительно)
Quote:Все команды ERA могут работать со следующими элементами ERM:
  • Переменными y+, v, w, x, z+, f..t, e;

и нет синтаксиса set Yes
Quote:SN:T^имя^/?z#/#1/?$1/#2/?$2...



RE: Ваши вопросы по ERM-скриптам - ElfbI - 06.09.2020 02:16

Bes, daemon_n,

про синтаксис установка/получение вопросов нет, установка очень даже работает в моем моде пандора, я просто некорректно написал пример
только про переменные для эра3.


RE: Advanced Classes Mod - daemon_n - 14.09.2020 23:58

(14.09.2020 23:38)Berserker Wrote:  Переводы в json сделаны тоже модульно. Если в eng.json есть строки, которых нет в rus.json, то они будут использоваться. То есть худший сценарий — часть строк на английском, но обновлением можно пользоваться, не дожидаясь релиза локализации.

Berserker, а как ты планируешь сделать русификатор, если не перекрытием файла? Json хоть и модульный внутри, но на деле это всего лишь 1 файл.


RE: Advanced Classes Mod - Berserker - 15.09.2020 00:08

daemon_n, представь себе большой словарь вида ключ => значение, в который можно только добавлять, но не перезаписывать пары.
Первым загрузятся все ключ => значения из rus.json (более приоритетный мод).
Далее пойдут грузится пары из eng.json. Совпадающие ключи будут проигнорированы, а уникальные новые добавлены.
В результате разработчик можно сколько угодно добавлять новых ключей. Все они будут работать на оригинальном языке.

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


RE: Advanced Classes Mod - daemon_n - 15.09.2020 01:15

Berserker, а как заставить читаться русский файл после английского, раз у них разные имена? К тому же ключи не только добавляются, но и изменяются. Я знаю, как работает текст в json, потому сделал свой мод с 3 разными языками. (3 разных файла)


RE: Advanced Classes Mod - Berserker - 15.09.2020 01:35

daemon_n, файлы грузятся в порядке приоритетов модов. Русский загрузится раньше английского всегда и первым займёт нужные ключи.

Пример:
rus.json
hero_name = оррин
mage_power = превращение в козла

eng.json
hero_name = Zan'Zarrak
mage_power = turns into goat
welcome_message = Greetings, @hero@

Итоговый словарь в памяти игры:
hero_name = оррин
mage_power = превращение в козла
welcome_message = Greetings, @hero@


RE: Создание скриптов с поддержкой мультиязычности - Bes - 06.11.2020 00:41

(01.12.2017 23:26)Berserker Wrote:     я пишу так:
Попутно создаю Lang\test.json с содержимым:
Code:
{
  "hero_is_x_age": "@hero@ достиг @age@ лет"
}

Выводится: «Berserer достиг 27 лет» Ab

Из каких элементов состоит локализация:
1) Автоматическая подгрузка языковых json-файлов формата { "глобальный уникальный ключ": "перевод", ... }
2) Совпадающие строки из разных модов подчиняются приоритетам модов (последний установленный весомее)
3) Перевод по ключу можно загрузить из ЕРМ или плагина.
4) В перевод можно передать до 7 именованных параметров (плагинам — неограниченно), которые будут подставлены в перевод при необходимости.
@имя параметра@
5) SN:T(ключ)/?(z-переменная)/(параметр 1)/(значение 1)/(параметр N)/(значение N);
Команда получает перевод строки или возвращает сам ключ, если перевод не найден.

Berserker, в последствии ограничение в 7 параметров осталось для ERA2 ?


RE: Создание скриптов с поддержкой мультиязычности - Berserker - 06.11.2020 01:24

Bes, осталось ограничение на 16 параметров для ЕРМ команд. Как ты понимаешь, 2 + 7 * 2 = 16. То есть да.


RE: Разные вопросы - Elmore - 05.06.2021 23:21

(05.06.2021 01:20)Elmore Wrote:  Как вы делаете переводы своих модов? Вопрос к тем, кто не пишет перевод самостоятельно, а пользуется переводчиком.

Можно сделать такую схему:
- Все тексты выносить в отдельный файл и оформлять по единому шаблону. Например в ini с минимум лишнего или типа того.
- В программе указать файл для перевода и файл для сохранения текста. Подходит для любых языков.
- Программой автоматом пройтись по файлу, по очереди брать каждую строку, кидать в браузере на translate.google.com и записывать в новый файл с таким же шаблоном.

google api бесплатное не в счет, там нет ИИ алгоритмов при переводе. Только в платной версии.

Berserker, увидел json из ACM. Ну суть та же. Если все будут использовать единый метод, прога возьмет весь текст и прогонит через переводчик (в ней как раз используется js и nodejs).
Я себе для другой задачи сделал, может смогу и для героев сделать. Сложно сказать, т.к. вижу код вместе с текстом используется и он не всегда даже выделен какими-то спец символами, но вроде гугл такое не переводит. Только вот там распространяемый архив будет небольшой, а для запуска автоматически скачает полноценный браузер ~700мб.
Либо же должно "что-то" еще произойти, чтобы все новые моды хранили тексты только в json (а еще лучше в специальной папке "languages/lang_name" и менять язык где-то в файле-конфиге). Это даст возможность, хоть и не идеально, но получить мультиязычность модов.


RE: Разные вопросы - Berserker - 06.06.2021 00:29

Естественно нужно экранировать параметры. @...@ — имя параметра, его нужно до перевода заменить на что-либо, что переводчики оставляют нетронутыми, например [1], а затем вернуть назад. Кода в json нет.


RE: Разные вопросы - Elmore - 06.06.2021 01:07

{~%Z6}%Z5%Z-7 Fire Shield{~}
Вот с таким сложнее. Там может еще что-то быть, кроме {}, @@, % ?


RE: Разные вопросы - Berserker - 06.06.2021 01:57

Точно, цветные тексты.
-) {~.....}, включая {~}
-) %что-то, где %% — просто процент.
-) @...@
-) {текст} — это выделенный текст. При желании можно открывающую и закрывающую скобки рискнуть тоже обернуть. Зависит от того, портит ли их переводчик.
Это старый код, в новых проектах подставление ЕРМ 1 переменных через %... не рекомендуется категорически, но АСМ был написан до Эры 3.

{~%Z6}%Z5%Z-7 Fire Shield{~}
=>
[1][2][3] Fire Shield[4]
=>
[1][2][3] Огненный щит[4]


RE: Разные вопросы - Elmore - 06.06.2021 02:17

Сложность в определении нужного. В данном случае текст из 2х слов и получается:
[{~%Z6}][%Z5%Z-7] [Fire Shield][{~}]
от % до пробела, если не %%
Но пока думаю, как определять процент в середине слова и как обрабатывать... остальное легко.
Такая ситуация "{}%что-то" или "%что-то{}" слитно может быть где-то, кроме начала и конца строки?


RE: Разные вопросы - Berserker - 06.06.2021 02:53

Это регулярные выражения или разбор на лету по токенам, как удобнее. Может быть что угодно.
По процентам регулярка вида: /(%[A-Za-z]\-?\d*+)/
Там латинская буква + опциональное число.


RE: Разные вопросы - Elmore - 11.06.2021 15:11

Berserker, в json возможна ситуация кроме key.key.value ?


RE: Разные вопросы - Berserker - 11.06.2021 16:25

Elmore, в переводных json могут быть объекты любой вложенности, которые заканчиваются парой ключ: строка

{ "a": { "b": { "c": "value"

Они преобразуются в плоскую карту вида "a.b.c.d": "value" самой Эрой. Ключи вида "a.b.c.d" тоже поддерживаются.


RE: Разные вопросы - Elmore - 11.06.2021 17:33

Понял, значит будет проверять чуть больше.