mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-06-15 21:22:40 +00:00
@@ -722,6 +722,60 @@ Flickable {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
spacing: 5
|
spacing: 5
|
||||||
|
|
||||||
|
Label {
|
||||||
|
width: parent.width
|
||||||
|
id: languageTitle
|
||||||
|
text: qsTr("Language")
|
||||||
|
font.pointSize: 12
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoResizingComboBox {
|
||||||
|
// ignore setting the index at first, and actually set it when the component is loaded
|
||||||
|
Component.onCompleted: {
|
||||||
|
var saved_language = StreamingPreferences.language
|
||||||
|
currentIndex = 0
|
||||||
|
for (var i = 0; i < languageListModel.count; i++) {
|
||||||
|
var el_language = languageListModel.get(i).val;
|
||||||
|
if (saved_language === el_language) {
|
||||||
|
currentIndex = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
activated(currentIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
id: languageComboBox
|
||||||
|
textRole: "text"
|
||||||
|
model: ListModel {
|
||||||
|
id: languageListModel
|
||||||
|
ListElement {
|
||||||
|
text: qsTr("Automatic")
|
||||||
|
val: StreamingPreferences.LANG_AUTO
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: qsTr("English")
|
||||||
|
val: StreamingPreferences.LANG_EN
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: qsTr("French")
|
||||||
|
val: StreamingPreferences.LANG_FR
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: qsTr("Simplified Chinese")
|
||||||
|
val: StreamingPreferences.LANG_ZH_CN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
||||||
|
onActivated : {
|
||||||
|
StreamingPreferences.language = languageListModel.get(currentIndex).val
|
||||||
|
if (!StreamingPreferences.retranslate()) {
|
||||||
|
ToolTip.show(qsTr("You must restart Moonlight for this change to take effect"), 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
id: uiDisplayModeTitle
|
id: uiDisplayModeTitle
|
||||||
|
|||||||
+5
-5
@@ -451,9 +451,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QGuiApplication app(argc, argv);
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
QTranslator translator;
|
// Apply the initial translation based on user preference
|
||||||
qDebug() << "Translation loaded:" << translator.load(QString(":/languages/qml_") + QLocale::system().name());
|
StreamingPreferences prefs;
|
||||||
app.installTranslator(&translator);
|
prefs.retranslate();
|
||||||
|
|
||||||
// After the QGuiApplication is created, the platform stuff will be initialized
|
// After the QGuiApplication is created, the platform stuff will be initialized
|
||||||
// and we can set the SDL video driver to match Qt.
|
// and we can set the SDL video driver to match Qt.
|
||||||
@@ -525,8 +525,8 @@ int main(int argc, char *argv[])
|
|||||||
});
|
});
|
||||||
qmlRegisterSingletonType<StreamingPreferences>("StreamingPreferences", 1, 0,
|
qmlRegisterSingletonType<StreamingPreferences>("StreamingPreferences", 1, 0,
|
||||||
"StreamingPreferences",
|
"StreamingPreferences",
|
||||||
[](QQmlEngine*, QJSEngine*) -> QObject* {
|
[](QQmlEngine* qmlEngine, QJSEngine*) -> QObject* {
|
||||||
return new StreamingPreferences();
|
return new StreamingPreferences(qmlEngine);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create the identity manager on the main thread
|
// Create the identity manager on the main thread
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "streamingpreferences.h"
|
#include "streamingpreferences.h"
|
||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
#include <QTranslator>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
|
||||||
#define SER_STREAMSETTINGS "streamsettings"
|
#define SER_STREAMSETTINGS "streamsettings"
|
||||||
#define SER_WIDTH "width"
|
#define SER_WIDTH "width"
|
||||||
@@ -36,11 +38,20 @@
|
|||||||
#define SER_REVERSESCROLL "reversescroll"
|
#define SER_REVERSESCROLL "reversescroll"
|
||||||
#define SER_SWAPFACEBUTTONS "swapfacebuttons"
|
#define SER_SWAPFACEBUTTONS "swapfacebuttons"
|
||||||
#define SER_CAPTURESYSKEYS "capturesyskeys"
|
#define SER_CAPTURESYSKEYS "capturesyskeys"
|
||||||
|
#define SER_LANGUAGE "language"
|
||||||
|
|
||||||
#define CURRENT_DEFAULT_VER 1
|
#define CURRENT_DEFAULT_VER 1
|
||||||
|
|
||||||
StreamingPreferences::StreamingPreferences(QObject *parent)
|
StreamingPreferences::StreamingPreferences(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent),
|
||||||
|
m_QmlEngine(nullptr)
|
||||||
|
{
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamingPreferences::StreamingPreferences(QQmlEngine *qmlEngine, QObject *parent)
|
||||||
|
: QObject(parent),
|
||||||
|
m_QmlEngine(qmlEngine)
|
||||||
{
|
{
|
||||||
reload();
|
reload();
|
||||||
}
|
}
|
||||||
@@ -95,6 +106,8 @@ void StreamingPreferences::reload()
|
|||||||
uiDisplayMode = static_cast<UIDisplayMode>(settings.value(SER_UIDISPLAYMODE,
|
uiDisplayMode = static_cast<UIDisplayMode>(settings.value(SER_UIDISPLAYMODE,
|
||||||
static_cast<int>(settings.value(SER_STARTWINDOWED, true).toBool() ? UIDisplayMode::UI_WINDOWED
|
static_cast<int>(settings.value(SER_STARTWINDOWED, true).toBool() ? UIDisplayMode::UI_WINDOWED
|
||||||
: UIDisplayMode::UI_MAXIMIZED)).toInt());
|
: UIDisplayMode::UI_MAXIMIZED)).toInt());
|
||||||
|
language = static_cast<Language>(settings.value(SER_LANGUAGE,
|
||||||
|
static_cast<int>(Language::LANG_AUTO)).toInt());
|
||||||
|
|
||||||
|
|
||||||
// Perform default settings updates as required based on last default version
|
// Perform default settings updates as required based on last default version
|
||||||
@@ -108,6 +121,74 @@ void StreamingPreferences::reload()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool StreamingPreferences::retranslate()
|
||||||
|
{
|
||||||
|
static QTranslator* translator = nullptr;
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
|
||||||
|
if (m_QmlEngine != nullptr) {
|
||||||
|
// Dynamic retranslation is not supported until Qt 5.10
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QTranslator* newTranslator = new QTranslator();
|
||||||
|
QString languageSuffix = getSuffixFromLanguage(language);
|
||||||
|
|
||||||
|
// Remove the old translator, even if we can't load a new one.
|
||||||
|
// Otherwise we'll be stuck with the old translated values instead
|
||||||
|
// of defaulting to English.
|
||||||
|
if (translator != nullptr) {
|
||||||
|
QCoreApplication::removeTranslator(translator);
|
||||||
|
delete translator;
|
||||||
|
translator = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newTranslator->load(QString(":/languages/qml_") + languageSuffix)) {
|
||||||
|
qInfo() << "Successfully loaded translation for " << languageSuffix;
|
||||||
|
|
||||||
|
translator = newTranslator;
|
||||||
|
QCoreApplication::installTranslator(translator);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qInfo() << "No translation available for " << languageSuffix;
|
||||||
|
delete newTranslator;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_QmlEngine != nullptr) {
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||||
|
// This is a dynamic retranslation from the settings page.
|
||||||
|
// We have to kick the QML engine into reloading our text.
|
||||||
|
m_QmlEngine->retranslate();
|
||||||
|
#else
|
||||||
|
// Unreachable below Qt 5.10 due to the check above
|
||||||
|
Q_ASSERT(FALSE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This is a translation from a non-QML context, which means
|
||||||
|
// it is probably app startup. There's nothing to refresh.
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StreamingPreferences::getSuffixFromLanguage(StreamingPreferences::Language lang)
|
||||||
|
{
|
||||||
|
switch (lang)
|
||||||
|
{
|
||||||
|
case LANG_EN:
|
||||||
|
return "en";
|
||||||
|
case LANG_FR:
|
||||||
|
return "fr";
|
||||||
|
case LANG_ZH_CN:
|
||||||
|
return "zh_cn";
|
||||||
|
case LANG_AUTO:
|
||||||
|
default:
|
||||||
|
return QLocale::system().name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void StreamingPreferences::save()
|
void StreamingPreferences::save()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
@@ -136,6 +217,7 @@ void StreamingPreferences::save()
|
|||||||
settings.setValue(SER_VIDEODEC, static_cast<int>(videoDecoderSelection));
|
settings.setValue(SER_VIDEODEC, static_cast<int>(videoDecoderSelection));
|
||||||
settings.setValue(SER_WINDOWMODE, static_cast<int>(windowMode));
|
settings.setValue(SER_WINDOWMODE, static_cast<int>(windowMode));
|
||||||
settings.setValue(SER_UIDISPLAYMODE, static_cast<int>(uiDisplayMode));
|
settings.setValue(SER_UIDISPLAYMODE, static_cast<int>(uiDisplayMode));
|
||||||
|
settings.setValue(SER_LANGUAGE, static_cast<int>(language));
|
||||||
settings.setValue(SER_DEFAULTVER, CURRENT_DEFAULT_VER);
|
settings.setValue(SER_DEFAULTVER, CURRENT_DEFAULT_VER);
|
||||||
settings.setValue(SER_SWAPMOUSEBUTTONS, swapMouseButtons);
|
settings.setValue(SER_SWAPMOUSEBUTTONS, swapMouseButtons);
|
||||||
settings.setValue(SER_MUTEONFOCUSLOSS, muteOnFocusLoss);
|
settings.setValue(SER_MUTEONFOCUSLOSS, muteOnFocusLoss);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QRect>
|
#include <QRect>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
class StreamingPreferences : public QObject
|
class StreamingPreferences : public QObject
|
||||||
{
|
{
|
||||||
@@ -9,6 +10,7 @@ class StreamingPreferences : public QObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
StreamingPreferences(QObject *parent = nullptr);
|
StreamingPreferences(QObject *parent = nullptr);
|
||||||
|
StreamingPreferences(QQmlEngine *qmlEngine, QObject *parent = nullptr);
|
||||||
|
|
||||||
Q_INVOKABLE static int
|
Q_INVOKABLE static int
|
||||||
getDefaultBitrate(int width, int height, int fps);
|
getDefaultBitrate(int width, int height, int fps);
|
||||||
@@ -58,6 +60,15 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(UIDisplayMode)
|
Q_ENUM(UIDisplayMode)
|
||||||
|
|
||||||
|
enum Language
|
||||||
|
{
|
||||||
|
LANG_AUTO,
|
||||||
|
LANG_EN,
|
||||||
|
LANG_FR,
|
||||||
|
LANG_ZH_CN
|
||||||
|
};
|
||||||
|
Q_ENUM(Language);
|
||||||
|
|
||||||
Q_PROPERTY(int width MEMBER width NOTIFY displayModeChanged)
|
Q_PROPERTY(int width MEMBER width NOTIFY displayModeChanged)
|
||||||
Q_PROPERTY(int height MEMBER height NOTIFY displayModeChanged)
|
Q_PROPERTY(int height MEMBER height NOTIFY displayModeChanged)
|
||||||
Q_PROPERTY(int fps MEMBER fps NOTIFY displayModeChanged)
|
Q_PROPERTY(int fps MEMBER fps NOTIFY displayModeChanged)
|
||||||
@@ -88,6 +99,9 @@ public:
|
|||||||
Q_PROPERTY(bool reverseScrollDirection MEMBER reverseScrollDirection NOTIFY reverseScrollDirectionChanged)
|
Q_PROPERTY(bool reverseScrollDirection MEMBER reverseScrollDirection NOTIFY reverseScrollDirectionChanged)
|
||||||
Q_PROPERTY(bool swapFaceButtons MEMBER swapFaceButtons NOTIFY swapFaceButtonsChanged)
|
Q_PROPERTY(bool swapFaceButtons MEMBER swapFaceButtons NOTIFY swapFaceButtonsChanged)
|
||||||
Q_PROPERTY(bool captureSysKeys MEMBER captureSysKeys NOTIFY captureSysKeysChanged)
|
Q_PROPERTY(bool captureSysKeys MEMBER captureSysKeys NOTIFY captureSysKeysChanged)
|
||||||
|
Q_PROPERTY(Language language MEMBER language NOTIFY languageChanged);
|
||||||
|
|
||||||
|
Q_INVOKABLE bool retranslate();
|
||||||
|
|
||||||
// Directly accessible members for preferences
|
// Directly accessible members for preferences
|
||||||
int width;
|
int width;
|
||||||
@@ -121,6 +135,7 @@ public:
|
|||||||
WindowMode windowMode;
|
WindowMode windowMode;
|
||||||
WindowMode recommendedFullScreenMode;
|
WindowMode recommendedFullScreenMode;
|
||||||
UIDisplayMode uiDisplayMode;
|
UIDisplayMode uiDisplayMode;
|
||||||
|
Language language;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void displayModeChanged();
|
void displayModeChanged();
|
||||||
@@ -150,5 +165,11 @@ signals:
|
|||||||
void reverseScrollDirectionChanged();
|
void reverseScrollDirectionChanged();
|
||||||
void swapFaceButtonsChanged();
|
void swapFaceButtonsChanged();
|
||||||
void captureSysKeysChanged();
|
void captureSysKeysChanged();
|
||||||
|
void languageChanged();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString getSuffixFromLanguage(Language lang);
|
||||||
|
|
||||||
|
QQmlEngine* m_QmlEngine;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user