extracted code branching from ItemsList drawing and main drawing method
[open-ps2-loader.git] / src / lang.c
blobc94c6afffcd3135cacaed6836e7e15279576e021
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"
7 // Language support
8 static char *internalEnglish[LANG_STR_COUNT] = {
9 "English (internal)",
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 ^^",
11 "Open PS2 Loader %s",
12 "Save changes",
13 "Back",
14 "Network config",
15 "<no values>",
16 "Settings saved...",
17 "Error writing settings!",
18 "Exit",
19 "Settings",
20 "USB Games",
21 "HDD Games",
22 "Network Games",
23 "Apps",
24 "Theme",
25 "Language",
26 "Network startup error",
27 "On",
28 "Off",
29 "Ok",
30 "Game settings",
31 "Remove all settings",
32 "Removed all keys for the game",
33 "Scrolling",
34 "Slow",
35 "Medium",
36 "Fast",
37 "Default menu",
38 "Load from disc",
39 "Please wait",
40 "Error while loading the Game ID",
41 "Automatic sorting",
42 "Error loading the language file",
43 "Disable Debug Colors",
44 "No controller detected, waiting...",
45 "Enable Cover Art",
46 "Wide screen",
47 "Power off",
48 "Loading config",
49 "Saving config",
50 "Start device",
51 "USB device start mode",
52 "HDD device start mode",
53 "ETH device start mode",
54 "Applications start mode",
55 "Auto",
56 "Manual",
57 "Start HDL Server",
58 "HDL Server Starting...",
59 "HDL Server Running... Press [O] to stop",
60 "Press [X] to terminate HDL server",
61 "HDL Server Unloading...",
62 "IGR path",
63 "Background color",
64 "Text color",
65 "IP",
66 "Mask",
67 "Gateway",
68 "Port",
69 "Share",
70 "User",
71 "Password",
72 "<not set>",
73 "Accept",
74 "Item will be permanently deleted, continue ?",
75 "Rename",
76 "Delete",
77 "Run",
78 "Display settings",
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",
84 "Test",
85 "Leave empty for GUEST auth.",
86 "Load alternate core",
87 "Alternative data read method",
88 "Unhook Syscalls",
89 "0 PSS mode",
90 "Disable DVD-DL",
91 "Disable IGR",
92 "Reduced cdvdfsv buffer",
93 "Hide dev9 module",
94 "Alternate IGR combo",
95 "Changing the size will reformat the VMC",
96 "Create",
97 "Modify",
98 "Abort",
99 "Reset",
100 "Use generic",
101 "Configure VMC",
102 "Name",
103 "Size",
104 "Status",
105 "Progress",
106 "VMC file exist",
107 "Invalid VMC file, size is incorrect",
108 "VMC file need to be created",
109 "Error with VMC file, continue with physical MC ?",
110 "Automatic refresh",
111 "About",
112 "Coders",
113 "USB delay",
114 "USB prefix path",
115 "Leave empty to exit to Browser",
116 "Value in minute(s), 0 to disable spin down",
117 "Automatic HDD spin down",
118 "Video mode",
119 "Dialog color",
120 "Selected color",
121 "Display info page",
122 "Info",
125 static int guiLangID = 0;
126 static char **lang_strs = internalEnglish;
127 static int nValidEntries = LANG_STR_COUNT;
129 static int nLanguages = 0;
130 static language_t languages[MAX_LANGUAGE_FILES];
131 static char **guiLangNames;
133 // localised string getter
134 char *_l(unsigned int id) {
135 return lang_strs[id];
138 static void lngFreeFromFile() {
139 if (guiLangID == 0)
140 return;
142 int strId = 0;
143 for(; strId < nValidEntries; strId++) {
144 free(lang_strs[strId]);
145 lang_strs[strId] = NULL;
147 free(lang_strs);
148 lang_strs = NULL;
151 static int lngLoadFromFile(char* path, char *name) {
152 file_buffer_t* fileBuffer = openFileBuffer(path, O_RDONLY, 1, 1024);
153 if (fileBuffer) {
154 // file exists, try to read it and load the custom lang
155 lang_strs = (char**) malloc(LANG_STR_COUNT * sizeof(char**));
157 int strId = 0;
158 while (strId < LANG_STR_COUNT && readFileBuffer(fileBuffer, &lang_strs[strId])) {
159 strId++;
161 closeFileBuffer(fileBuffer);
163 LOG("LANG: #### Loaded %d entries\n", strId);
165 // remember how many entries were read from the file (for the free later)
166 nValidEntries = strId;
168 // if necessary complete lang with default internal
169 while (strId < LANG_STR_COUNT) {
170 LOG("LANG: #### Default entry added: %s\n", internalEnglish[strId]);
171 lang_strs[strId] = internalEnglish[strId];
172 strId++;
175 int size = -1;
176 char path[255];
177 snprintf(path, 255, "%s/font_%s.ttf", gBaseMCDir, name);
179 LOG("#### Custom font path: %s\n", path);
181 void* customFont = readFile(path, -1, &size);
182 if (customFont)
183 fntReplace(FNT_DEFAULT, customFont, size, 1, 1); // consider fonts loaded through language as default, so they won't be reset-ed when changing themes
184 else
185 fntSetDefault(FNT_DEFAULT);
187 return 1;
189 return 0;
192 char* lngGetValue() {
193 return guiLangNames[guiLangID];
196 static int lngReadEntry(int index, char* path, char* separator, char* name, unsigned int mode) {
197 if (!FIO_SO_ISDIR(mode)) {
198 if(strstr(name, ".lng") || strstr(name, ".LNG")) {
200 language_t* currLang = &languages[index];
202 // filepath for this language file
203 int length = strlen(path) + 1 + strlen(name) + 1;
204 currLang->filePath = (char*) malloc(length * sizeof(char));
205 sprintf(currLang->filePath, "%s%s%s", path, separator, name);
207 // extract name for this language (will be used for the English translation)
208 length = strlen(name) - 5 - 4 + 1;
209 currLang->name = (char*) malloc(length * sizeof(char));
210 memcpy(currLang->name, name + 5, length);
211 currLang->name[length - 1] = '\0';
213 /*file_buffer_t* fileBuffer = openFileBuffer(currLang->filePath, 1, 1024);
214 if (fileBuffer) {
215 // read localized name of language from file
216 if (readLineContext(fileBuffer, &currLang->name))
217 readLineContext(fileBuffer, &currLang->fontName);
218 closeFileBuffer(fileBuffer);
221 index++;
224 return index;
227 void lngInit() {
228 fntInit();
230 nLanguages = listDir(gBaseMCDir, "/", MAX_LANGUAGE_FILES, &lngReadEntry);
232 // build the languages name list
233 guiLangNames = (char**) malloc((nLanguages + 2) * sizeof(char**));
235 // add default internal (english)
236 guiLangNames[0] = internalEnglish[0];
238 int i = 0;
239 for (; i < nLanguages; i++) {
240 guiLangNames[i + 1] = languages[i].name;
243 guiLangNames[nLanguages + 1] = NULL;
246 void lngEnd() {
247 lngFreeFromFile();
249 int i = 0;
250 for (; i < nLanguages; i++) {
251 free(languages[i].name);
252 free(languages[i].filePath);
255 free(guiLangNames);
257 fntEnd();
260 void lngSetGuiValue(int langID) {
261 if (guiLangID != langID) {
263 lngFreeFromFile();
265 if (langID != 0) {
266 language_t* currLang = &languages[langID - 1];
267 if (lngLoadFromFile(currLang->filePath, currLang->name)) {
268 guiLangID = langID;
269 return;
273 lang_strs = internalEnglish;
274 guiLangID = 0;
278 int lngGetGuiValue() {
279 return guiLangID;
282 int lngFindGuiID(char* lang) {
283 if (lang) {
284 int i = 0;
285 for (; i < nLanguages; i++) {
286 if (stricmp(languages[i].name, lang) == 0)
287 return i + 1; // shift for Gui id
290 return 0;
293 char **lngGetGuiList() {
294 return guiLangNames;