1 #include "include/usbld.h"
2 #include "include/lang.h"
3 #include "include/util.h"
4 #include "include/fntsys.h"
5 #include "include/ioman.h"
8 static char *internalEnglish
[LANG_STR_COUNT
] = {
10 " WELCOME TO OPEN PS2 LOADER. MAIN CODE BASED ON SOURCE CODE OF HD PROJECT <http://psx-scene.com> ADAPTATION TO USB ADVANCE FORMAT AND INITIAL GUI BY IFCARO <http://ps2dev.ifcaro.net> MOST OF LOADER CORE IS MADE BY JIMMIKAELKAEL. ALL THE GUI IMPROVEMENTS ARE MADE BY VOLCA. THANKS FOR USING OUR PROGRAM ^^",
17 "Error writing settings!",
26 "Network startup error: %d",
31 "Remove all settings",
32 "Removed all keys for the game",
40 "Error while loading the Game ID",
42 "Error loading the language file",
43 "Disable Debug Colors",
44 "No controller detected, waiting...",
51 "USB device start mode",
52 "HDD device start mode",
53 "ETH device start mode",
54 "Applications start mode",
58 "HDL Server Starting...",
59 "HDL Server Running... Press [O] to stop",
60 "Press [X] to terminate HDL server",
61 "HDL Server Unloading...",
74 "Item will be permanently deleted, continue ?",
79 "Enable Delete and Rename actions",
80 "Check USB game fragmentation",
81 "Remember last played game",
82 "Error, the game is fragmented",
83 "Error, could not run the item",
85 "Leave empty for GUEST auth.",
86 "Load alternate core",
87 "Alternative data read method",
94 "Alternate IGR combo",
95 "Changing the size will reformat the VMC",
107 "Invalid VMC file, size is incorrect",
108 "VMC file need to be created",
109 "Error with VMC %s, continue with physical MC (slot %d) ?",
115 "Leave empty to exit to Browser",
116 "Value in minute(s), 0 to disable spin down",
117 "Automatic HDD spin down",
126 "Leave empty to list shares",
147 "Apply a delay to CDVD functions (0 is default)"
150 static int guiLangID
= 0;
151 static char **lang_strs
= internalEnglish
;
152 static int nValidEntries
= LANG_STR_COUNT
;
154 static int nLanguages
= 0;
155 static language_t languages
[MAX_LANGUAGE_FILES
];
156 static char **guiLangNames
;
158 // localised string getter
159 char *_l(unsigned int id
) {
160 return lang_strs
[id
];
163 static void lngFreeFromFile() {
168 for(; strId
< nValidEntries
; strId
++) {
169 free(lang_strs
[strId
]);
170 lang_strs
[strId
] = NULL
;
176 static int lngLoadFromFile(char* path
, char *name
) {
177 file_buffer_t
* fileBuffer
= openFileBuffer(path
, O_RDONLY
, 1, 1024);
179 // file exists, try to read it and load the custom lang
180 lang_strs
= (char**) malloc(LANG_STR_COUNT
* sizeof(char**));
183 while (strId
< LANG_STR_COUNT
&& readFileBuffer(fileBuffer
, &lang_strs
[strId
])) {
186 closeFileBuffer(fileBuffer
);
188 LOG("LANG Loaded %d entries\n", strId
);
190 // remember how many entries were read from the file (for the free later)
191 nValidEntries
= strId
;
193 // if necessary complete lang with default internal
194 while (strId
< LANG_STR_COUNT
) {
195 LOG("LANG Default entry added: %s\n", internalEnglish
[strId
]);
196 lang_strs
[strId
] = internalEnglish
[strId
];
201 snprintf(path
, 255, "%s/font_%s.ttf", gBaseMCDir
, name
);
202 LOG("LANG Custom font path: %s\n", path
);
203 fntLoadDefault(path
);
210 char* lngGetValue() {
211 return guiLangNames
[guiLangID
];
214 static int lngReadEntry(int index
, char* path
, char* separator
, char* name
, unsigned int mode
) {
215 if (!FIO_SO_ISDIR(mode
)) {
216 if(strstr(name
, ".lng") || strstr(name
, ".LNG")) {
218 language_t
* currLang
= &languages
[index
];
220 // filepath for this language file
221 int length
= strlen(path
) + 1 + strlen(name
) + 1;
222 currLang
->filePath
= (char*) malloc(length
* sizeof(char));
223 sprintf(currLang
->filePath
, "%s%s%s", path
, separator
, name
);
225 // extract name for this language (will be used for the English translation)
226 length
= strlen(name
) - 5 - 4 + 1;
227 currLang
->name
= (char*) malloc(length
* sizeof(char));
228 memcpy(currLang
->name
, name
+ 5, length
);
229 currLang
->name
[length
- 1] = '\0';
231 /*file_buffer_t* fileBuffer = openFileBuffer(currLang->filePath, 1, 1024);
233 // read localized name of language from file
234 if (readLineContext(fileBuffer, &currLang->name))
235 readLineContext(fileBuffer, &currLang->fontName);
236 closeFileBuffer(fileBuffer);
248 nLanguages
= listDir(gBaseMCDir
, "/", MAX_LANGUAGE_FILES
, &lngReadEntry
);
250 // build the languages name list
251 guiLangNames
= (char**) malloc((nLanguages
+ 2) * sizeof(char**));
253 // add default internal (english)
254 guiLangNames
[0] = internalEnglish
[0];
257 for (; i
< nLanguages
; i
++) {
258 guiLangNames
[i
+ 1] = languages
[i
].name
;
261 guiLangNames
[nLanguages
+ 1] = NULL
;
268 for (; i
< nLanguages
; i
++) {
269 free(languages
[i
].name
);
270 free(languages
[i
].filePath
);
278 void lngSetGuiValue(int langID
) {
279 if (guiLangID
!= langID
) {
284 language_t
* currLang
= &languages
[langID
- 1];
285 if (lngLoadFromFile(currLang
->filePath
, currLang
->name
)) {
291 lang_strs
= internalEnglish
;
296 int lngGetGuiValue() {
300 int lngFindGuiID(char* lang
) {
303 for (; i
< nLanguages
; i
++) {
304 if (stricmp(languages
[i
].name
, lang
) == 0)
305 return i
+ 1; // shift for Gui id
311 char **lngGetGuiList() {