Комментарии 35
2018 год на дворе, а люди по-прежнему занимаются копи-пастингом переводов из/в CSV и Excel.
Существуют же gettext а также миллиард программ и сервисов для перевода файлов gettext. Строки автоматически собираются из исходного кода (никто не должен вручную проверять и вносить правки при изменении кода/ресурсов), переводчики сразу видят строки, которые надо перевести, переводы валидируются (например, чтобы не возникало ошибок из-за опечаток в названиях placeholder'ов, таких как Сишные %s
, %d
), после перевода все переведенные строки автоматически доступны приложению.
Для перевод po файлов существует просто прорва онлайн сервисов, GUI программ, self-hosted сервисов (я, например, использую сейчас Weblate).
Как при всем таком многообразии инструментов, которые значительно автоматизируют и облегчают процесс, рекомендовать до сих пор CSV и Excel?.. Неужели Unity не поддерживает ничего лучше?
Наверное в играх строк немного. Просто я работал в проектах, где локализация производится через Excel. Это просто средневековье какое-то. Людям приходится вручную заниматься монотонным копированием строк туда-сюда, в котором очень легко ошибиться. Неблагодарная тяжелая работа, которая элементарно автоматизируется, и решения для автоматизации придуманы очень давно (GNU gettext появился в 1995 году).
Так в gettext ничего сложного нет. Строки помечаются в исходном тесте (чаще всего используется синтаксис _("строка")
). Утилиты gettext сканируют исходный текст, находят отмеченные строки и записывают в .po файл.
.po файл можно переводить вручную, как тот же csv, можно преобразовать в csv, можно редактировать GUI редактором (существует множество), можно отдать на аутсорс, можно загрузить в онлайн-сервис наподобие OneSky, можно установить свой веб-сервис, такой как Weblate (у Weblate есть еще не менее 5 аналогов).
Затем полученный переведенный файл распространяется вместе с продуктом, и во всех местах вызов gettext (_("строка")
) подставляет переведенный текст. Все, кроме собственно перевода, полностью автоматизировано. Перевод, в зависимости от выбранного решения, тоже можно полностью или частично автоматизировать.
Один раз настраивается, затем все происходит автоматически. Один раз попробовав, уже не захочется ничего другого.
Ну а CSV я тоже работал, конечно. Когда строк больше сотни, тут уже на каждой итерации требуется значительное количество ручного труда.
Задаются ограничители данных, списки выбора и т.п. Первая строка — имена JSON-полей, вторая строка — символы для экранирования (по сути определяют тип данных). От дизайнера защищены как 2 первые строки, так и первый столбец. Это все дампится через CSV, потом автоматически конвертится в JSON и складывается в Resources. В рантайме уже происходит загрузка и маппинг прямо на внутренние классы через JsonUtility или что-то иное.
Но там без связей. И вот связи приходится на клиенте восстанавливать. Инспектор кастомный делать не нужно, кнопку скачивания можно вынести в меню.
То что надо на лету подсасывать, это уже должно быть из нормальной базы данных с нормальным бекэндом. Api гугла медленное, чтобы не злоупотребляли. Для ГД еще можно сделать, для игроков — нет. Поэтому скрипты для работы я в Editor засунул.
И почему я раньше не услышал о таком
В статье, насколько я понял, переведенные строки загружаются из .po файла. Обычно готовый po файл компилируется в бинарный .mo файл: https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
Не знаю, насколько критична разница в скорости доступа.
А вообще, тема довольно старая и уже деланная-переделанная много раз, даже на хабре были ссылки.
*) Локализатор: поддерживает загрузку фиксированных данных, а так же «динамических» (можно подгружать / выгружать с возможностью переопределения ключей).
*) Локализация компонента Text uGui: поддерживает автоматическое обновление при смене языка в локализаторе.
*) Локализация компонента Image uGui: поддерживает автоматическое обновление при смене языка в локализаторе.
*) Скачивание нескольких CSV-файлов с сохранением url / путей: поддерживает конвертацию в JSON-array / JSON-dict.
*) Скачивание нескольких CSV-файлов в виде отдельного репозитория без зависимостей.
CSV (Comma Separated Values). Это текстовый файл, в котором все ячейки разделены разделителем — либо запятой (","), либо точкой с запятой (";")
Наличие точки или точки с запятой в самом тексте в одной из ячеек не порушит структуру файла?
Локализация игр и приложений в Unity. Быстро и удобно