/** * @sa CL_Shutdown * @sa CL_InitAfter */ void CL_Init (void) { /* i18n through gettext */ char languagePath[MAX_OSPATH]; cvar_t* fs_i18ndir; isdown = false; if (sv_dedicated->integer) return; /* nothing running on the client */ OBJZERO(cls); fs_i18ndir = Cvar_Get("fs_i18ndir", "", 0, "System path to language files"); /* i18n through gettext */ setlocale(LC_ALL, "C"); setlocale(LC_MESSAGES, ""); /* use system locale dir if we can't find in gamedir */ if (fs_i18ndir->string[0] != '\0') Q_strncpyz(languagePath, fs_i18ndir->string, sizeof(languagePath)); else #ifdef LOCALEDIR Com_sprintf(languagePath, sizeof(languagePath), LOCALEDIR); #else Com_sprintf(languagePath, sizeof(languagePath), "%s/" BASEDIRNAME "/i18n/", FS_GetCwd()); #endif Com_DPrintf(DEBUG_CLIENT, "...using mo files from %s\n", languagePath); bindtextdomain(TEXT_DOMAIN, languagePath); bind_textdomain_codeset(TEXT_DOMAIN, "UTF-8"); /* load language file */ textdomain(TEXT_DOMAIN); CL_InitMemPools(); /* all archived variables will now be loaded */ Con_Init(); CIN_Init(); VID_Init(); SCR_DrawLoadingScreen(false, 0); S_Init(); SCR_Init(); CL_InitLocal(); Irc_Init(); CL_ViewInit(); CL_ClearState(); /* cvar feedback */ for (const cvar_t* var = Cvar_GetFirst(); var; var = var->next) { if (var->flags & CVAR_R_CONTEXT) Cvar_RegisterChangeListener(var->name, CL_RContextCvarChange); if (var->flags & CVAR_R_IMAGES) Cvar_RegisterChangeListener(var->name, CL_RImagesCvarChange); } }
/** * @brief Test given language by trying to set locale. * @param[in] localeID language abbreviation. * @return true if setting given language is possible. */ static bool CL_LanguageTest (const char* localeID) { #ifndef _WIN32 int i; language_t* language; localeMapping_t* mapping; #endif char languagePath[MAX_OSPATH]; assert(localeID); /* Find the proper *.mo file. */ if (fs_i18ndir->string[0] != '\0') Q_strncpyz(languagePath, fs_i18ndir->string, sizeof(languagePath)); else #ifdef LOCALEDIR Com_sprintf(languagePath, sizeof(languagePath), LOCALEDIR); #else Com_sprintf(languagePath, sizeof(languagePath), "%s/" BASEDIRNAME "/i18n/", FS_GetCwd()); #endif Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: using mo files from '%s'\n", languagePath); Q_strcat(languagePath, sizeof(languagePath), "%s/LC_MESSAGES/ufoai.mo", localeID); /* No *.mo file -> no language. */ if (!FS_FileExists("%s", languagePath)) { Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: locale '%s' not found.\n", localeID); return false; } #ifdef _WIN32 if (Sys_Setenv("LANGUAGE=%s", localeID) == 0) { Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: locale '%s' found.\n", localeID); return true; } #else for (i = 0, language = languageList; i < languageCount; language = language->next, i++) { if (Q_streq(localeID, language->localeID)) break; } if (i == languageCount) { Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: Could not find locale with id '%s'\n", localeID); return false; } mapping = language->localeMapping; if (!mapping) { Com_DPrintf(DEBUG_CLIENT, "No locale mappings for locale with id '%s'\n", localeID); return false; } /* Cycle through all mappings, but stop at first locale possible to set. */ do { /* setlocale() will return nullptr if no setting possible. */ if (setlocale(LC_MESSAGES, mapping->localeMapping)) { Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: language '%s' with locale '%s' found.\n", localeID, mapping->localeMapping); return true; } else Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: language '%s' with locale '%s' not found on your system.\n", localeID, mapping->localeMapping); mapping = mapping->next; } while (mapping); Com_DPrintf(DEBUG_CLIENT, "CL_LanguageTest: not possible to use language '%s'.\n", localeID); #endif return false; }