summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CBot/CBotString.cpp54
-rw-r--r--src/app/app.cpp166
-rw-r--r--src/app/app.h9
-rw-r--r--src/common/image.cpp4
-rw-r--r--src/object/brain.cpp27
-rw-r--r--src/object/robotmain.cpp8
-rw-r--r--src/object/task/taskgoto.cpp4
-rw-r--r--src/script/script.cpp33
-rw-r--r--src/ui/maindialog.cpp20
9 files changed, 198 insertions, 127 deletions
diff --git a/src/CBot/CBotString.cpp b/src/CBot/CBotString.cpp
index 4795b63..b1b5fc4 100644
--- a/src/CBot/CBotString.cpp
+++ b/src/CBot/CBotString.cpp
@@ -127,7 +127,8 @@ CBotString::CBotString()
CBotString::~CBotString()
{
- free(m_ptr); //we can call free on null pointer as it's save
+ delete[] m_ptr;
+ m_ptr = nullptr;
}
@@ -138,7 +139,7 @@ CBotString::CBotString(const char* p)
m_ptr = NULL;
if (m_lg>0)
{
- m_ptr = static_cast<char*>(malloc(m_lg+1));
+ m_ptr = new char[m_lg+1];
strcpy(m_ptr, p);
}
}
@@ -150,7 +151,7 @@ CBotString::CBotString(const CBotString& srcString)
m_ptr = NULL;
if (m_lg>0)
{
- m_ptr = static_cast<char*>(malloc(m_lg+1));
+ m_ptr = new char[m_lg+1];
strcpy(m_ptr, srcString.m_ptr);
}
}
@@ -285,12 +286,12 @@ CBotString CBotString::Mid(int start, int lg)
if ( lg < 0 ) lg = m_lg - start;
- char* p = static_cast<char*>(malloc(m_lg+1));
+ char* p = new char[m_lg+1];
strcpy(p, m_ptr+start);
p[lg] = 0;
res = p;
- free(p);
+ delete[] p;
return res;
}
@@ -314,15 +315,16 @@ void CBotString::MakeLower()
bool CBotString::LoadString(unsigned int id)
{
- const char * str = NULL;
+ const char * str = nullptr;
str = MapIdToString(static_cast<EID>(id));
- if (m_ptr != NULL) free(m_ptr);
+ if (m_ptr != nullptr)
+ delete[] m_ptr;
m_lg = strlen(str);
m_ptr = NULL;
if (m_lg > 0)
{
- m_ptr = static_cast<char*>(malloc(m_lg+1));
+ m_ptr = new char[m_lg+1];
strcpy(m_ptr, str);
return true;
}
@@ -332,14 +334,14 @@ bool CBotString::LoadString(unsigned int id)
const CBotString& CBotString::operator=(const CBotString& stringSrc)
{
- free(m_ptr);
- m_ptr = NULL;
+ delete[] m_ptr;
+ m_ptr = nullptr;
m_lg = stringSrc.m_lg;
if (m_lg > 0)
{
- m_ptr = static_cast<char*>(malloc(m_lg+1));
+ m_ptr = new char[m_lg+1];
strcpy(m_ptr, stringSrc.m_ptr);
}
@@ -355,13 +357,13 @@ CBotString operator+(const CBotString& string, const char * lpsz)
const CBotString& CBotString::operator+(const CBotString& stringSrc)
{
- char* p = static_cast<char*>(malloc(m_lg+stringSrc.m_lg+1));
+ char* p = new char[m_lg+stringSrc.m_lg+1];
if (m_ptr!=NULL) strcpy(p, m_ptr);
char* pp = p + m_lg;
if (stringSrc.m_ptr!=NULL) strcpy(pp, stringSrc.m_ptr);
- free(m_ptr);
+ delete[] m_ptr;
m_ptr = p;
m_lg += stringSrc.m_lg;
@@ -370,11 +372,11 @@ const CBotString& CBotString::operator+(const CBotString& stringSrc)
const CBotString& CBotString::operator=(const char ch)
{
- free(m_ptr);
+ delete[] m_ptr;
m_lg = 1;
- m_ptr = static_cast<char*>(malloc(2));
+ m_ptr = new char[2];
m_ptr[0] = ch;
m_ptr[1] = 0;
@@ -383,16 +385,16 @@ const CBotString& CBotString::operator=(const char ch)
const CBotString& CBotString::operator=(const char* pString)
{
- free(m_ptr);
- m_ptr = NULL;
+ delete[] m_ptr;
+ m_ptr = nullptr;
- if (pString != NULL)
+ if (pString != nullptr)
{
m_lg = strlen(pString);
if (m_lg != 0)
{
- m_ptr = static_cast<char*>(malloc(m_lg+1));
+ m_ptr = new char[m_lg+1];
strcpy(m_ptr, pString);
}
}
@@ -403,13 +405,13 @@ const CBotString& CBotString::operator=(const char* pString)
const CBotString& CBotString::operator+=(const char ch)
{
- char* p = static_cast<char*>(malloc(m_lg+2));
+ char* p = new char[m_lg+2];
- if (m_ptr!=NULL) strcpy(p, m_ptr);
+ if (m_ptr != nullptr) strcpy(p, m_ptr);
p[m_lg++] = ch;
p[m_lg] = 0;
- free(m_ptr);
+ delete[] m_ptr;
m_ptr = p;
@@ -418,7 +420,7 @@ const CBotString& CBotString::operator+=(const char ch)
const CBotString& CBotString::operator+=(const CBotString& str)
{
- char* p = static_cast<char*>(malloc(m_lg+str.m_lg+1));
+ char* p = new char[m_lg+str.m_lg+1];
strcpy(p, m_ptr);
char* pp = p + m_lg;
@@ -426,7 +428,7 @@ const CBotString& CBotString::operator+=(const CBotString& str)
m_lg = m_lg + str.m_lg;
- free(m_ptr);
+ delete[] m_ptr;
m_ptr = p;
@@ -500,8 +502,8 @@ bool CBotString::IsEmpty() const
void CBotString::Empty()
{
- free(m_ptr);
- m_ptr = NULL;
+ delete[] m_ptr;
+ m_ptr = nullptr;
m_lg = 0;
}
diff --git a/src/app/app.cpp b/src/app/app.cpp
index 000cfdf..c936ac1 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -285,70 +285,32 @@ bool CApplication::Create()
return false;
}
- /* Gettext initialization */
-
- std::string locale = "";
- switch (m_language)
- {
- default:
- case LANGUAGE_ENV:
- locale = "";
- break;
-
- 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;
- }
-
- if (!locale.empty())
- {
- std::string langStr = "LANG=";
- langStr += locale;
- strcpy(S_LANGUAGE, langStr.c_str());
- putenv(S_LANGUAGE);
- }
- setlocale(LC_ALL, "");
- GetLogger()->Debug("Set locale to '%s'\n", locale.c_str());
-
- bindtextdomain("colobot", COLOBOT_I18N_DIR);
- bind_textdomain_codeset("colobot", "UTF-8");
- textdomain("colobot");
-
- GetLogger()->Debug("Testing gettext translation: '%s'\n", gettext("Colobot rules!"));
+ SetLanguage(m_language);
//Create the sound instance.
- if (!GetProfile().InitCurrentDirectory()) {
+ if (!GetProfile().InitCurrentDirectory())
+ {
GetLogger()->Warn("Config not found. Default values will be used!\n");
m_sound = new CSoundInterface();
- } else {
+ }
+ else
+ {
std::string path;
if (GetProfile().GetLocalProfileString("Resources", "Data", path))
m_dataPath = path;
- #ifdef OPENAL_SOUND
- m_sound = static_cast<CSoundInterface *>(new ALSound());
- #else
- GetLogger()->Info("No sound support.\n");
- m_sound = new CSoundInterface();
- #endif
+ #ifdef OPENAL_SOUND
+ m_sound = static_cast<CSoundInterface *>(new ALSound());
+ #else
+ GetLogger()->Info("No sound support.\n");
+ m_sound = new CSoundInterface();
+ #endif
m_sound->Create(true);
if (GetProfile().GetLocalProfileString("Resources", "Sound", path))
m_sound->CacheAll(path);
else
- m_sound->CacheAll(m_dataPath);
+ m_sound->CacheAll(GetDataSubdirPath(DIR_SOUND));
}
std::string standardInfoMessage =
@@ -1421,24 +1383,26 @@ std::string CApplication::GetDataDirPath()
return m_dataPath;
}
-std::string CApplication::GetDataFilePath(DataDir dataDir, const std::string& subpath)
+std::string CApplication::GetDataSubdirPath(DataDir stdDir)
{
- int index = static_cast<int>(dataDir);
+ int index = static_cast<int>(stdDir);
assert(index >= 0 && index < DIR_MAX);
std::stringstream str;
str << m_dataPath;
str << "/";
str << m_dataDirs[index];
- str << "/";
- str << subpath;
return str.str();
}
-std::string CApplication::GetDataFilePath(const std::string& subpath)
+std::string CApplication::GetDataFilePath(DataDir stdDir, const std::string& subpath)
{
+ int index = static_cast<int>(stdDir);
+ assert(index >= 0 && index < DIR_MAX);
std::stringstream str;
str << m_dataPath;
str << "/";
+ str << m_dataDirs[index];
+ str << "/";
str << subpath;
return str.str();
}
@@ -1448,9 +1412,99 @@ Language CApplication::GetLanguage()
return m_language;
}
+char CApplication::GetLanguageChar()
+{
+ char langChar = 'E';
+ switch (m_language)
+ {
+ default:
+ case LANGUAGE_ENV:
+ case LANGUAGE_ENGLISH:
+ langChar = 'E';
+ break;
+
+ case LANGUAGE_GERMAN:
+ langChar = 'D';
+ break;
+
+ case LANGUAGE_FRENCH:
+ langChar = 'F';
+ break;
+
+ case LANGUAGE_POLISH:
+ langChar = 'P';
+ break;
+ }
+ return langChar;
+}
+
void CApplication::SetLanguage(Language language)
{
m_language = language;
+
+ /* Gettext initialization */
+
+ std::string locale = "";
+ switch (m_language)
+ {
+ default:
+ case LANGUAGE_ENV:
+ locale = "";
+ break;
+
+ 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;
+ }
+
+ if (locale.empty())
+ {
+ char *envLang = getenv("LANGUAGE");
+ if (strncmp(envLang,"en",2) == 0)
+ {
+ m_language = LANGUAGE_ENGLISH;
+ }
+ else if (strncmp(envLang,"de",2) == 0)
+ {
+ m_language = LANGUAGE_GERMAN;
+ }
+ else if (strncmp(envLang,"fr",2) == 0)
+ {
+ m_language = LANGUAGE_FRENCH;
+ }
+ else if (strncmp(envLang,"po",2) == 0)
+ {
+ m_language = LANGUAGE_POLISH;
+ }
+ GetLogger()->Trace("SetLanguage: Inherit LANGUAGE=%s from environment\n", envLang);
+ }
+ else
+ {
+ std::string langStr = "LANGUAGE=";
+ langStr += locale;
+ strcpy(S_LANGUAGE, langStr.c_str());
+ putenv(S_LANGUAGE);
+ GetLogger()->Trace("SetLanguage: Set LANGUAGE=%s in environment\n", locale.c_str());
+ }
+ setlocale(LC_ALL, "");
+
+ bindtextdomain("colobot", COLOBOT_I18N_DIR);
+ bind_textdomain_codeset("colobot", "UTF-8");
+ textdomain("colobot");
+
+ GetLogger()->Debug("SetLanguage: Test gettext translation: '%s'\n", gettext("Colobot rules!"));
}
void CApplication::SetLowCPU(bool low)
diff --git a/src/app/app.h b/src/app/app.h
index 5bf6867..2da20d3 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -285,15 +285,16 @@ public:
//! Returns the full path to data directory
std::string GetDataDirPath();
- //! Returns the full path to a file in data directory given standard dir and subpath
- std::string GetDataFilePath(DataDir dir, const std::string &subpath);
+ //! Returns the full path to a standard dir in data directory
+ std::string GetDataSubdirPath(DataDir stdDir);
- //! Returns the full path to a file in data directory given custom subpath in data dir
- std::string GetDataFilePath(const std::string &subpath);
+ //! Returns the full path to a file in data directory given standard dir and subpath
+ std::string GetDataFilePath(DataDir stdDir, const std::string &subpath);
//! Management of language
//@{
Language GetLanguage();
+ char GetLanguageChar();
void SetLanguage(Language language);
//@}
diff --git a/src/common/image.cpp b/src/common/image.cpp
index f3cfa34..ef8097e 100644
--- a/src/common/image.cpp
+++ b/src/common/image.cpp
@@ -124,14 +124,14 @@ bool PNGSaveSurface(const char *filename, SDL_Surface *surf)
png_write_info(png_ptr, info_ptr);
png_set_packing(png_ptr);
- row_pointers = static_cast<png_bytep*>( malloc(sizeof(png_bytep)*surf->h) );
+ row_pointers = new png_bytep[surf->h];
for (i = 0; i < surf->h; i++)
row_pointers[i] = static_cast<png_bytep>( static_cast<Uint8 *>(surf->pixels) ) + i*surf->pitch;
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, info_ptr);
/* Cleaning out... */
- free(row_pointers);
+ delete[] row_pointers;
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
diff --git a/src/object/brain.cpp b/src/object/brain.cpp
index 4ce1bf8..ef7309d 100644
--- a/src/object/brain.cpp
+++ b/src/object/brain.cpp
@@ -99,7 +99,7 @@ CBrain::CBrain(CInstanceManager* iMan, CObject* object)
m_selScript = 0;
m_bTraceRecord = false;
- m_traceRecordBuffer = 0;
+ m_traceRecordBuffer = nullptr;
}
// Object's destructor.
@@ -111,12 +111,21 @@ CBrain::~CBrain()
for ( i=0 ; i<BRAINMAXSCRIPT ; i++ )
{
delete m_script[i];
+ m_script[i] = nullptr;
}
delete m_primaryTask;
+ m_primaryTask = nullptr;
+
delete m_secondaryTask;
+ m_secondaryTask = nullptr;
+
delete m_studio;
- delete m_traceRecordBuffer;
+ m_studio = nullptr;
+
+ delete[] m_traceRecordBuffer;
+ m_traceRecordBuffer = nullptr;
+
m_iMan->DeleteInstance(CLASS_BRAIN, this);
}
@@ -2791,8 +2800,8 @@ void CBrain::TraceRecordStart()
m_traceColor = -1;
}
- delete m_traceRecordBuffer;
- m_traceRecordBuffer = static_cast<TraceRecord*>(malloc(sizeof(TraceRecord)*MAXTRACERECORD));
+ delete[] m_traceRecordBuffer;
+ m_traceRecordBuffer = new TraceRecord[MAXTRACERECORD];
m_traceRecordIndex = 0;
}
@@ -2858,10 +2867,10 @@ void CBrain::TraceRecordStop()
int max, i;
char* buffer;
- if ( m_traceRecordBuffer == 0 ) return;
+ if ( m_traceRecordBuffer == nullptr ) return;
max = 10000;
- buffer = static_cast<char*>(malloc(max));
+ buffer = new char[max];
*buffer = 0;
strncat(buffer, "extern void object::AutoDraw()\n{\n", max-1);
@@ -2892,8 +2901,8 @@ void CBrain::TraceRecordStop()
}
TraceRecordPut(buffer, max, lastOper, lastParam);
- delete m_traceRecordBuffer;
- m_traceRecordBuffer = 0;
+ delete[] m_traceRecordBuffer;
+ m_traceRecordBuffer = nullptr;
strncat(buffer, "}\n", max-1);
buffer[max-1] = 0;
@@ -2904,7 +2913,7 @@ void CBrain::TraceRecordStop()
m_script[i] = new CScript(m_iMan, m_object, &m_secondaryTask);
}
m_script[i]->SendScript(buffer);
- delete buffer;
+ delete[] buffer;
}
// Saves an instruction CBOT.
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index d5805d0..aa2fe22 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -3808,16 +3808,16 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
}
}
- // TODO: language letters
- sprintf(op, "Title.%c", 'E' /*GetLanguageLetter()*/);
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Title.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
OpString(line, "text", m_title);
- sprintf(op, "Resume.%c", 'E' /*GetLanguageLetter()*/);
+ sprintf(op, "Resume.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
OpString(line, "text", m_resume);
- sprintf(op, "ScriptName.%c", 'E' /*GetLanguageLetter()*/);
+ sprintf(op, "ScriptName.%c", m_app->GetLanguageChar());
if (Cmd(line, op) && !resetObject)
OpString(line, "text", m_scriptName);
diff --git a/src/object/task/taskgoto.cpp b/src/object/task/taskgoto.cpp
index ce778ef..cab57f1 100644
--- a/src/object/task/taskgoto.cpp
+++ b/src/object/task/taskgoto.cpp
@@ -2119,7 +2119,7 @@ bool CTaskGoto::BitmapOpen()
BitmapClose();
m_bmSize = static_cast<int>(3200.0f/BM_DIM_STEP);
- m_bmArray = static_cast<unsigned char*>(malloc(m_bmSize*m_bmSize/8*2));
+ m_bmArray = new unsigned char[m_bmSize*m_bmSize/8*2];
memset(m_bmArray, 0, m_bmSize*m_bmSize/8*2);
m_bmOffset = m_bmSize/2;
@@ -2137,7 +2137,7 @@ bool CTaskGoto::BitmapOpen()
bool CTaskGoto::BitmapClose()
{
- free(m_bmArray);
+ delete[] m_bmArray;
m_bmArray = 0;
return true;
}
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 8471df5..57d638e 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -1571,7 +1571,7 @@ bool CScript::rGrab(CBotVar* var, CBotVar* result, int& exception, void* user)
if ( script->m_primaryTask == 0 ) // no task in progress?
{
script->m_primaryTask = new CTaskManager(script->m_iMan, script->m_object);
- if ( var == 0 )
+ if ( var == 0 )
{
type = TMA_FFRONT;
}
@@ -2753,9 +2753,14 @@ void CScript::InitFonctions()
CScript::~CScript()
{
delete m_botProg;
+ m_botProg = nullptr;
+
delete m_primaryTask;
- delete m_script;
- m_script = 0;
+ m_primaryTask = nullptr;
+
+ delete[] m_script;
+ m_script = nullptr;
+
m_len = 0;
m_iMan->DeleteInstance(CLASS_SCRIPT, this);
@@ -2766,7 +2771,7 @@ CScript::~CScript()
void CScript::PutScript(Ui::CEdit* edit, const char* name)
{
- if ( m_script == 0 )
+ if ( m_script == nullptr )
{
New(edit, name);
}
@@ -2785,11 +2790,11 @@ bool CScript::GetScript(Ui::CEdit* edit)
{
int len;
- delete m_script;
- m_script = 0;
+ delete[] m_script;
+ m_script = nullptr;
len = edit->GetTextLength();
- m_script = static_cast<char*>(malloc(sizeof(char)*(len+1)));
+ m_script = new char[len+1];
edit->GetText(m_script, len+1);
edit->GetCursor(m_cursor2, m_cursor1);
@@ -2997,7 +3002,7 @@ void CScript::SetStepMode(bool bStep)
bool CScript::Run()
{
if( m_botProg == 0 ) return false;
- if ( m_script == 0 || m_len == 0 ) return false;
+ if ( m_script == nullptr || m_len == 0 ) return false;
if ( !m_botProg->Start(m_title) ) return false;
@@ -3475,9 +3480,9 @@ bool CScript::IntroduceVirus()
start = found[i+1];
i = found[i+0];
- newScript = static_cast<char*>(malloc(sizeof(char)*(m_len+strlen(names[i+1])+1)));
+ newScript = new char[m_len+strlen(names[i+1])+1];
strcpy(newScript, m_script);
- delete m_script;
+ delete[] m_script;
m_script = newScript;
DeleteToken(m_script, start, strlen(names[i]));
@@ -3638,7 +3643,7 @@ void CScript::New(Ui::CEdit* edit, const char* name)
bool CScript::SendScript(char* text)
{
m_len = strlen(text);
- m_script = static_cast<char*>(malloc(sizeof(char)*(m_len+1)));
+ m_script = new char[m_len+1];
strcpy(m_script, text);
if ( !CheckToken() ) return false;
if ( !Compile() ) return false;
@@ -3669,8 +3674,8 @@ bool CScript::ReadScript(const char* filename)
if ( file == NULL ) return false;
fclose(file);
- delete m_script;
- m_script = 0;
+ delete[] m_script;
+ m_script = nullptr;
edit = m_interface->CreateEdit(Math::Point(0.0f, 0.0f), Math::Point(0.0f, 0.0f), 0, EVENT_EDIT9);
edit->SetMaxChar(Ui::EDITSTUDIOMAX);
@@ -3697,7 +3702,7 @@ bool CScript::WriteScript(const char* filename)
name = filename;
}
- if ( m_script == 0 )
+ if ( m_script == nullptr )
{
remove(filename);
return false;
diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp
index ebf7d10..68e7854 100644
--- a/src/ui/maindialog.cpp
+++ b/src/ui/maindialog.cpp
@@ -4305,8 +4305,8 @@ void CMainDialog::IOReadName()
}
}
- // TODO: language letters
- sprintf(op, "Title.%c", 'E' /*MAX_FNAME()*/ );
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Title.%c", m_app->GetLanguageChar() );
if ( Cmd(line, op) )
{
OpString(line, "resume", resume);
@@ -4701,8 +4701,8 @@ void CMainDialog::UpdateSceneChap(int &chap)
}
}
- /* TODO: language letters */
- sprintf(op, "Title.%c", 'E' /*GetLanguageLetter()*/);
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Title.%c", m_app->GetLanguageChar());
if ( Cmd(line, op) )
{
OpString(line, "text", name);
@@ -4748,8 +4748,8 @@ void CMainDialog::UpdateSceneChap(int &chap)
}
}
- // TODO: language letters
- sprintf(op, "Title.%c", 'E'/*GetLanguageLetter()*/);
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Title.%c", m_app->GetLanguageChar());
if ( Cmd(line, op) )
{
OpString(line, "text", name);
@@ -4851,8 +4851,8 @@ void CMainDialog::UpdateSceneList(int chap, int &sel)
}
}
- // TODO: language letters
- sprintf(op, "Title.%c", 'E' /*MAX_FNAME()*/);
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Title.%c", m_app->GetLanguageChar());
if ( Cmd(line, op) )
{
OpString(line, "text", name);
@@ -4996,8 +4996,8 @@ void CMainDialog::UpdateSceneResume(int rank)
}
}
- // TODO: language letters
- sprintf(op, "Resume.%c", 'E' /*MAX_FNAME()*/);
+ // TODO: Fallback to an non-localized entry
+ sprintf(op, "Resume.%c", m_app->GetLanguageChar());
if ( Cmd(line, op) )
{
OpString(line, "text", name);