Вместо того чтобы заняться делом и лепить прошивку паялки, решил сначала позакрывать явные пробелы в LittlevGL. Один из них - поддержка интернационализации. Вообще, формально, есть gettext, но он хранит словари в файловой системе, а для эмбедов надо что-то другое.
И как-то вот не получилось найти под сишечку достаточно гибких и удобных решений. Возможно, плохо искал. Но что-то мне подсказывает, что дело в отсутствии пакетного менеджера, из-за чего вагон сишных библиотек зависает на уровне поделок энтузиастов. В общем, решил что быстрее запилить свое. С мыслью что на Rust это потом тоже пригодиться.
Несмотря на название, получилась довольно универсальная вещь, работающая по тем же принципам что gettext:
Фразы сканируются в yaml-файлы (формат как в формат в ruby)
Потом можно либо заполнить переводы ручками, либо прокинуть дальше, в веб-переводилки (потому что формат файлов стандартный)
В любой момент можно “скомпилировать” переводы в С-шный исходник.
С учетом “особенностей” сишечки, чтобы не возиться с внешними библиотеками, скрипты генерят 2 файла (“lv_i18n.h” и “lv_i18n.c”), в которых есть все что надо.
Сами скрипты написаны на node.js, вроде эту штуку уже все научились себе ставить.
Там еще есть над чем поработать, например улучшить качество регулярок для извлечения текстов, прикрутить поддержку плавучки. Но это будем решать в рабочем порядке.
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"39c21abc3df9550077797d18":{"_id":"39c21abc3df9550077797d18","hid":349,"name":"Vitaly","nick":"Vitaly","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"5c7697b3997073007711883a","hid":23754,"title":"i18n для эмбедов","html":"<p><a href=\"https://github.com/littlevgl/lv_i18n\" class=\"link link-ext link-auto\" data-nd-link-type=\"autolink\" data-nd-link-orig=\"https://github.com/littlevgl/lv_i18n\" target=\"_blank\" rel=\"nofollow noopener\">github.com/littlevgl/lv_i18n</a></p>\n<p>Вместо того чтобы заняться делом и лепить прошивку паялки, решил сначала позакрывать явные пробелы в LittlevGL. Один из них - поддержка интернационализации. Вообще, формально, есть gettext, но он хранит словари в файловой системе, а для эмбедов надо что-то другое.</p>\n<p>И как-то вот не получилось найти под сишечку достаточно гибких и удобных решений. Возможно, плохо искал. Но что-то мне подсказывает, что дело в отсутствии пакетного менеджера, из-за чего вагон сишных библиотек зависает на уровне поделок энтузиастов. В общем, решил что быстрее запилить свое. С мыслью что на Rust это потом тоже пригодиться.</p>\n<p>Несмотря на название, получилась довольно универсальная вещь, работающая по тем же принципам что gettext:</p>\n<ul>\n<li>Фразы сканируются в yaml-файлы (формат как в формат в ruby)</li>\n<li>Потом можно либо заполнить переводы ручками, либо прокинуть дальше, в веб-переводилки (потому что формат файлов стандартный)</li>\n<li>В любой момент можно “скомпилировать” переводы в С-шный исходник.</li>\n</ul>\n<p>С учетом “особенностей” сишечки, чтобы не возиться с внешними библиотеками, скрипты генерят 2 файла (“lv_i18n.h” и “lv_i18n.c”), в которых есть все что надо.</p>\n<!--cut-->\n<p>Сами скрипты написаны на node.js, вроде эту штуку уже все научились себе ставить.</p>\n<p>Там еще есть над чем поработать, например улучшить качество регулярок для извлечения текстов, прикрутить поддержку плавучки. Но это будем решать в рабочем порядке.</p>\n","user":"39c21abc3df9550077797d18","ts":"2019-02-27T13:59:15.000Z","st":1,"cache":{"comment_count":0},"views":455,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}