Programming

Lua + Unicode

27 апр 2010 11:35
+13
(Текст записи скрыт. Показать...)
После того, как мы японский в ASCII и картинки запихивали, возникла необходимость добавить к игре поддержку Unicode. Вся локализация у нас лежит в Луа файлах (ингейм тексты и ГУИ).

Самой первой идеей было изменить все char в wchar_t (т.е. перейти на utf16). Но, как оказалось возникает море проблем с Луа. Т.к. там кругом используется char и портов для wchar_t я не нашел.

После рытья док, увидел что Lua неплохо дружит с utf8 в своих строчках. В этом случае даже менять что-то в основном коде игр не надо. Достаточно изменить обработку и вывод строк. И, наверное, стоит двигаться в этом направлении.

Вот теперь я на перепутье. Правильное ли направление? Возможно есть уже готовые решения. Наверняка с подобным сталкивались многие. Как у вас реализована поддержка Unicode с использованием Lua?
Отправлено 27.04.2010 в 12:59
Отвечает на сообщение 345793
+2
У меня вопрос:
зачем ингейм тексты и гуи строки в явном виде в ЛУА файлах?

Может стоит устранить саму проблему на корню с помощью уникодовой таблички, хотя бы в txt табделимитед, а в луа работать непосредственно через идентификаторы?

Так локализовывать проще. Я правда не в курсе насколько это сложно для вашего проекта. И если это не просто - подумайте об этом при разработке следующего.

На мой взгляд прокинуть в ЛУА функцию типа:

ctrl:SetTextById("game_help08_line01")

вместо

ctrl:SetText("The cannons starts firing at")

и забыть практически про ЛУА файлы при локализации...
совсем не сложно.
Отправлено 27.04.2010 в 13:16
Отвечает на сообщение 345794
0
Макс Тумин пишет:
>
> Может стоит устранить саму проблему на корню с помощью
> уникодовой таблички, хотя бы в txt табделимитед, а в
> луа работать непосредственно через идентификаторы?


Остается вопрос если строка собирается с подстрок с заменой из полей текстового ввода.
Отправлено 27.04.2010 в 13:41
Отвечает на сообщение 345800
0
Максим Горбань пишет:
>
> Остается вопрос если строка собирается с подстрок с
> заменой из полей текстового ввода.

Это тоже решаемо.
причем не на луа. содержимое полей текстового ввода - оно ведь не в луа хранится, надеюсь? да и вывод таких сложных строк должен не на луа обрабатываться.

да и не мешает ничто прокинуть даже такую функцию в Луа если очень надо именно в луа это делать:
SetFormattedTextByIds("text_id", "input_id1", "input_id2",..., "input_id_10")

функция пишется сразу под максимально возможное количество подстрок инпута - на которые надо ссылаться через идентификаторы полей ввода. и может принимать в качестве инпута nil.
в самом тексте по идентификатору - расставлены маркеры, в нужном количестве, в нужных местах.

При желании можно все. Учитывая сколько времени это сэкономит потом при локализациях - тут даже и сомневаться не надо как делать.
Денис Мальцев  27.04.2010 16:31
Отправлено 28.04.2010 в 00:23
Отвечает на сообщение 345800
+2
Максим Горбань пишет:
> Остается вопрос если строка собирается с подстрок с
> заменой из полей текстового ввода.

Подстроки - зло. Лучше одна строка, в которой есть некие меняющиеся данные(которые ещё к тому же в разных языках могут быть расположены в разном порядке).
Можно сделать парсилку которая из строки, типа
"Убито бобров [1] из [2], спасено деревьев [1]", (что соответствует локализационному ключу beaver_stats) и данных 10 и 20 формирует соответственную строку.
Например с помощью функции типа getstrn("beaver_stats", 10, 20).
Эта функция довольно просто пишется, на самом деле.
Вообще осторожно, локализацию в скриптах инквизиция может посчитать локализацией в коде.
Отправлено 27.04.2010 в 13:02
Отвечает на сообщение 345793
0
в luaplus есть unicode16 строки, можно там, наверное, посмотреть, что да как http://luaplus.org/
Отправлено 27.04.2010 в 16:32
Отвечает на сообщение 345796
0
Спасибо за ссылку. Уже смотрю :)
Отправлено 27.04.2010 в 13:47
Отвечает на сообщение 345793
0
У нас в движке, как раз utf8 используем и луа. Вроде все удобно.
Если нужна помощь, стукай в личку.
Отправлено 27.04.2010 в 17:26
Отвечает на сообщение 345793
+1
1. Локализация хорошо хранится отдельно. Можно даже в выделенных .lua файлах. Но со специальными текстовыми ресурсами и тулзой переводчики разберутся быстрее и качественнее. Миграция - заменить в .lua игровые тексты на GetTranslated(...), а в свойствах GUI объектов сделать автоперевод - обходится недорого.

2. Лучше UTF-8, его хоть с UCS-2 не перепутают. Специфика не только в том, что UCS-2 не может хранить значения за пределами BMP, вынуждая использовать UTF-16. Даже в случае UCS-4, который вмещает все code points, остаются combining symbols и управляющие коды. И длина в байтах (равно как и длина в code points) не является чем-то показательным для символьной длины текста.
Списки доступа
  • Подписчики [675]
  • Белый список [19]
  • Черный список [3]
Права доступа
Вы можете читать группу, но не можете отвечать на сообщения и создавать новые темы.
Доступ для остальных:
анонимы : могут читать
новые : могут читать
постоянные : полный доступ

Copyright © 2021 ООО "ДТФ.РУ". Все права защищены.

Воспроизведение материалов или их частей в любом виде и форме без письменного согласия запрещено.

Замечания и предложения отправляйте через форму обратной связи.

Пользовательское соглашение