Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

UnityText — работа с текстом бинарных файлов 

wL3OS70.png

Версия: 2.1.6841.19286

Скачать

T7QLOnr.png     zx29Naf.png

О программе

 

Утилита предназначена для редактирования текста в бинарных файлах. В первую очередь это так называемые «MonoBehaviour» файлы игр, разработанных на Unity.

Изначально утилита создавалась для внутреннего использования для помощи в переводе Unity-игр, в виду чего в ней не закладывался большой потенциал, что привело к ряду ограничений и упрощений. Но за 3 года существования она вышла за изначальные рамки, и несмотря на то, что в ней много чего изменилось за это время, мне продолжают регулярно поступать вопросы. Поэтому было принято решение выпустить «мажорное» обновление и создать тему на форуме, в которой описать, что и как работает.

О версии 2

 
  • Полностью переписанный код
  • Добавлены/расширены настройки
  • Редактирования диапазонов символов, реализовано через интерфейс
  • Новый фильтр с новыми опциями
  • Предустановки для настроек и фильтров
  • Экспорт в CSV в новом формате, с расширенными настройками
  • Возможность работы с любыми файлами (не только из Unity, имеющими выравнивание данных в 4 байта и текст в кодировке UTF-8)

О работе

 

Некоторые пользователи UnityText не до конца, а может и совсем, не понимают принцип ее работы. Утилита не работает с каким-то определенным форматом данных, она просто сканирует файл в поисках текста по определенным условиям. Именно это позволяет UnityText работать с любым файлом. Важно понимать, успех результата будет зависеть от корректности настроек утилиты, но даже это не всегда может гарантировать 100% верный результат. Еще более важно, несмотря на то, что утилита изменит весь текст, который она найдет в файле, это может вызвать проблемы в работе игры/программы. Проблема кроется в структуре бинарного файла, а именно в том содержит ли она в себе размеры (общий или отдельных блоков), ссылки на данные (смещения). Однако все выше написанное относится к тем, кто соберется использовать UnityText для не Unity-игр.

О диапазонах символов

 

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

Важно, при первом запуске не забудьте отредактировать настройки диапазона по умолчанию.

Предваряя вопрос «Почему не использовать все символы?», отвечу, что это сделано чтобы избежать лишних «срабатываний». Даже если отсеять все непечатные символы (из групп control, format, surrogate), то останется тысячи, которые могут помешать корректному определению «правильной» строки. К тому же, таким образом вы всегда можете отсеять ненужные языки (например, использующие иероглифы).

Для задания диапазонов символов нужно нажать кнопку «C» на панели кнопок. Все доступные (описанные в файле ucd.xml) символы Unicode собраны в «Наборах символов/Character Set», они разбиты на блоки. Для удобства символы разных категорий (типов) окрашены в разные цвета. По умолчанию это зеленый для букв, оранжевый для цифр, фиолетовый для знаков пунктуации, синий для специальных знаков (математических, технических, денежных и т.п.), красный для разделителей и серый для остальных. Цвета можно изменить, см. раздел «О другом». Добавлять/удалять символы из диапазона можно с помощью мышки (по одному, диапазоном, строками или целыми блоками) или из панели «Выбрать диапазон/Select Range». На панели необходимо задать начальный символ диапазона или его код Unicode (десятичный или шестнадцатеричный) и конечный символ, затем нажать кнопку «+» или «-». Помимо этого, можно выбрать сразу все буквы алфавитов (прописанных в cfg). Для этого нужно нажать кнопку «С», выбрать алфавит из списка, а затем нажать кнопку «+» или «-».

Панель «Обновление данных/Update Data» позволяет обновить информацию о символах с сайта unicode.org и алфавитах с сайта unicode-table.com. Вы можете выбрать какая информация будет обновлена: о блоках Unicode (флажок «Данные блоков/Block Data»), о символах (флажок «Данные символов/Char Data»), о категориях/группах символов (флажок «Категории/Categories»), о алфавитах (флажок «Алфавиты/Alphabets»). Флажок «Блок управляющих символов/С0 Control Block» добавляет отдельный блок управляющих символов (U+00 — U+1F), который в Unicode включен в блок «Basic Latin».

Также вы можете изменить шрифт отображения символов, это полезно если шрифт по умолчанию не содержит необходимых вам символов. Вы можете выбрать один из установленных в системе шрифтов из списка Fonts или загрузить свой нажав кнопку «…».

Диапазоны символов можно сохранить в предустановках (Presets) вместе с настройками.

В версии 2.1 появилась несколько новых возможностей. Во-первых, возможность скрывать блоки в которых ничего не выбрано (кнопка «☑»). Во-вторых,  возможность выделять в блоке только буквы (кнопка «Б/L») или только печатные символы (кнопка «П/P»). Данные фильтры применяются только при выделении целого блока, т.е. при клике по флажкам. В-третьих, добавлен пошаговый поиск в по названиям блоков, просто начните набирать с клавиатуры названия блока, при этом фокус должен быть на «Наборах символов/Character Set». Ну и последняя добавленная функция — это «Пошаговое сканирование/Step-by-step Scan» (кнопка «С/S»). При данном сканировании учитываются все печатные символы (с 10%-ным допуском непечатных) и, если символы не выбраны в «Наборах символов/Character Set», будет предложено их добавить в диапазон.

Также в версии 2.1 появилась настройка «Печатные символы вместо диапазонов/Printable Instead of Ranges», которая позволяет отказаться от настройки «Диапазонов символов/Character Ranges». Это не панацея, так как может привести к ошибочным результатам, но иногда может пригодиться.

О настройках

Скрытый текст

Для отображения дерева настроек нужно нажать кнопку «O» на панели кнопок. Все настройки для удобства разбиты на группы. Помимо их значений, можно указать будет ли сохраняться настройка в предустановках. Через контекстное меню можно установить значения всех настроек по умолчанию, а также пометить их все для сохранения.

  • Настройки поиска (Search Options)
    Лучше не завышать эти настройки, чтобы потом не выяснять почему утилита «зависла», выставляйте их с умом и в меру потребностей.
    • Глубина поиска (Search Depth)
      Указывает количество обрабатываемых подкаталогов при поиске файлов для сканирования, т.е. на сколько уровней «вглубь» опустится поиск
    • Максимальный размер файла (Max File Size)
      Файлы, размер (в байтах) которых превышает данное значение не будут обрабатываться утилитой, однако они появятся в списке результатов с пометкой «#FileSizeLimit#». Опция добавлена, чтобы большие файлы не тормозили общий процесс, вы всегда (если это требуется) можете просканировать их отдельно.
  • Настройки сканирования (Scan Options)
    • Big Endian
      Устанавливает порядок байтов от младшего к старшему, стоит обратить внимание при сканировании консольных ресурсов.
    • Длина подстроки (Substring Length)
      В UnityText предполагаемая строка текста проходит проверку не полностью (символ за символом), а по определенному алгоритму. Строка разбивается на подстроки указанной длины, и каждая подстрока проверяется все менее тщательно. Т.е. у первой подстроки проверяется каждый символ, у второй — каждый второй, у третьей — каждый третий и т.д. до достижения значения «Частоты», заданное опцией, описанной ниже.
    • Частота (Frequency)
      Значение частоты проверки подстрок алгоритма, описанного выше, после которого частота перестает изменяться. Т.е. при значении равном 4 для третей подстроки будет проверяться каждый третий символ, для четвертой — каждый четвертый, для пятой — также каждый четвертый, как и для всех последующих подстрок.
    • Минимальная размер строки (Min String Size)
      Строки, размер (в байтах, не путать с длинной в символах) которых меньше данного, не будет учитываться утилитой. Важно отметить, что строка не просто будет пропущена, а утилита будет дальше обрабатывать ее данные как бинарные. Также стоит быть аккуратным, указывая значение равное 1, т.к. это может привести к ошибочным результатам сканирования.
    • Максимальный размер строки (Max String Size)
      Значение размера (в байтах, не путать с длинной в символах), указывающее максимально допустимый размер строки, все превышающие, как и в случае с «Минимальной длиной», не будут учитываться. За все время мне попался только один файл, который содержал в себе «выдающуюся» строку, содержавший какой-то JSON-текст, ее размер был равен почти 450 000 байт. Но это скорее исключение, поэтому рекомендуется выставлять небольшие значения, это может значительно ускорить сканирование.
    • Печатные символы вместо диапазонов (Printable Instead of Ranges)
      Данная настройка упраздняет «Диапазоны символов». При ее включении строка может содержать в себе любые печатные символы. Стоит отметить, что это может привести к некорректным результатам.
    • Пропускать без букв (Skip Without Letter)
      Строка с длиной не превышающей длину подстроки (Substring Length), и которая не содержит букв, не будет учитываться при сканировании.
    • Упрощенная проверка (Simple Check)
      Будет проверено только начало строки (первая подстрока)
    • Динамический фильтр (Runtime Filter)
      Фильтр будет применен во время сканирования, таким образом, отфильтрованные строки не попадут в итоговые результаты.
  • Настройки экспорта в Csv (Csv Export Options)
    • Внешние бинарные данные (External Bin Data)
      Новый формат хранения данных, бинарная часть из csv файла помещается в отдельный файл, что делает csv «чище» и значительно уменьшает его размер
    • Esс-последовательности (Esc-Sequences)
      Происходит замена некоторых символов на escape-последовательностями (сочетание косой черты и символа) при экспорте, обратная замена при импорте csv
      \n  — новая строка
      \r  — возврат каретки
      \t  — горизонтальная табуляция
      \\  — обратная косая черта
    • Столбец с индексом (Index Column)
      Добавляет в файл csv столбец с порядковым номером строки, может быть полезен для возвращения исходной сортировки, которая важно при импорте csv
    • В несколько столбцов (Multicolumn Mode)
      Строки между которыми нет данных, экспортируются в несколько столбцов. Это полезно для файлов, которые содержат в себе несколько локализаций. Однако при этом не учитываются пустые строки.
      • Предполагать наличие длины (Assume Array Length)
        Опция, расширяющая работу предыдущей. При ее включении утилита анализирует данные, предполагая, что перед строками указывается их количество, отдельно для каждого массива (группы) строк. Данная опция учитывает пустые строки.
    • Максимальная длина строки в ячейке (Max String Length in Cell)
      Текст, длина которого превышает указанное значение, разбивается на подстроки, которые размещаются в отдельных ячейках. Опция, в первую очередь, призвана избавить от ограничения на длину текста в ячейках электронных таблиц
      • Разбивать по разделителям (Split by whitespace)
        Опция, расширяющая работу предыдущей. Текст, по возможности, разбивается по переносам строки, табуляции, разделителям и знаком пунктуации.

О фильтрах

Скрытый текст

Для включения фильтра нужно нажать кнопку «Ф/F» на панели кнопок. Важно понимать, что фильтр применяется только когда кнопка нажата, т.е. когда панель «Фильтр» («Filter») видна. В новой версии UnityText фильтры не применяются во время сканирования, они применяются к уже найденному тексту, что позволяет менять их без повторного сканирования данных. Также добавилась возможность временно отключить тот или иной шаблон фильтра, сняв флажок возле него. Все отфильтрованные строки вычеркиваются из списка результатов (отображаются зачеркнутым шрифтом).

Все основные команды фильтра доступны через контекстное меню. Через него можно добавить, отредактировать или удалить паттерн, а также полностью очистить фильтр. Кроме того, там же доступен пункт для обновления фильтра. По умолчанию обновление происходит при смене фокуса с панели фильтра. Новый паттерн фильтра можно добавить также, как и в старой версии, отредактировав «New Pattern», однако для того чтобы ввести многострочный текст придется воспользоваться контекстным меню. При редактировании фильтра через контекстное меню отобразится многострочное поле для ввода текста. Подтвердить или отменить действие можно с помощью кнопок или клавиатуры, соответственно Ctrl+Enter и Esс.

Список доступных настроек для фильтра расширился. Теперь в него входят следующие настройки:

  • Учитывать регистр (Case Sensitive)
  • Строка целиком (Whole String Only)

  • Использовать регулярные выражения (UseRegularExpressions)
    Подробнее о том какие регулярные выражения используются можно узнать здесь

  • Соседние строки (NeigborString)
    Если указанный шаблон фильтра соответствует строке и значение этой настройки не равно 0, то фильтруется строка, положение которой отличается на значение указанное в опции

    • Включая строку шаблона (IncludePatternItem)
      Будет отфильтрована и сама строка, которая соответствует шаблону 
    • Включая промежуточные строки (IncludeIn-BetweenItems)
      Все строки между текущей (удовлетворяющей шаблону) и соседней ей (отстоящую на указанную позицию) будут отфильтрованы

  • Маска файла (File Mask)
    Фильтр будет применяться только к файлам, имена которых удовлетворяют фильтру. Фильтр применяется только к именам файлов, не к именам каталогов

Для фильтров предусмотрено сохранение в предустановках подобно диапазонам символов.

Помимо основного фильтра в новой версии появилась возможность ручной фильтрации, имеющей приоритет над основной. Указать значение ручного (применять или нет) фильтра или сбросить его можно через контекстное меню на нужной строке.

Об обновлениях

 

В программе предусмотрена автоматическая проверка обновлений, но для ее работы нужно наличие SSL библиотек (libeay32.dll и ssleay32.dll). Они уже могут быть установлены (зарегистрированы) в вашей системе, например, другими программами. Узнать об этом можно просто открыв окно «About» (кнопа «?»). Если в открывшемся окне, есть флажок «Check for Update» значит библиотеки найдены. В случае их отсутствия и желания использовать функции обновления, вы можете скачать библиотеки самостоятельно, например, отсюда или из другого источника. Нужна версия для Win32. Если вы скачивали библиотеки отдельными файлами, то дальше вы можете их зарегистрировать в системе (для последующего использования другими утилитами) или просто скопировать в папку с UnityText.

Помимо проверки обновления, в UnityText есть возможность обновления данных по символам Unicode (с официального сайта), а также информации об алфавитах (с ресурса unicode-table.com). В отличии от первого, второму также нужно наличие SSL библиотек.

О прочем

 
  • Как работать с другими (не «Unity») файлами?
    Как я писал возможность такая в новой версии предусмотрена, но так как она не тестировалась, я ее решил скрыть. Если кому-то в ней заинтересован, то напишите мне в ЛС.
    Начиная с версии 2.1 «Расширенные настройки/Expert mode» доступны всем. Экспериментируйте на здоровье =)
  • Где русский?
    Это, как мне кажется, самый странный вопрос, который мне приходится слышать… от переводчиков =) Доступен начиная с версии 2.1. Скачать можно здесь.
  • А вы знали, что?..
    • В поле ввода пути можно использовать Enter для подтверждения
    • Там же можно указывать расширенные маски файлов с использованием символов подстановки
    • Там же можно указывать через «;» несколько масок файлов
    • В результатах сканирования можно сворачивать узлы файлов (двойной клик или стрелка влево на имени файла)
    • В предустановках всегда есть возможность загрузить последнюю не сохраненную, очистив поле ввода и нажав Enter
    • Там же, при заполненном поле, нажатие Enter позволит сохранить/загрузить предустановку
    • С помощью файла cfg, вы можете менять внешний вид программы, например, можно изменить размер/цвет шрифта/компонента
    • Для изменения максимального количества хранимых предустановок для путей, необходимо в файле cfg отредактировать значение атрибута «Tag» для узла «Components\btnPresetPathAdd»
    • Для изменения цвета категории символа необходимо в файле cfg добавить или отредактировать атрибут «Color» для узла «UCD\Category» (работает и для дочерних узлов), значение цвета задается в шестнадцатеричном формате BGR
    • Для обновления данных алфавитов можно указать язык (поддерживаемый unicode-table.com), для этого в файле cfg нужно добавить атрибут «Locale» для узла «UCD\Alphabets» со значением кода ISO 639-1 (двухбуквенное обозначение)
    • Для увеличения размера списка последних путей, необходимо в файле cfg отредактировать значение атрибута «Tag» для узла «Components\cbbPath»
    • Можно обмениваться предустановками через буфер обмена с помощью комбинации клавиш Ctrl+Shift+C/Ctrl+Shift+V, находясь внутри поля предустановок. При экспорте в буфер помещается xml, который можно передать другому пользователю.
  • Что еще может быть полезным для локализации игр на Unity?

История версий

Скрытый текст

 

Изменено пользователем StiGMaT
новая версия, редактирование информации
  • Спасибо (+1) 1
  • +1 2

Поделиться сообщением


Ссылка на сообщение

Заранее извиняюсь если есть косяки в тексте или форматировании, редактор на новой версии форума “тихий ужас” =(

А также большая просьба к тем кто владеет грамотным английским, буду благодарен за перевод (можно без воды, как у меня) текста.

Поделиться сообщением


Ссылка на сообщение

Воу! Что-то не воткнула меня новая версия, но нужно присесть на неё срочно для теста, а куда пропала золотая кнопка повторного сканирования, т.е. где не нужно опять выбирать путь к папке? Мульти для них сможешь добавить https://yadi.sk/d/l3tyb3nS3SkMYD?

Поделиться сообщением


Ссылка на сообщение

@makc_ar если ты о той, что была раньше a фильтрах, то теперь в ней нет необходимости, т.к.  фильтры обновляются при смене фокуса, т.е. если ты переключишься на что-то другое. Ну или их можно обновить из контекстного меню (ПКМ >Update). Если же тебе по каким-то причинам нужно пересканировать данные, то можешь просто нажать Enter в поле ввода пути к файлам.

Ну и по поводу “не воткнула”, надо чтобы ей начали пользоваться, чтобы сделать более “дружелюбной”, т.к. то, что понятно мне как разработчику, может быть совсем не понятно обычным пользователям. Именно поэтому и создал эту тему.

  • Спасибо (+1) 1

Поделиться сообщением


Ссылка на сообщение
2 часа назад, makc_ar сказал:

Мульти для них сможешь добавить https://yadi.sk/d/l3tyb3nS3SkMYD?

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

  • Спасибо (+1) 1

Поделиться сообщением


Ссылка на сообщение
6 часов назад, makc_ar сказал:

Мульти для них сможешь добавить https://yadi.sk/d/l3tyb3nS3SkMYD?

Собственно, глянул все еще раз, внимательнее первого, все работает как и должно, если добавить арабские символы в набор (Char ranges). Но тут есть такой нюанс, что при использовании экспорта в несколько столбцов (Multicolumn Mode) нельзя отфильтровать часть массива строк, только целиком (т.е. когда все элементы будут отфильтрованы). Если рассматривать конкретно твой случай, то названия языков (English и Arabic) так и будут маячить между строк, что собственно видно на скриншоте.

Вообще странные эти ребята-разработчики, зачем перед каждой строкой текста хранить название языка, да еще и в строке :fool:

Ну и главное, а зачем тебе (или не тебе?) арабский выдергивать вместе с английским? =)

Изменено пользователем StiGMaT

Поделиться сообщением


Ссылка на сообщение

@makc_ar эммм… и? Как будто в UnityText нельзя сделать тоже самое. Или другой софт выдернул с арабским в отдельной колонке? Разве ты не про это писал, когда спрашивал про “мульти”?

Поделиться сообщением


Ссылка на сообщение

@dawningteamvn это не MonoBehaviour файлы из архивов Unity, они больше похожи на файлы из твоих “favorite games”, которые ты мне высылал в ЛС :D

Конечно можно попробовать воспользоваться UnityText, для того чтобы вытащить текст, но мне сложно сказать насколько корректно она это сделает, потому что, как я тебе уже писал, я “очень плох” в китайском =)

Поделиться сообщением


Ссылка на сообщение
4 часа назад, StiGMaT сказал:

@dawningteamvn это не MonoBehaviour файлы из архивов Unity, они больше похожи на файлы из твоих “favorite games”, которые ты мне высылал в ЛС :D

Конечно можно попробовать воспользоваться UnityText, для того чтобы вытащить текст, но мне сложно сказать насколько корректно она это сделает, потому что, как я тебе уже писал, я “очень плох” в китайском =)

Hi StiGMaT, this is not from my favorite game :D Its an Unity game & I export its from bundle files. The CAB file contains txt files that me upload for you. So sad because I love chinese games :( Thank you for reply me :D 

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение
17 минут назад, makc_ar сказал:

Хотел свернуть, но что-то не получилось

Да это я перестарался слегка, исправлю в грядущем обновлении.

18 минут назад, makc_ar сказал:

я ещё хотел поменять имя в бинарной разметки шрифта, но название пропадает на редактирование строки. А можно сделать так, как это у обычных строк с текстом, т.е. выделение всей строки осталось?

Ты сейчас про UnityText? Про редактирование текста в самой утилите? Там все должно выделяться “как у обычных строк” при редактировании. В общем, я не понял тебя, поясни =)

Поделиться сообщением


Ссылка на сообщение

Вот название 890544dcce84.jpg

А на редаче такое сразу идёт 1c7ef342dcee.jpg

Вот разметки https://mega.nz/#!lkBzgKYD!jxCRA4LjVWOmBKErg96lQc_X3aOF-u9pS0k1RsdmRz4, а тип у них 1.1.2 для UnityFont? 

 

@StiGMaT 

И ещё можно поменять цвет на слово, это которое поисковик нашёл, а то всё сливается.

Поделиться сообщением


Ссылка на сообщение
11 часов назад, makc_ar сказал:

Вот название 890544dcce84.jpg

А на редаче такое сразу идёт 1c7ef342dcee.jpg

На лицо явно проблема с настройками диапазонов символов! Разве название должно включать “символы для рисования рамок” (или что это там за символы)? К тому же, походу кроме них даже “пустой символ” (u+0000) включен в диапазон. Закрадывается ощущение что кто-то просто выбрал “все, что можно”, а я писал в шапке почему так делать не рекомендуется. При правильных настройках (например с теми же настройками по-умолчанию, идущими с утилитой, которые включают в себя только основную и дополнительную латиницу) результат будет вполне корректным:

UT2_04.png

11 часов назад, makc_ar сказал:

тип у них 1.1.2 для UnityFont? 

1.2 со смещением 13

11 часов назад, makc_ar сказал:

поменять цвет на слово

Не понял, цвет подсветки строки с найденным текстом что ли? Сейчас на нее переключается фокус и она затемняется (при активной панели результатов подсвечивается), фактически для длинных списков это почти всегда последняя видимая строка (т.к. в отличии от первой версии я отключил здесь центрирование по выделенному).

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: DragonZH
      Программа для работы с архивами Unity.
      Скачать UnityEX yandex
      Скачать UnityEX dropbox
      Сборник bat файлов для консольного режима
      UnityEX_Soft для дополнительной конвертации файлов и получения текстовых дампов xml, папка подключается из настроек UnityEX
      Несколько шаблонов xml для проектов на cpp2il
      Покупка ключа платных версий UnityEX:
       

      В комментариях, пожалуйста, укажите “За UnityEX” или на почту dragonzh@yandex.ru.
      Платная версии UnityEX
      Ultimate версия, поддержка юнити до 2020-2021 и возможно выше, обработка звуков, видео, спрайтов, обработка текстовых дампов.
      Оплата происходит на реквизиты в программе. Нужно связаться со мной @DragonZH, по оплате вышлю ключ.
      Передача ключа другим людям не допускается, иначе ключ будет заблокирован!
      Также возможна блокировка ключа при использовании VPN или прокси!
    • Автор: SerGEAnt

      Специалисты считают, что виной всему перенасыщение рынка, начавшееся в период пандемии. Увольнения продолжатся в течение всего 2024 года.
      Сайт Video Games Layoffs подсчитал, что за январь в компаниях, связанных с игровой индустрией, было уволено уже 5700 человек. Это больше половины от числа уволенных в 2023 году (10,5 тысяч).

      Лидеры по числу сокращений:
      Microsoft — 1900 человек Unity — 1800 человек Riot Games — 530 человек Twitch — 500 человек PlayTika — 350 человек Специалисты считают, что виной всему перенасыщение рынка, начавшееся в период пандемии. Увольнения продолжатся в течение всего 2024 года.


Zone of Games © 2003–2024 | Реклама на сайте.

×