PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Русификация игр и софта для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=190)
-   -   Русификация приложений на VLF Library (https://www.pspx.ru/forum/showthread.php?t=92629)

vit9696 26.07.2011 20:15

Русификация приложений на VLF Library
 
Доброго времени суток, думаю все помнят о существовании VLF Library - фреймворка созданного в относительно далеком прошлом самим Dark_AleX (ссылка). Данный фреймворка позволяет минимум использовать оформление в стиле Sony UPDATER, а также таит в себе немало интересных возможностей, связанных с использованием объектов из *.rco.

Все началось с того момента, как Frostegater стал писать прогу Everest, когда еще она тестировалась, я его начал допекать: "почему ты не сделаешь прогу с поддержкой русского языка?" Однако, когда уговоры начали потихоньку помогать и мы стали терзать VLF возникли интересные проблемы.

В документации к VLF существует как раз нужная функция:
Код:

/**
 * Adds a new text item from an unicode string.
 *
 * @param x - x position
 * @param y - y position
 * @param string - unicode string with the desired text
 *
 * @returns a VlfText item on success, NULL on error.
*/
VlfText vlfGuiAddTextW(int x, int y, u16 *string);

А именно она выводит UNICODE текст на божий свет в программе. Однако при попытке ее использовать - никаких успехов выявлено не было, разве что на экранчике появлялось что-то странное...

Далее пошло время разных попыток и бредовых идей), в том числе даже о переписке библиотеки intraFont оговаривалось... (Хорошо, что дальше этого "оговаривания" дело не пошло :) )

Через некоторое время я, подумав, решил попробовать пойти путем, как бы это сказать правильно - несколько нестандартным...
Код:

/**
 * Adds a new text item from a resource label
 *
 * @param rco - The resource file to load the label from.
 * @param name - The name of the resource.
 * @param x - x position
 * @param y - y position
 *
 * @returns a VlfText item on success, NULL on error.
*/
VlfText vlfGuiAddTextResource(char *rco, char *name, int x, int y);

А именно загрузить текст из *.rco файла. Как это ни странно, однако функция вида
Код:

vlfGuiAddTextResource("ms0:/lang.rco", "my_resource_value", 10, 180);
Действительно отобразила русский текст, и даже больше, при добавленной опции:
Код:

vlfGuiGetLanguage();
Приложение автоматически использовало все доступные языки на PSP (загружалось все естественно с языком по умолчанию).

Однако у такого метода есть недостатки, о которых мне тут же "напомнил" Frost:
  1. К RCO требуется писать полный путь, что повлечет проблемы с ms0:/ и ef0:/, а также названием каталога самой хомки
  2. Такой RCO файл, несмотря даже на возможные функции кэширования является лишней нагрузкой на файловую систему

Но когда загрузка русского текста из RCO удалась, Frost выдал интересную идею: в каком же формате хранится текст в rco что он нормально воспроизводится через VLF?

Данная идея оказалась ключевой.... Через некоторое время из RCO удалось вытащить русский алфавит, вот он кстати:
(Вначале идёт буква, затем следует два хекс значения)
Код:

А 1004
Б 1104
В 1204
Г 1304
Д 1404
Е 1504
Ё 0104
Ж 1604
З 1704
И 1804
Й 1904
К 1A04
Л 1B04
М 1C04
Н 1D04
О 1E04
П 1F04
Р 2004
С 2104
Т 2204
У 2304
Ф 2404
Х 2504
Ц 2604
Ч 2704
Ш 2804
Щ 2904
Ъ 2A04
Ы 2B04
Ь 2C04
Э 2D04
Ю 2E04
Я 2F04

а 3004
б 3104
в 3204
г 3304
д 3404
е 3504
ё 5104
ж 3604
з 3704
и 3804
й 3904
к 3A04
л 3B04
м 3C04
н 3D04
о 3E04
п 3F04
р 4004
с 4104
т 4204
у 4304
ф 4404
х 4504
ц 4604
ч 4704
ш 4804
щ 4904
ъ 4A04
ы 4B04
ь 4C04
э 4D04
ю 4E04
я 4F04

Данная кодировка отлично подошла к функции VlfText vlfGuiAddTextW и, о чудо, родной русский язык появился без всяких извращений.

Далее интересный факт:
чтобы понять что это за кодировка такая (4D04, 3904 и т.д.) понадобился не один час :blush:, забавно да? (для тех кто не понял - вопрос на засыпку в каком порядке пишутся символы в prx? (Пример "Загадочной кодировки")

Надеюсь, что помогли кому-то (с) Frostegater & vit9696 2011.

Yoti 27.07.2011 13:50

1. Кодировку языков в прошивке давным-давном разбирали. Поискали бы хоть для начала...
2. Какая проблема взять путь к хомке как нолевой параметр минус последние 9 символов (eboot.pbp) и плюс имя rco?
P.S. По первым двум представителям алфавита видно, что это utf16le (с высокой вероятностью).

frostegater 27.07.2011 13:57

Yoti, кстати ты не в курсе как можно заюзать vlfAddTextW подобно vlfAddTextF (этот умеет выводить статус функции.. ну типо vlfAddTextF("%d", alpha);)...?

Yoti 27.07.2011 14:07

Собирать строку с параметром отдельной функцией до вывода.
strcat или sprintf(swprintf).

vit9696 27.07.2011 14:20

Цитата:

1. Кодировку языков в прошивке давным-давном разбирали. Поискали бы хоть для начала...
:unknw: Но зато инструкции не было ;)
Цитата:

2. Какая проблема взять путь к хомке как нолевой параметр минус последние 9 символов (eboot.pbp) и плюс имя rco?
Хммм, ты прав, а функцию для определения текущего пути хомки не подскажешь?
Цитата:

P.S. По первым двум представителям алфавита видно, что это utf16le (с высокой вероятностью).
Ну как бэ...
Цитата:

(Пример "Загадочной кодировки")
Цитата:

Собирать строку с параметром отдельной функцией до вывода.
strcat или sprintf(swprintf).
+1
Однако интересует другой вопрос, если строку с параметром собрать таким образом можно, то как же собрать пункты меню? Там так не сделаешь.....

Yoti 27.07.2011 15:07

Цитата:

Сообщение от vit9696 (Сообщение 973542)
Хммм, ты прав, а функцию для определения текущего пути хомки не подскажешь?

Что насчёт учебников по Си? Зачем вы их игнорируете?
Код:

int main(int argc, char *argv[])
{
        printf("%s\n", argv[0]);
}



Текущее время: 04:35. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.