forked from Mirrors/openclonk
172 lines
4.8 KiB
C++
172 lines
4.8 KiB
C++
/*
|
|
* OpenClonk, http://www.openclonk.org
|
|
*
|
|
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
|
|
* Copyright (c) 2013, The OpenClonk Team and contributors
|
|
*
|
|
* Distributed under the terms of the ISC license; see accompanying file
|
|
* "COPYING" for details.
|
|
*
|
|
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
|
|
* See accompanying file "TRADEMARK" for details.
|
|
*
|
|
* To redistribute this file separately, substitute the full license texts
|
|
* for the above references.
|
|
*/
|
|
|
|
/* String localization editors */
|
|
|
|
#include "C4Include.h"
|
|
#include "script/C4Value.h"
|
|
#include "config/C4Config.h"
|
|
#include "editor/C4ConsoleQtLocalizeString.h"
|
|
#include "c4group/C4Language.h"
|
|
|
|
|
|
/* Single string editor */
|
|
|
|
C4ConsoleQtLocalizeStringDlg::C4ConsoleQtLocalizeStringDlg(class QMainWindow *parent_window, const C4Value &translations)
|
|
: QDialog(parent_window, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint)
|
|
, translations(translations)
|
|
{
|
|
ui.setupUi(this);
|
|
// Add language editors
|
|
int32_t lang_index = 0;
|
|
C4LanguageInfo *lang_info;
|
|
while (lang_info = ::Languages.GetInfo(lang_index++))
|
|
{
|
|
AddEditor(lang_info->Code, lang_info->Name);
|
|
}
|
|
// Fill in values
|
|
C4PropList *translations_proplist = translations.getPropList();
|
|
assert(translations_proplist);
|
|
for (C4String *lang_str : translations_proplist->GetSortedLocalProperties(false))
|
|
{
|
|
if (lang_str->GetData().getLength() == 2)
|
|
{
|
|
C4Value text_val;
|
|
if (translations_proplist->GetPropertyByS(lang_str, &text_val))
|
|
{
|
|
C4String *text = text_val.getStr();
|
|
if (text)
|
|
{
|
|
QLineEdit *editor = GetEditorByLanguage(lang_str->GetCStr());
|
|
if (!editor)
|
|
{
|
|
// Unknown language. Just add an editor without language name.
|
|
editor = AddEditor(lang_str->GetCStr(), nullptr);
|
|
}
|
|
editor->setText(QString(text->GetCStr()));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Size
|
|
adjustSize();
|
|
setMinimumSize(size());
|
|
// Focus on first empty editor
|
|
if (edited_languages.size())
|
|
{
|
|
edited_languages.front().value_editor->setFocus(); // fallback to first editor
|
|
for (const auto & langs : edited_languages)
|
|
{
|
|
if (!langs.value_editor->text().length())
|
|
{
|
|
langs.value_editor->setFocus();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void C4ConsoleQtLocalizeStringDlg::DoError(const char *msg)
|
|
{
|
|
QMessageBox::critical(this, ::LoadResStr("IDS_ERR_TITLE"), QString(msg));
|
|
}
|
|
|
|
QLineEdit *C4ConsoleQtLocalizeStringDlg::AddEditor(const char *language, const char *language_name)
|
|
{
|
|
assert(!GetEditorByLanguage(language));
|
|
// Add editor widgets
|
|
int32_t row = edited_languages.size();
|
|
QString language_label_text(language);
|
|
if (language_name) language_label_text.append(FormatString(" (%s)", language_name).getData());
|
|
QLabel *language_label = new QLabel(language_label_text, this);
|
|
ui.mainGrid->addWidget(language_label, row, 0);
|
|
QLineEdit *value_editor = new QLineEdit(this);
|
|
ui.mainGrid->addWidget(value_editor, row, 1);
|
|
// Add to list
|
|
EditedLanguage new_editor;
|
|
SCopy(language, new_editor.language, 2);
|
|
new_editor.value_editor = value_editor;
|
|
edited_languages.push_back(new_editor);
|
|
return value_editor;
|
|
}
|
|
|
|
QLineEdit *C4ConsoleQtLocalizeStringDlg::GetEditorByLanguage(const char *language)
|
|
{
|
|
// Search text editor by language ID
|
|
for (const auto & langs : edited_languages)
|
|
{
|
|
if (!strcmp(langs.language, language))
|
|
{
|
|
return langs.value_editor;
|
|
}
|
|
}
|
|
// Not found
|
|
return nullptr;
|
|
}
|
|
|
|
void C4ConsoleQtLocalizeStringDlg::done(int r)
|
|
{
|
|
if (QDialog::Accepted == r) // ok was pressed
|
|
{
|
|
C4PropList *translations_proplist = translations.getPropList();
|
|
assert(translations_proplist);
|
|
// Set all translations
|
|
for (const auto & langs : edited_languages)
|
|
{
|
|
// Empty strings are set to nil, because that allows the user to set it to fallback
|
|
QString text = langs.value_editor->text();
|
|
if (text.length())
|
|
{
|
|
C4Value text_val = C4VString(text.toUtf8());
|
|
translations_proplist->SetPropertyByS(::Strings.RegString(langs.language), text_val);
|
|
}
|
|
else
|
|
{
|
|
translations_proplist->ResetProperty(::Strings.RegString(langs.language));
|
|
}
|
|
}
|
|
}
|
|
// Close
|
|
QDialog::done(r);
|
|
}
|
|
|
|
void C4ConsoleQtLocalizeStringDlg::AddLanguagePressed()
|
|
{
|
|
bool lang_ok = false;
|
|
QRegExpValidator validator(QRegExp("^[a-zA-Z][a-zA-Z]$"), this);
|
|
QString lang_id;
|
|
while (!lang_ok)
|
|
{
|
|
bool ok; int q = 0;
|
|
lang_id = QInputDialog::getText(this, LoadResStr("IDS_CNS_ADDLANGUAGE"), LoadResStr("IDS_CNS_ADDLANGUAGEID"), QLineEdit::Normal, QString(), &ok);
|
|
if (!ok) return;
|
|
lang_ok = (validator.validate(lang_id, q) == QValidator::Acceptable);
|
|
if (!lang_ok)
|
|
{
|
|
DoError(LoadResStr("IDS_ERR_INVALIDLANGUAGEID"));
|
|
}
|
|
}
|
|
// Either add or just focus existing editor
|
|
QLineEdit *editor = GetEditorByLanguage(lang_id.toUtf8());
|
|
if (!editor)
|
|
{
|
|
editor = AddEditor(lang_id.toUtf8(), nullptr);
|
|
adjustSize();
|
|
setMinimumSize(size());
|
|
}
|
|
editor->setFocus();
|
|
}
|