support bookmark-file; refs #116

master
Marc Wäckerlin 12 years ago
parent ac8fa676c0
commit 4c1a396547
  1. 58
      src/browser.hxx
  2. 2
      src/editbookmarks.hxx
  3. 7
      src/main.cxx
  4. 72
      src/qbrowserlib/filestorage.hxx
  5. 69
      src/qbrowserlib/qbrowserlib_de.ts
  6. 69
      src/qbrowserlib/qbrowserlib_en.ts
  7. 69
      src/qbrowserlib/qbrowserlib_fr.ts
  8. 69
      src/qbrowserlib/qbrowserlib_it.ts
  9. 3
      src/qbrowserlib/qmake.pro.in
  10. 2
      src/swissbrowser_de.ts
  11. 2
      src/swissbrowser_en.ts
  12. 2
      src/swissbrowser_fr.ts
  13. 2
      src/swissbrowser_it.ts

@ -22,6 +22,7 @@
#include <ui_browser.h>
#include <qbrowserlib/buttonlineedit.hxx>
#include <qbrowserlib/filestorage.hxx>
#include <qbrowserlib/swisswebview.hxx>
#include <QtGui/QMainWindow>
@ -66,7 +67,8 @@ class Browser: public QMainWindow, protected Ui::Browser {
Browser(const QString& actlib, const QStringList& urls = QStringList(),
QSettings* settings=0,
Settings::MimeTypes mimeTypes = Settings::MimeTypes(),
bool kiosk = false, bool login = true, bool quirks=true):
bool kiosk = false, bool login = true, bool quirks=true,
QString bookmarkfile=QString()):
_url(0), _find(new ButtonLineEdit),
_kiosk(kiosk),
_downloadManager(new DownloadManager),
@ -76,7 +78,8 @@ class Browser: public QMainWindow, protected Ui::Browser {
_showErrorLog(0),
_startUrl(urls.size()),
_quirks(quirks), _search(new ButtonLineEdit),
_searchEngines(new QComboBox) {
_searchEngines(new QComboBox),
_bookmarkfile(bookmarkfile) {
LOG<<urls;
_home = "about:blank";
if (urls.size()) _home = urls.at(0);
@ -844,11 +847,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
void saveWin() {
LOG<<"Save Window State";
if (!_settings()) return;
QStringList urls;
if (qobject_cast<QComboBox*>(_url))
for (int i(0); i<qobject_cast<QComboBox*>(_url)->count(); ++i)
urls<<qobject_cast<QComboBox*>(_url)->itemText(i);
_settings()->setValue("Window/Urls", urls);
saveBookmarks();
QStringList tabs;
for (int i(0); i<_tabs->count(); ++i)
tabs<<qobject_cast<QWebView*>(_tabs->widget(i))->url().toString();
@ -858,23 +857,19 @@ class Browser: public QMainWindow, protected Ui::Browser {
_settings()->setValue("Window/WindowState", saveState());
}
void saveBookmarks() {
QStringList urls;
if (qobject_cast<QComboBox*>(_url))
for (int i(0); i<qobject_cast<QComboBox*>(_url)->count(); ++i)
urls<<qobject_cast<QComboBox*>(_url)->itemText(i);
if (!(_bookmarkfile.writeable() && _bookmarkfile.write(urls))
&& _settings())
_settings()->setValue("Window/Urls", urls);
}
void loadWin() {
LOG;
QStringList urls(_settings()->value("Window/Urls").toStringList());
urls.sort();
urls.removeDuplicates();
if (qobject_cast<QComboBox*>(_url)) {
qobject_cast<QComboBox*>(_url)->clear();
qobject_cast<QComboBox*>(_url)->addItems(urls);
}
if (_bookmarks) {
_bookmarks->clear();
for (QStringList::iterator it(urls.begin()); it!=urls.end(); ++it) {
QAction* a(_bookmarks->addAction(*it));
a->setData(*it);
connect(a, SIGNAL(triggered(bool)), SLOT(loadFromHistory()));
}
}
loadBookmarks();
QStringList tabs(_settings()->value("Window/Tabs").toStringList());
int oldCnt(_tabs->count());
for (QStringList::iterator it(tabs.begin()); it!=tabs.end(); ++it) {
@ -888,6 +883,24 @@ class Browser: public QMainWindow, protected Ui::Browser {
restoreGeometry(_settings()->value("Window/Geometry").toByteArray());
restoreState(_settings()->value("Window/WindowState").toByteArray());
}
void loadBookmarks() {
QStringList urls(_bookmarkfile.readable()
?_bookmarkfile.read()
:_settings()->value("Window/Urls").toStringList());
if (qobject_cast<QComboBox*>(_url)) {
qobject_cast<QComboBox*>(_url)->clear();
qobject_cast<QComboBox*>(_url)->addItems(urls);
}
if (_bookmarks) {
_bookmarks->clear();
for (QStringList::iterator it(urls.begin()); it!=urls.end(); ++it) {
QAction* a(_bookmarks->addAction(*it));
a->setData(*it);
connect(a, SIGNAL(triggered(bool)), SLOT(loadFromHistory()));
}
}
}
//@name QWebView slots
//@{
@ -1549,6 +1562,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
bool _quirks;
ButtonLineEdit* _search;
QComboBox* _searchEngines;
FileStorage _bookmarkfile;
};
//! @}

@ -32,7 +32,7 @@ class EditBookmarks: public QDialog, protected Ui::EditBookmarks {
QString current(_url->currentText());
_url->clear();
_url->addItems(urls);
_url->lineEdit()->setText(current);
_url->setEditText(current);
QDialog::accept();
}
virtual void reject() {

@ -333,6 +333,7 @@ int main(int argv, char** argc) try {
bool quirks(false);
bool login(false);
Settings::MimeTypes mimetypes;
QString bookmarks;
QStringList args(app.arguments());
std::auto_ptr<QSettings> settings
(std::auto_ptr<QSettings>(new QSettings("SwissSign", "SwissBrowser")));
@ -356,6 +357,8 @@ int main(int argv, char** argc) try {
" -y, --key <file> load local certificate key from <file>\n"
" -m, --mime <mime> <ext> <tool>\n"
" start <tool> for mimetype <mime>\n"
" -b, --bookmarks <file>\n"
" load and save bookmarks from and to <file>\n"
" <url> optional full URL\n"
"Environment:\n"
" LANGUAGE \"de\", \"en\", ... (actual: %5)\n"
@ -382,6 +385,8 @@ int main(int argv, char** argc) try {
login = true;
} else if ((*it=="-l" || *it=="--lib") && ++it!=args.end()) {
actlib = *it;
} else if ((*it=="-b" || *it=="--bookmarks") && ++it!=args.end()) {
bookmarks = *it;
} else if ((*it=="-s" || *it=="--settings") && ++it!=args.end()) {
settings = std::auto_ptr<QSettings>
(new QSettings(*it, QSettings::IniFormat));
@ -427,7 +432,7 @@ int main(int argv, char** argc) try {
//............................................................................
if (env.contains("QTWEBKIT_PLUGIN_PATH")) qt_drt_overwritePluginDirectories();
Browser browser(actlib, urls, settings.get(), mimetypes, silent,
login, quirks);
login, quirks, bookmarks);
return app.exec();
} catch (std::exception& x) {
std::cerr<<"**** Error: "<<x.what()<<std::endl;

@ -0,0 +1,72 @@
/*! @file
@id $Id$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <cassert>
class Storage: public QObject {
Q_OBJECT;
Q_SIGNALS:
void changed();
public:
Storage() {}
bool valid() {
return readable() || writeable();
}
operator bool() {
return valid();
}
virtual bool readable() = 0;
virtual bool writeable() = 0;
virtual QStringList read() = 0;
virtual bool write(const QStringList& out) = 0;
};
class FileStorage: public Storage {
Q_OBJECT;
public:
FileStorage(QString file): _file(file) {
if (valid()) {
assert(connect(new QFileSystemWatcher(QStringList()<<_file.fileName(),
this),
SIGNAL(fileChanged(const QString&)),
SLOT(changed())));
}
}
bool readable() {
return QFileInfo(_file).exists();
}
bool writeable() {
return readable() || !_file.fileName().isEmpty();
}
QStringList read() {
QStringList res;
if (readable()) {
if (_file.open(QIODevice::ReadOnly))
res=QString::fromUtf8(_file.readAll()).split("\n");
_file.close();
}
return res;
}
bool write(const QStringList& out) {
bool res(false);
if (writeable()) {
if (_file.open(QIODevice::WriteOnly))
if (_file.write(out.join("\n").toUtf8())>=0) res=true;
_file.close();
}
return res;
}
private:
QFile _file;
};

@ -5,81 +5,102 @@
<context>
<name>SaveOrRun</name>
<message>
<source>File Exists</source>
<location filename="saveorrun.ui" line="14"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File already exists:
%1
Overwrite?</source>
<location filename="saveorrun.ui" line="34"/>
<source>File:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As ...</source>
<location filename="saveorrun.ui" line="47"/>
<location filename="saveorrun.ui" line="82"/>
<location filename="saveorrun.ui" line="117"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File With ...</source>
<location filename="saveorrun.ui" line="69"/>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<location filename="saveorrun.ui" line="104"/>
<source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<location filename="saveorrun.ui" line="129"/>
<source>Save File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download</source>
<location filename="saveorrun.ui" line="135"/>
<source>Save File As:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File:</source>
<location filename="saveorrun.ui" line="151"/>
<location filename="saveorrun.ui" line="200"/>
<source>browse ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<location filename="saveorrun.ui" line="158"/>
<source>remember save path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<location filename="saveorrun.ui" line="171"/>
<source>Open in External Application</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source</source>
<location filename="saveorrun.ui" line="177"/>
<source>Open File in:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File</source>
<location filename="saveorrun.ui" line="207"/>
<source>remember tool for this type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As:</source>
<location filename="saveorrun.hxx" line="71"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>browse ...</source>
<location filename="saveorrun.hxx" line="72"/>
<source>File already exists:
%1
Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember save path</source>
<location filename="saveorrun.hxx" line="95"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open in External Application</source>
<location filename="saveorrun.hxx" line="108"/>
<source>Open File With ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File in:</source>
<location filename="saveorrun.hxx" line="122"/>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember tool for this type</source>
<location filename="saveorrun.hxx" line="124"/>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<translation type="unfinished"></translation>
</message>
</context>

@ -5,81 +5,102 @@
<context>
<name>SaveOrRun</name>
<message>
<source>File Exists</source>
<location filename="saveorrun.ui" line="14"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File already exists:
%1
Overwrite?</source>
<location filename="saveorrun.ui" line="34"/>
<source>File:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As ...</source>
<location filename="saveorrun.ui" line="47"/>
<location filename="saveorrun.ui" line="82"/>
<location filename="saveorrun.ui" line="117"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File With ...</source>
<location filename="saveorrun.ui" line="69"/>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<location filename="saveorrun.ui" line="104"/>
<source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<location filename="saveorrun.ui" line="129"/>
<source>Save File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download</source>
<location filename="saveorrun.ui" line="135"/>
<source>Save File As:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File:</source>
<location filename="saveorrun.ui" line="151"/>
<location filename="saveorrun.ui" line="200"/>
<source>browse ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<location filename="saveorrun.ui" line="158"/>
<source>remember save path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<location filename="saveorrun.ui" line="171"/>
<source>Open in External Application</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source</source>
<location filename="saveorrun.ui" line="177"/>
<source>Open File in:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File</source>
<location filename="saveorrun.ui" line="207"/>
<source>remember tool for this type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As:</source>
<location filename="saveorrun.hxx" line="71"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>browse ...</source>
<location filename="saveorrun.hxx" line="72"/>
<source>File already exists:
%1
Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember save path</source>
<location filename="saveorrun.hxx" line="95"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open in External Application</source>
<location filename="saveorrun.hxx" line="108"/>
<source>Open File With ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File in:</source>
<location filename="saveorrun.hxx" line="122"/>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember tool for this type</source>
<location filename="saveorrun.hxx" line="124"/>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<translation type="unfinished"></translation>
</message>
</context>

@ -5,81 +5,102 @@
<context>
<name>SaveOrRun</name>
<message>
<source>File Exists</source>
<location filename="saveorrun.ui" line="14"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File already exists:
%1
Overwrite?</source>
<location filename="saveorrun.ui" line="34"/>
<source>File:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As ...</source>
<location filename="saveorrun.ui" line="47"/>
<location filename="saveorrun.ui" line="82"/>
<location filename="saveorrun.ui" line="117"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File With ...</source>
<location filename="saveorrun.ui" line="69"/>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<location filename="saveorrun.ui" line="104"/>
<source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<location filename="saveorrun.ui" line="129"/>
<source>Save File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download</source>
<location filename="saveorrun.ui" line="135"/>
<source>Save File As:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File:</source>
<location filename="saveorrun.ui" line="151"/>
<location filename="saveorrun.ui" line="200"/>
<source>browse ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<location filename="saveorrun.ui" line="158"/>
<source>remember save path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<location filename="saveorrun.ui" line="171"/>
<source>Open in External Application</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source</source>
<location filename="saveorrun.ui" line="177"/>
<source>Open File in:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File</source>
<location filename="saveorrun.ui" line="207"/>
<source>remember tool for this type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As:</source>
<location filename="saveorrun.hxx" line="71"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>browse ...</source>
<location filename="saveorrun.hxx" line="72"/>
<source>File already exists:
%1
Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember save path</source>
<location filename="saveorrun.hxx" line="95"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open in External Application</source>
<location filename="saveorrun.hxx" line="108"/>
<source>Open File With ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File in:</source>
<location filename="saveorrun.hxx" line="122"/>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember tool for this type</source>
<location filename="saveorrun.hxx" line="124"/>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<translation type="unfinished"></translation>
</message>
</context>

@ -5,81 +5,102 @@
<context>
<name>SaveOrRun</name>
<message>
<source>File Exists</source>
<location filename="saveorrun.ui" line="14"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File already exists:
%1
Overwrite?</source>
<location filename="saveorrun.ui" line="34"/>
<source>File:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As ...</source>
<location filename="saveorrun.ui" line="47"/>
<location filename="saveorrun.ui" line="82"/>
<location filename="saveorrun.ui" line="117"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File With ...</source>
<location filename="saveorrun.ui" line="69"/>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<location filename="saveorrun.ui" line="104"/>
<source>Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<location filename="saveorrun.ui" line="129"/>
<source>Save File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download</source>
<location filename="saveorrun.ui" line="135"/>
<source>Save File As:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File:</source>
<location filename="saveorrun.ui" line="151"/>
<location filename="saveorrun.ui" line="200"/>
<source>browse ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>...</source>
<location filename="saveorrun.ui" line="158"/>
<source>remember save path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<location filename="saveorrun.ui" line="171"/>
<source>Open in External Application</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source</source>
<location filename="saveorrun.ui" line="177"/>
<source>Open File in:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File</source>
<location filename="saveorrun.ui" line="207"/>
<source>remember tool for this type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save File As:</source>
<location filename="saveorrun.hxx" line="71"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>browse ...</source>
<location filename="saveorrun.hxx" line="72"/>
<source>File already exists:
%1
Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember save path</source>
<location filename="saveorrun.hxx" line="95"/>
<source>Save File As ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open in External Application</source>
<location filename="saveorrun.hxx" line="108"/>
<source>Open File With ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Open File in:</source>
<location filename="saveorrun.hxx" line="122"/>
<source>Dokumente</source>
<comment>Documents folder in local language</comment>
<translation type="unfinished"></translation>
</message>
<message>
<source>remember tool for this type</source>
<location filename="saveorrun.hxx" line="124"/>
<source>Arbeitsfläche</source>
<comment>Desktop folder in local language</comment>
<translation type="unfinished"></translation>
</message>
</context>

@ -38,7 +38,8 @@ SOURCES =
HEADERS = @srcdir@/swisswebview.hxx @srcdir@/swisswebpage.hxx \
@srcdir@/pluginfactory.hxx @srcdir@/saveorrun.hxx \
@srcdir@/buttonlineedit.hxx
@srcdir@/buttonlineedit.hxx \
@srcdir@/filestorage.hxx
FORMS = @srcdir@/saveorrun.ui

@ -730,6 +730,8 @@ Options:
-y, --key &lt;file&gt; load local certificate key from &lt;file&gt;
-m, --mime &lt;mime&gt; &lt;ext&gt; &lt;tool&gt;
start &lt;tool&gt; for mimetype &lt;mime&gt;
-b, --bookmarks &lt;file&gt;
load and save bookmarks from and to &lt;file&gt;
&lt;url&gt; optional full URL
Environment:
LANGUAGE &quot;de&quot;, &quot;en&quot;, ... (actual: %5)

@ -730,6 +730,8 @@ Options:
-y, --key &lt;file&gt; load local certificate key from &lt;file&gt;
-m, --mime &lt;mime&gt; &lt;ext&gt; &lt;tool&gt;
start &lt;tool&gt; for mimetype &lt;mime&gt;
-b, --bookmarks &lt;file&gt;
load and save bookmarks from and to &lt;file&gt;
&lt;url&gt; optional full URL
Environment:
LANGUAGE &quot;de&quot;, &quot;en&quot;, ... (actual: %5)

@ -730,6 +730,8 @@ Options:
-y, --key &lt;file&gt; load local certificate key from &lt;file&gt;
-m, --mime &lt;mime&gt; &lt;ext&gt; &lt;tool&gt;
start &lt;tool&gt; for mimetype &lt;mime&gt;
-b, --bookmarks &lt;file&gt;
load and save bookmarks from and to &lt;file&gt;
&lt;url&gt; optional full URL
Environment:
LANGUAGE &quot;de&quot;, &quot;en&quot;, ... (actual: %5)

@ -730,6 +730,8 @@ Options:
-y, --key &lt;file&gt; load local certificate key from &lt;file&gt;
-m, --mime &lt;mime&gt; &lt;ext&gt; &lt;tool&gt;
start &lt;tool&gt; for mimetype &lt;mime&gt;
-b, --bookmarks &lt;file&gt;
load and save bookmarks from and to &lt;file&gt;
&lt;url&gt; optional full URL
Environment:
LANGUAGE &quot;de&quot;, &quot;en&quot;, ... (actual: %5)

Loading…
Cancel
Save