Add language switcher to the settings UI, closes #506
parent
6d8a5bab31
commit
40352be5cc
|
@ -87,6 +87,7 @@ set(BASE_SOURCES
|
||||||
common/event.cpp
|
common/event.cpp
|
||||||
common/image.cpp
|
common/image.cpp
|
||||||
common/key.cpp
|
common/key.cpp
|
||||||
|
common/language.cpp
|
||||||
common/logger.cpp
|
common/logger.cpp
|
||||||
common/misc.cpp
|
common/misc.cpp
|
||||||
common/pathman.cpp
|
common/pathman.cpp
|
||||||
|
|
148
src/app/app.cpp
148
src/app/app.cpp
|
@ -245,7 +245,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
OPT_RUNSCENE,
|
OPT_RUNSCENE,
|
||||||
OPT_SCENETEST,
|
OPT_SCENETEST,
|
||||||
OPT_LOGLEVEL,
|
OPT_LOGLEVEL,
|
||||||
OPT_LANGUAGE,
|
|
||||||
OPT_LANGDIR,
|
OPT_LANGDIR,
|
||||||
OPT_DATADIR,
|
OPT_DATADIR,
|
||||||
OPT_SAVEDIR,
|
OPT_SAVEDIR,
|
||||||
|
@ -262,7 +261,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
{ "runscene", required_argument, nullptr, OPT_RUNSCENE },
|
{ "runscene", required_argument, nullptr, OPT_RUNSCENE },
|
||||||
{ "scenetest", no_argument, nullptr, OPT_SCENETEST },
|
{ "scenetest", no_argument, nullptr, OPT_SCENETEST },
|
||||||
{ "loglevel", required_argument, nullptr, OPT_LOGLEVEL },
|
{ "loglevel", required_argument, nullptr, OPT_LOGLEVEL },
|
||||||
{ "language", required_argument, nullptr, OPT_LANGUAGE },
|
|
||||||
{ "langdir", required_argument, nullptr, OPT_LANGDIR },
|
{ "langdir", required_argument, nullptr, OPT_LANGDIR },
|
||||||
{ "datadir", required_argument, nullptr, OPT_DATADIR },
|
{ "datadir", required_argument, nullptr, OPT_DATADIR },
|
||||||
{ "savedir", required_argument, nullptr, OPT_SAVEDIR },
|
{ "savedir", required_argument, nullptr, OPT_SAVEDIR },
|
||||||
|
@ -306,7 +304,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
|
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
|
||||||
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
|
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
|
||||||
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
|
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
|
||||||
GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl, ru)\n");
|
|
||||||
GetLogger()->Message(" -langdir path set custom language directory path\n");
|
GetLogger()->Message(" -langdir path set custom language directory path\n");
|
||||||
GetLogger()->Message(" -datadir path set custom data directory path\n");
|
GetLogger()->Message(" -datadir path set custom data directory path\n");
|
||||||
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
|
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
|
||||||
|
@ -371,19 +368,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
GetLogger()->SetLogLevel(logLevel);
|
GetLogger()->SetLogLevel(logLevel);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPT_LANGUAGE:
|
|
||||||
{
|
|
||||||
Language language;
|
|
||||||
if (! ParseLanguage(optarg, language))
|
|
||||||
{
|
|
||||||
GetLogger()->Error("Invalid language: '%s'\n", optarg);
|
|
||||||
return PARSE_ARGS_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetLogger()->Info("Using language %s\n", optarg);
|
|
||||||
m_language = language;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OPT_DATADIR:
|
case OPT_DATADIR:
|
||||||
{
|
{
|
||||||
m_pathManager->SetDataPath(optarg);
|
m_pathManager->SetDataPath(optarg);
|
||||||
|
@ -440,7 +424,6 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
bool CApplication::Create()
|
bool CApplication::Create()
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
bool defaultValues = false;
|
|
||||||
|
|
||||||
GetLogger()->Info("Creating CApplication\n");
|
GetLogger()->Info("Creating CApplication\n");
|
||||||
|
|
||||||
|
@ -454,27 +437,10 @@ bool CApplication::Create()
|
||||||
|
|
||||||
if (!GetConfigFile().Init())
|
if (!GetConfigFile().Init())
|
||||||
{
|
{
|
||||||
GetLogger()->Warn("Config not found. Default values will be used!\n");
|
GetLogger()->Warn("Config could not be loaded. Default values will be used!\n");
|
||||||
defaultValues = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetConfigFile().GetStringProperty("Language", "Lang", path))
|
// Create the sound instance.
|
||||||
{
|
|
||||||
Language language;
|
|
||||||
if (ParseLanguage(path, language))
|
|
||||||
{
|
|
||||||
m_language = language;
|
|
||||||
GetLogger()->Info("Setting language '%s' from ini file\n", path.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GetLogger()->Error("Invalid language '%s' in ini file\n", path.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SetLanguage(m_language);
|
|
||||||
|
|
||||||
//Create the sound instance.
|
|
||||||
#ifdef OPENAL_SOUND
|
#ifdef OPENAL_SOUND
|
||||||
if (!m_headless)
|
if (!m_headless)
|
||||||
{
|
{
|
||||||
|
@ -647,7 +613,7 @@ bool CApplication::Create()
|
||||||
m_eventQueue = MakeUnique<CEventQueue>();
|
m_eventQueue = MakeUnique<CEventQueue>();
|
||||||
|
|
||||||
// Create the robot application.
|
// Create the robot application.
|
||||||
m_controller = MakeUnique<CController>(this, !defaultValues);
|
m_controller = MakeUnique<CController>();
|
||||||
|
|
||||||
if (m_runSceneCategory == LevelCategory::Max)
|
if (m_runSceneCategory == LevelCategory::Max)
|
||||||
m_controller->StartApp();
|
m_controller->StartApp();
|
||||||
|
@ -1599,76 +1565,26 @@ char CApplication::GetLanguageChar() const
|
||||||
return langChar;
|
return langChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CApplication::ParseLanguage(const std::string& str, Language& language)
|
|
||||||
{
|
|
||||||
if (str == "en")
|
|
||||||
{
|
|
||||||
language = LANGUAGE_ENGLISH;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (str == "de")
|
|
||||||
{
|
|
||||||
language = LANGUAGE_GERMAN;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (str == "fr")
|
|
||||||
{
|
|
||||||
language = LANGUAGE_FRENCH;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (str == "pl")
|
|
||||||
{
|
|
||||||
language = LANGUAGE_POLISH;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (str == "ru")
|
|
||||||
{
|
|
||||||
language = LANGUAGE_RUSSIAN;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CApplication::SetLanguage(Language language)
|
void CApplication::SetLanguage(Language language)
|
||||||
{
|
{
|
||||||
m_language = language;
|
m_language = language;
|
||||||
|
|
||||||
/* Gettext initialization */
|
/* Gettext initialization */
|
||||||
|
|
||||||
std::string locale = "";
|
static char envLang[50] = { 0 };
|
||||||
switch (m_language)
|
if (envLang[0] == 0)
|
||||||
{
|
{
|
||||||
default:
|
// Get this only at the first call, since this code modifies it
|
||||||
case LANGUAGE_ENV:
|
const char* currentEnvLang = gl_locale_name(LC_MESSAGES, "LC_MESSAGES");
|
||||||
locale = "";
|
if (currentEnvLang != nullptr)
|
||||||
break;
|
{
|
||||||
|
strcpy(envLang, currentEnvLang);
|
||||||
case LANGUAGE_ENGLISH:
|
}
|
||||||
locale = "en_US.utf8";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANGUAGE_GERMAN:
|
|
||||||
locale = "de_DE.utf8";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANGUAGE_FRENCH:
|
|
||||||
locale = "fr_FR.utf8";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANGUAGE_POLISH:
|
|
||||||
locale = "pl_PL.utf8";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANGUAGE_RUSSIAN:
|
|
||||||
locale = "ru_RU.utf8";
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (locale.empty())
|
if (language == LANGUAGE_ENV)
|
||||||
{
|
{
|
||||||
const char* envLang = gl_locale_name(LC_MESSAGES, "LC_MESSAGES");
|
if (envLang[0] == 0)
|
||||||
if (envLang == nullptr)
|
|
||||||
{
|
{
|
||||||
GetLogger()->Error("Failed to get language from environment, setting default language\n");
|
GetLogger()->Error("Failed to get language from environment, setting default language\n");
|
||||||
m_language = LANGUAGE_ENGLISH;
|
m_language = LANGUAGE_ENGLISH;
|
||||||
|
@ -1704,15 +1620,41 @@ void CApplication::SetLanguage(Language language)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
std::string locale = "";
|
||||||
|
switch (m_language)
|
||||||
{
|
{
|
||||||
std::string langStr = "LANGUAGE=";
|
default:
|
||||||
langStr += locale;
|
locale = "";
|
||||||
strcpy(m_languageLocale, langStr.c_str());
|
break;
|
||||||
putenv(m_languageLocale);
|
|
||||||
GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
|
case LANGUAGE_ENGLISH:
|
||||||
|
locale = "en_US.utf8";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LANGUAGE_GERMAN:
|
||||||
|
locale = "de_DE.utf8";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LANGUAGE_FRENCH:
|
||||||
|
locale = "fr_FR.utf8";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LANGUAGE_POLISH:
|
||||||
|
locale = "pl_PL.utf8";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LANGUAGE_RUSSIAN:
|
||||||
|
locale = "ru_RU.utf8";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string langStr = "LANGUAGE=";
|
||||||
|
langStr += locale;
|
||||||
|
strcpy(m_languageLocale, langStr.c_str());
|
||||||
|
putenv(m_languageLocale);
|
||||||
|
GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
|
||||||
|
|
||||||
char* defaultLocale = setlocale(LC_ALL, ""); // Load system locale
|
char* defaultLocale = setlocale(LC_ALL, ""); // Load system locale
|
||||||
GetLogger()->Debug("Default system locale: %s\n", defaultLocale);
|
GetLogger()->Debug("Default system locale: %s\n", defaultLocale);
|
||||||
setlocale(LC_NUMERIC, "C"); // Force numeric locale to "C" (fixes decimal point problems)
|
setlocale(LC_NUMERIC, "C"); // Force numeric locale to "C" (fixes decimal point problems)
|
||||||
|
|
|
@ -290,7 +290,6 @@ public:
|
||||||
Language GetLanguage() const;
|
Language GetLanguage() const;
|
||||||
char GetLanguageChar() const;
|
char GetLanguageChar() const;
|
||||||
void SetLanguage(Language language);
|
void SetLanguage(Language language);
|
||||||
static bool ParseLanguage(const std::string& str, Language& language);
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//! Management of sleep in main loop (lowers CPU usage)
|
//! Management of sleep in main loop (lowers CPU usage)
|
||||||
|
|
|
@ -26,25 +26,15 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CController::CController(CApplication* app, bool configLoaded)
|
CController::CController()
|
||||||
: m_app(app)
|
|
||||||
{
|
{
|
||||||
m_main = MakeUnique<CRobotMain>();
|
m_main = MakeUnique<CRobotMain>();
|
||||||
if (configLoaded)
|
|
||||||
m_main->LoadConfigFile();
|
|
||||||
else
|
|
||||||
m_main->CreateConfigFile();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CController::~CController()
|
CController::~CController()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CApplication* CController::GetApplication()
|
|
||||||
{
|
|
||||||
return m_app;
|
|
||||||
}
|
|
||||||
|
|
||||||
CRobotMain* CController::GetRobotMain()
|
CRobotMain* CController::GetRobotMain()
|
||||||
{
|
{
|
||||||
return m_main.get();
|
return m_main.get();
|
||||||
|
|
|
@ -40,11 +40,9 @@ struct Event;
|
||||||
class CController
|
class CController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CController(CApplication* app, bool configLoaded = true);
|
CController();
|
||||||
~CController();
|
~CController();
|
||||||
|
|
||||||
//! Return CApplication instance
|
|
||||||
CApplication* GetApplication();
|
|
||||||
//! Return CRobotMain instance
|
//! Return CRobotMain instance
|
||||||
CRobotMain* GetRobotMain();
|
CRobotMain* GetRobotMain();
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ void InitializeEventTypeTexts()
|
||||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING] = "EVENT_INTERFACE_SHADOW_MAPPING";
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING] = "EVENT_INTERFACE_SHADOW_MAPPING";
|
||||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY] = "EVENT_INTERFACE_SHADOW_MAPPING_QUALITY";
|
||||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = "EVENT_INTERFACE_SHADOW_MAPPING_BUFFER";
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = "EVENT_INTERFACE_SHADOW_MAPPING_BUFFER";
|
||||||
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_LANGUAGE] = "EVENT_INTERFACE_LANGUAGE";
|
||||||
|
|
||||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO1] = "EVENT_INTERFACE_KINFO1";
|
||||||
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";
|
EVENT_TYPE_TEXT[EVENT_INTERFACE_KINFO2] = "EVENT_INTERFACE_KINFO2";
|
||||||
|
|
|
@ -255,6 +255,7 @@ enum EventType
|
||||||
EVENT_INTERFACE_SHADOW_MAPPING = 787,
|
EVENT_INTERFACE_SHADOW_MAPPING = 787,
|
||||||
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
|
EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788,
|
||||||
EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789,
|
EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789,
|
||||||
|
EVENT_INTERFACE_LANGUAGE = 790,
|
||||||
|
|
||||||
EVENT_INTERFACE_KINFO1 = 500,
|
EVENT_INTERFACE_KINFO1 = 500,
|
||||||
EVENT_INTERFACE_KINFO2 = 501,
|
EVENT_INTERFACE_KINFO2 = 501,
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Colobot: Gold Edition source code
|
||||||
|
* Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam
|
||||||
|
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see http://gnu.org/licenses
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common/language.h"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
const std::map<Language, std::string> LANGUAGE_MAP = {
|
||||||
|
{ LANGUAGE_ENGLISH, "en" },
|
||||||
|
{ LANGUAGE_GERMAN, "de" },
|
||||||
|
{ LANGUAGE_FRENCH, "fr" },
|
||||||
|
{ LANGUAGE_POLISH, "pl" },
|
||||||
|
{ LANGUAGE_RUSSIAN, "ru" }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool ParseLanguage(const std::string& str, Language& language)
|
||||||
|
{
|
||||||
|
for (auto it = LANGUAGE_MAP.begin(); it != LANGUAGE_MAP.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->second == str)
|
||||||
|
{
|
||||||
|
language = it->first;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LanguageToString(const Language& language, std::string& str)
|
||||||
|
{
|
||||||
|
if (LANGUAGE_MAP.count(language) > 0)
|
||||||
|
{
|
||||||
|
str = LANGUAGE_MAP.at(language);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* This file is part of the Colobot: Gold Edition source code
|
* This file is part of the Colobot: Gold Edition source code
|
||||||
* Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam
|
* Copyright (C) 2001-2016, Daniel Roux, EPSITEC SA & TerranovaTeam
|
||||||
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
|
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \enum Language
|
* \enum Language
|
||||||
* \brief Application language
|
* \brief Application language
|
||||||
|
@ -32,3 +34,6 @@ enum Language
|
||||||
LANGUAGE_POLISH = 3,
|
LANGUAGE_POLISH = 3,
|
||||||
LANGUAGE_RUSSIAN = 4
|
LANGUAGE_RUSSIAN = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool ParseLanguage(const std::string& str, Language& language);
|
||||||
|
bool LanguageToString(const Language& language, std::string& str);
|
|
@ -23,6 +23,7 @@
|
||||||
#include "app/input.h"
|
#include "app/input.h"
|
||||||
|
|
||||||
#include "common/config_file.h"
|
#include "common/config_file.h"
|
||||||
|
#include "common/logger.h"
|
||||||
|
|
||||||
#include "graphics/engine/camera.h"
|
#include "graphics/engine/camera.h"
|
||||||
#include "graphics/engine/engine.h"
|
#include "graphics/engine/engine.h"
|
||||||
|
@ -49,6 +50,8 @@ CSettings::CSettings()
|
||||||
m_IODim = Math::Point(320.0f/640.0f, (121.0f+18.0f*8)/480.0f);
|
m_IODim = Math::Point(320.0f/640.0f, (121.0f+18.0f*8)/480.0f);
|
||||||
m_IOPos.x = (1.0f-m_IODim.x)/2.0f; // in the middle
|
m_IOPos.x = (1.0f-m_IODim.x)/2.0f; // in the middle
|
||||||
m_IOPos.y = (1.0f-m_IODim.y)/2.0f;
|
m_IOPos.y = (1.0f-m_IODim.y)/2.0f;
|
||||||
|
|
||||||
|
m_language = LANGUAGE_ENV;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSettings::SaveResolutionSettings(const Gfx::DeviceConfig& config)
|
void CSettings::SaveResolutionSettings(const Gfx::DeviceConfig& config)
|
||||||
|
@ -120,6 +123,9 @@ void CSettings::SaveSettings()
|
||||||
GetConfigFile().SetFloatProperty("Edit", "IODimX", m_IODim.x);
|
GetConfigFile().SetFloatProperty("Edit", "IODimX", m_IODim.x);
|
||||||
GetConfigFile().SetFloatProperty("Edit", "IODimY", m_IODim.y);
|
GetConfigFile().SetFloatProperty("Edit", "IODimY", m_IODim.y);
|
||||||
|
|
||||||
|
std::string lang = "";
|
||||||
|
LanguageToString(m_language, lang);
|
||||||
|
GetConfigFile().SetStringProperty("Language", "Lang", lang);
|
||||||
|
|
||||||
GetConfigFile().Save();
|
GetConfigFile().Save();
|
||||||
}
|
}
|
||||||
|
@ -135,6 +141,7 @@ void CSettings::LoadSettings()
|
||||||
int iValue = 0;
|
int iValue = 0;
|
||||||
float fValue = 0.0f;
|
float fValue = 0.0f;
|
||||||
bool bValue = false;
|
bool bValue = false;
|
||||||
|
std::string sValue = "";
|
||||||
|
|
||||||
GetConfigFile().GetBoolProperty("Setup", "Tooltips", m_tooltips);
|
GetConfigFile().GetBoolProperty("Setup", "Tooltips", m_tooltips);
|
||||||
GetConfigFile().GetBoolProperty("Setup", "InterfaceGlint", m_interfaceGlint);
|
GetConfigFile().GetBoolProperty("Setup", "InterfaceGlint", m_interfaceGlint);
|
||||||
|
@ -269,6 +276,17 @@ void CSettings::LoadSettings()
|
||||||
GetConfigFile().GetFloatProperty("Edit", "IOPosY", m_IOPos.y);
|
GetConfigFile().GetFloatProperty("Edit", "IOPosY", m_IOPos.y);
|
||||||
GetConfigFile().GetFloatProperty("Edit", "IODimX", m_IODim.x);
|
GetConfigFile().GetFloatProperty("Edit", "IODimX", m_IODim.x);
|
||||||
GetConfigFile().GetFloatProperty("Edit", "IODimY", m_IODim.y);
|
GetConfigFile().GetFloatProperty("Edit", "IODimY", m_IODim.y);
|
||||||
|
|
||||||
|
m_language = LANGUAGE_ENV;
|
||||||
|
if (GetConfigFile().GetStringProperty("Language", "Lang", sValue))
|
||||||
|
{
|
||||||
|
if (!sValue.empty() && !ParseLanguage(sValue, m_language))
|
||||||
|
{
|
||||||
|
GetLogger()->Error("Failed to parse language '%s' from config file. Default language will be used.\n",
|
||||||
|
sValue.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
app->SetLanguage(m_language);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSettings::SetTooltips(bool tooltips)
|
void CSettings::SetTooltips(bool tooltips)
|
||||||
|
@ -392,3 +410,14 @@ Math::Point CSettings::GetIODim()
|
||||||
{
|
{
|
||||||
return m_IODim;
|
return m_IODim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSettings::SetLanguage(Language language)
|
||||||
|
{
|
||||||
|
m_language = language;
|
||||||
|
CApplication::GetInstancePointer()->SetLanguage(m_language);
|
||||||
|
}
|
||||||
|
|
||||||
|
Language CSettings::GetLanguage()
|
||||||
|
{
|
||||||
|
return m_language;
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/language.h"
|
||||||
#include "common/singleton.h"
|
#include "common/singleton.h"
|
||||||
|
|
||||||
#include "math/point.h"
|
#include "math/point.h"
|
||||||
|
@ -80,6 +81,9 @@ public:
|
||||||
Math::Point GetIODim();
|
Math::Point GetIODim();
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
void SetLanguage(Language language);
|
||||||
|
Language GetLanguage();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_tooltips;
|
bool m_tooltips;
|
||||||
bool m_interfaceGlint;
|
bool m_interfaceGlint;
|
||||||
|
@ -94,4 +98,6 @@ protected:
|
||||||
bool m_IOPublic;
|
bool m_IOPublic;
|
||||||
Math::Point m_IOPos;
|
Math::Point m_IOPos;
|
||||||
Math::Point m_IODim;
|
Math::Point m_IODim;
|
||||||
|
|
||||||
|
Language m_language;
|
||||||
};
|
};
|
||||||
|
|
|
@ -262,6 +262,10 @@ CRobotMain::CRobotMain()
|
||||||
|
|
||||||
m_engine->SetTracePrecision(1.0f);
|
m_engine->SetTracePrecision(1.0f);
|
||||||
|
|
||||||
|
m_settings->LoadSettings();
|
||||||
|
m_settings->SaveSettings();
|
||||||
|
m_settings->SaveResolutionSettings(m_app->GetVideoConfig());
|
||||||
|
|
||||||
SelectPlayer(CPlayerProfile::GetLastName());
|
SelectPlayer(CPlayerProfile::GetLastName());
|
||||||
|
|
||||||
CScriptFunctions::Init();
|
CScriptFunctions::Init();
|
||||||
|
@ -321,21 +325,6 @@ void CRobotMain::ReloadAllTextures()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Creates the file colobot.ini at the first time
|
|
||||||
void CRobotMain::CreateConfigFile()
|
|
||||||
{
|
|
||||||
m_settings->SaveSettings();
|
|
||||||
m_settings->SaveResolutionSettings(m_app->GetVideoConfig());
|
|
||||||
|
|
||||||
GetConfigFile().Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRobotMain::LoadConfigFile()
|
|
||||||
{
|
|
||||||
m_settings->LoadSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string PhaseToString(Phase phase)
|
std::string PhaseToString(Phase phase)
|
||||||
{
|
{
|
||||||
if (phase == PHASE_WELCOME1) return "PHASE_WELCOME1";
|
if (phase == PHASE_WELCOME1) return "PHASE_WELCOME1";
|
||||||
|
|
|
@ -160,9 +160,6 @@ public:
|
||||||
Ui::CDisplayText* GetDisplayText();
|
Ui::CDisplayText* GetDisplayText();
|
||||||
CPauseManager* GetPauseManager();
|
CPauseManager* GetPauseManager();
|
||||||
|
|
||||||
void CreateConfigFile();
|
|
||||||
void LoadConfigFile();
|
|
||||||
|
|
||||||
void ResetAfterVideoConfigChanged();
|
void ResetAfterVideoConfigChanged();
|
||||||
void ReloadAllTextures();
|
void ReloadAllTextures();
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "ui/controls/check.h"
|
#include "ui/controls/check.h"
|
||||||
#include "ui/controls/interface.h"
|
#include "ui/controls/interface.h"
|
||||||
#include "ui/controls/label.h"
|
#include "ui/controls/label.h"
|
||||||
|
#include "ui/controls/list.h"
|
||||||
#include "ui/controls/slider.h"
|
#include "ui/controls/slider.h"
|
||||||
#include "ui/controls/window.h"
|
#include "ui/controls/window.h"
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@ void CScreenSetupGame::CreateInterface()
|
||||||
CLabel* pl;
|
CLabel* pl;
|
||||||
CCheck* pc;
|
CCheck* pc;
|
||||||
CSlider* psl;
|
CSlider* psl;
|
||||||
|
CList* pli;
|
||||||
Math::Point pos, ddim;
|
Math::Point pos, ddim;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
|
@ -131,6 +133,19 @@ void CScreenSetupGame::CreateInterface()
|
||||||
pos.y -= 0.048f;
|
pos.y -= 0.048f;
|
||||||
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITVALUE);
|
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITVALUE);
|
||||||
pc->SetState(STATE_SHADOW);
|
pc->SetState(STATE_SHADOW);
|
||||||
|
pos.y -= 0.048f;
|
||||||
|
|
||||||
|
ddim.y = dim.y*3.0f;
|
||||||
|
pos.y -= ddim.y;
|
||||||
|
pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_LANGUAGE);
|
||||||
|
pli->SetState(STATE_SHADOW);
|
||||||
|
// TODO: Add something like GetSupportedLanguages() and GetLanguageFriendlyName() for this
|
||||||
|
pli->SetItemName(1+LANGUAGE_ENV, "[System default]");
|
||||||
|
pli->SetItemName(1+LANGUAGE_ENGLISH, "English");
|
||||||
|
pli->SetItemName(1+LANGUAGE_FRENCH, "French");
|
||||||
|
pli->SetItemName(1+LANGUAGE_GERMAN, "German");
|
||||||
|
pli->SetItemName(1+LANGUAGE_POLISH, "Polish");
|
||||||
|
pli->SetItemName(1+LANGUAGE_RUSSIAN, "Russian");
|
||||||
|
|
||||||
UpdateSetupButtons();
|
UpdateSetupButtons();
|
||||||
}
|
}
|
||||||
|
@ -227,11 +242,8 @@ bool CScreenSetupGame::EventProcess(const Event &event)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_INTERFACE_AUTOSAVE_INTERVAL:
|
case EVENT_INTERFACE_AUTOSAVE_INTERVAL:
|
||||||
ChangeSetupButtons();
|
|
||||||
UpdateSetupButtons();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_INTERFACE_AUTOSAVE_SLOTS:
|
case EVENT_INTERFACE_AUTOSAVE_SLOTS:
|
||||||
|
case EVENT_INTERFACE_LANGUAGE:
|
||||||
ChangeSetupButtons();
|
ChangeSetupButtons();
|
||||||
UpdateSetupButtons();
|
UpdateSetupButtons();
|
||||||
break;
|
break;
|
||||||
|
@ -249,6 +261,7 @@ void CScreenSetupGame::UpdateSetupButtons()
|
||||||
CWindow* pw;
|
CWindow* pw;
|
||||||
CCheck* pc;
|
CCheck* pc;
|
||||||
CSlider* ps;
|
CSlider* ps;
|
||||||
|
CList* pli;
|
||||||
|
|
||||||
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
|
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
|
||||||
if ( pw == nullptr ) return;
|
if ( pw == nullptr ) return;
|
||||||
|
@ -345,6 +358,12 @@ void CScreenSetupGame::UpdateSetupButtons()
|
||||||
ps->SetState(STATE_ENABLE, m_main->GetAutosave());
|
ps->SetState(STATE_ENABLE, m_main->GetAutosave());
|
||||||
ps->SetVisibleValue(m_main->GetAutosaveSlots());
|
ps->SetVisibleValue(m_main->GetAutosaveSlots());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pli = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LANGUAGE));
|
||||||
|
if ( pli != nullptr )
|
||||||
|
{
|
||||||
|
pli->SetSelect(1+m_settings->GetLanguage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates the engine function of the buttons after the setup phase.
|
// Updates the engine function of the buttons after the setup phase.
|
||||||
|
@ -353,6 +372,7 @@ void CScreenSetupGame::ChangeSetupButtons()
|
||||||
{
|
{
|
||||||
CWindow* pw;
|
CWindow* pw;
|
||||||
CSlider* ps;
|
CSlider* ps;
|
||||||
|
CList* pli;
|
||||||
float value;
|
float value;
|
||||||
|
|
||||||
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
|
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
|
||||||
|
@ -371,6 +391,14 @@ void CScreenSetupGame::ChangeSetupButtons()
|
||||||
value = ps->GetVisibleValue();
|
value = ps->GetVisibleValue();
|
||||||
m_main->SetAutosaveSlots(static_cast<int>(round(value)));
|
m_main->SetAutosaveSlots(static_cast<int>(round(value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pli = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_LANGUAGE));
|
||||||
|
if ( pli != nullptr )
|
||||||
|
{
|
||||||
|
m_settings->SetLanguage(static_cast<Language>(pli->GetSelect()-1));
|
||||||
|
// TODO: A really ugly way to apply the change immediately
|
||||||
|
m_main->ChangePhase(m_main->GetPhase());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
Loading…
Reference in New Issue