PDA

Просмотр полной версии : Русификация приложений на VLF Library


vit9696
26.07.2011, 20:15
Доброго времени суток, думаю все помнят о существовании VLF Library - фреймворка созданного в относительно далеком прошлом самим Dark_AleX (ссылка (http://dl.qj.net/psp/development/vlf-library-10.html)). Данный фреймворка позволяет минимум использовать оформление в стиле Sony UPDATER, а также таит в себе немало интересных возможностей, связанных с использованием объектов из *.rco.

Все началось с того момента, как Frostegater стал писать прогу Everest (http://wololo.net/talk/viewtopic.php?f=2&t=7873), когда еще она тестировалась, я его начал допекать: "почему ты не сделаешь прогу с поддержкой русского языка?" Однако, когда уговоры начали потихоньку помогать и мы стали терзать 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:
К RCO требуется писать полный путь, что повлечет проблемы с ms0:/ и ef0:/, а также названием каталога самой хомки
Такой 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? (Пример "Загадочной кодировки" (http://www.fileformat.info/info/unicode/char/44e/index.htm))

Надеюсь, что помогли кому-то (с) 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 (с высокой вероятностью).
Ну как бэ...
(Пример "Загадочной кодировки" (http://www.fileformat.info/info/unicode/char/44e/index.htm))
Собирать строку с параметром отдельной функцией до вывода.
strcat или sprintf(swprintf).
+1
Однако интересует другой вопрос, если строку с параметром собрать таким образом можно, то как же собрать пункты меню? Там так не сделаешь.....

Yoti
27.07.2011, 15:07
Хммм, ты прав, а функцию для определения текущего пути хомки не подскажешь?
Что насчёт учебников по Си? Зачем вы их игнорируете?
int main(int argc, char *argv[])
{
printf("%s\n", argv[0]);
}