clarify the gui
[open-ps2-loader.git] / src / lang.c
blobfea67d413722d21bdf038b9aee1ce9beecf3515e
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: %d",
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",
123 "Custom ELF",
124 "Color selection",
125 "Reconnect",
128 static int guiLangID = 0;
129 static char **lang_strs = internalEnglish;
130 static int nValidEntries = LANG_STR_COUNT;
132 static int nLanguages = 0;
133 static language_t languages[MAX_LANGUAGE_FILES];
134 static char **guiLangNames;
136 // localised string getter
137 char *_l(unsigned int id) {
138 return lang_strs[id];
141 static void lngFreeFromFile() {
142 if (guiLangID == 0)
143 return;
145 int strId = 0;
146 for(; strId < nValidEntries; strId++) {
147 free(lang_strs[strId]);
148 lang_strs[strId] = NULL;
150 free(lang_strs);
151 lang_strs = NULL;
154 static int lngLoadFromFile(char* path, char *name) {
155 file_buffer_t* fileBuffer = openFileBuffer(path, O_RDONLY, 1, 1024);
156 if (fileBuffer) {
157 // file exists, try to read it and load the custom lang
158 lang_strs = (char**) malloc(LANG_STR_COUNT * sizeof(char**));
160 int strId = 0;
161 while (strId < LANG_STR_COUNT && readFileBuffer(fileBuffer, &lang_strs[strId])) {
162 strId++;
164 closeFileBuffer(fileBuffer);
166 LOG("LANG: #### Loaded %d entries\n", strId);
168 // remember how many entries were read from the file (for the free later)
169 nValidEntries = strId;
171 // if necessary complete lang with default internal
172 while (strId < LANG_STR_COUNT) {
173 LOG("LANG: #### Default entry added: %s\n", internalEnglish[strId]);
174 lang_strs[strId] = internalEnglish[strId];
175 strId++;
178 int size = -1;
179 char path[255];
180 snprintf(path, 255, "%s/font_%s.ttf", gBaseMCDir, name);
182 LOG("#### Custom font path: %s\n", path);
184 void* customFont = readFile(path, -1, &size);
185 if (customFont)
186 fntReplace(FNT_DEFAULT, customFont, size, 1, 1); // consider fonts loaded through language as default, so they won't be reset-ed when changing themes
187 else
188 fntSetDefault(FNT_DEFAULT);
190 return 1;
192 return 0;
195 char* lngGetValue() {
196 return guiLangNames[guiLangID];
199 static int lngReadEntry(int index, char* path, char* separator, char* name, unsigned int mode) {
200 if (!FIO_SO_ISDIR(mode)) {
201 if(strstr(name, ".lng") || strstr(name, ".LNG")) {
203 language_t* currLang = &languages[index];
205 // filepath for this language file
206 int length = strlen(path) + 1 + strlen(name) + 1;
207 currLang->filePath = (char*) malloc(length * sizeof(char));
208 sprintf(currLang->filePath, "%s%s%s", path, separator, name);
210 // extract name for this language (will be used for the English translation)
211 length = strlen(name) - 5 - 4 + 1;
212 currLang->name = (char*) malloc(length * sizeof(char));
213 memcpy(currLang->name, name + 5, length);
214 currLang->name[length - 1] = '\0';
216 /*file_buffer_t* fileBuffer = openFileBuffer(currLang->filePath, 1, 1024);
217 if (fileBuffer) {
218 // read localized name of language from file
219 if (readLineContext(fileBuffer, &currLang->name))
220 readLineContext(fileBuffer, &currLang->fontName);
221 closeFileBuffer(fileBuffer);
224 index++;
227 return index;
230 void lngInit() {
231 fntInit();
233 nLanguages = listDir(gBaseMCDir, "/", MAX_LANGUAGE_FILES, &lngReadEntry);
235 // build the languages name list
236 guiLangNames = (char**) malloc((nLanguages + 2) * sizeof(char**));
238 // add default internal (english)
239 guiLangNames[0] = internalEnglish[0];
241 int i = 0;
242 for (; i < nLanguages; i++) {
243 guiLangNames[i + 1] = languages[i].name;
246 guiLangNames[nLanguages + 1] = NULL;
249 void lngEnd() {
250 lngFreeFromFile();
252 int i = 0;
253 for (; i < nLanguages; i++) {
254 free(languages[i].name);
255 free(languages[i].filePath);
258 free(guiLangNames);
260 fntEnd();
263 void lngSetGuiValue(int langID) {
264 if (guiLangID != langID) {
266 lngFreeFromFile();
268 if (langID != 0) {
269 language_t* currLang = &languages[langID - 1];
270 if (lngLoadFromFile(currLang->filePath, currLang->name)) {
271 guiLangID = langID;
272 return;
276 lang_strs = internalEnglish;
277 guiLangID = 0;
281 int lngGetGuiValue() {
282 return guiLangID;
285 int lngFindGuiID(char* lang) {
286 if (lang) {
287 int i = 0;
288 for (; i < nLanguages; i++) {
289 if (stricmp(languages[i].name, lang) == 0)
290 return i + 1; // shift for Gui id
293 return 0;
296 char **lngGetGuiList() {
297 return guiLangNames;