mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-10-16 13:34:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
caba0499d7 | ||
|
|
13deacfc3b | ||
|
|
7231085456 | ||
|
|
663bb4aa10 | ||
|
|
18721b4542 | ||
|
|
19232722e2 | ||
|
|
d2eca68484 | ||
|
|
091167478e | ||
|
|
547b8abc56 | ||
|
|
dbfac45d59 | ||
|
|
086f6de867 | ||
|
|
0f93091848 | ||
|
|
ac19f62ed9 | ||
|
|
8fcef63890 | ||
|
|
34cd2c1afa | ||
|
|
5d1a19d49c | ||
|
|
2fbb320539 | ||
|
|
b50e5ed7e6 | ||
|
|
26c82ca72c | ||
|
|
f8a8a431a8 | ||
|
|
fd27867195 | ||
|
|
5e2a627795 | ||
|
|
e081401c2d | ||
|
|
e62a268aac | ||
|
|
140a9e5191 | ||
|
|
51b5f8046f | ||
|
|
91b965d1aa | ||
|
|
f8faccee59 | ||
|
|
6ac46a36a7 | ||
|
|
27572ba4bc | ||
|
|
21be832161 | ||
|
|
5769632793 | ||
|
|
9efd959ed8 | ||
|
|
5c72afe17e | ||
|
|
dc24319333 | ||
|
|
1acbdf94aa | ||
|
|
44229dfe51 | ||
|
|
13206227d9 | ||
|
|
e3e8a57df6 | ||
|
|
7afff80984 | ||
|
|
500522418e | ||
|
|
5ccac5a5c3 | ||
|
|
69822f4401 | ||
|
|
f290cfbd35 | ||
|
|
fae30f59ce | ||
|
|
a15f303c0a | ||
|
|
5e85038d78 | ||
|
|
4e7b35c54e | ||
|
|
48dde310ae | ||
|
|
6b041e7657 | ||
|
|
69576ee1e1 | ||
|
|
bd3105f62e | ||
|
|
02e3f0e71b | ||
|
|
74bf981f3d | ||
|
|
32f0678692 | ||
|
|
e74753bec1 | ||
|
|
4a8c9ad17f | ||
|
|
0c6c882f50 | ||
|
|
579f25c1ba | ||
|
|
d5eb5c8816 | ||
|
|
26d04b5f9c | ||
|
|
a0b9684504 | ||
|
|
402b6d1f0c | ||
|
|
e87a5fa354 | ||
|
|
63574f643e | ||
|
|
1d6b1020c3 | ||
|
|
96337a3230 | ||
|
|
950c59d8b4 | ||
|
|
9cfd095281 | ||
|
|
996e049863 | ||
|
|
6e42817c3e | ||
|
|
7758344a57 | ||
|
|
b5df566b6b |
@@ -4,10 +4,11 @@
|
||||
|
||||
Moonlight also has mobile versions for [Android](https://github.com/moonlight-stream/moonlight-android) and [iOS](https://github.com/moonlight-stream/moonlight-ios).
|
||||
|
||||
You can follow development on our [Discord server](https://moonlight-stream.org/discord).
|
||||
You can follow development on our [Discord server](https://moonlight-stream.org/discord) and help translate Moonlight into your language on [Weblate](https://hosted.weblate.org/projects/moonlight/moonlight-qt/).
|
||||
|
||||
[](https://ci.appveyor.com/project/cgutman/moonlight-qt/branch/master)
|
||||
[](https://github.com/moonlight-stream/moonlight-qt/releases)
|
||||
[](https://hosted.weblate.org/projects/moonlight/moonlight-qt/)
|
||||
|
||||
## Features
|
||||
- Hardware accelerated video decoding on Windows, Mac, and Linux
|
||||
@@ -28,6 +29,12 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
|
||||
- [Raspberry Pi 4](https://github.com/moonlight-stream/moonlight-docs/wiki/Installing-Moonlight-Qt-on-Raspberry-Pi-4)
|
||||
- [NVIDIA Jetson and Nintendo Switch (Ubuntu L4T)](https://github.com/moonlight-stream/moonlight-docs/wiki/Installing-Moonlight-Qt-on-Linux4Tegra-(L4T)-Ubuntu)
|
||||
|
||||
#### Special Thanks
|
||||
|
||||
[](https://cloudsmith.com)
|
||||
|
||||
Hosting for Moonlight's Raspberry Pi and L4T package repositories is graciously provided for free by [Cloudsmith](https://cloudsmith.com).
|
||||
|
||||
## Building
|
||||
|
||||
### Windows Build Requirements
|
||||
@@ -49,7 +56,7 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
|
||||
* GCC or Clang
|
||||
* Install the required packages:
|
||||
* Debian/Ubuntu: `libegl1-mesa-dev libgl1-mesa-dev libopus-dev libqt5svg5-dev libsdl2-dev libsdl2-ttf-dev libssl-dev libavcodec-dev libva-dev libvdpau-dev libxkbcommon-dev qt5-default qt5-qmake qtbase5-dev qtdeclarative5-dev qtquickcontrols2-5-dev wayland-protocols qml-module-qtquick-controls2 qml-module-qtquick-layouts qml-module-qtquick-window2 qml-module-qtquick2`
|
||||
* RedHat/Fedora: `openssl-devel qt5-devel SDL2-devel ffmpeg-devel qt5-qtquickcontrols2-devel libva-devel libvdpau-devel opus-devel pulseaudio-libs-devel alsa-lib-devel SDL2_ttf-devel`
|
||||
* RedHat/Fedora: `openssl-devel SDL2-devel SDL2_ttf-devel ffmpeg-devel qt5-qtsvg-devel qt5-qtquickcontrols2-devel libva-devel libvdpau-devel opus-devel pulseaudio-libs-devel alsa-lib-devel`
|
||||
* FFmpeg 4.0+ is required to build. If your distro doesn't package FFmpeg 4.0 or later, you can build and install it from source on https://ffmpeg.org/
|
||||
|
||||
### Steam Link Build Requirements
|
||||
|
||||
+1
-1
Submodule app/SDL_GameControllerDB updated: 8ce603d733...376c576317
+6
-1
@@ -131,6 +131,7 @@ SOURCES += \
|
||||
cli/commandlineparser.cpp \
|
||||
cli/quitstream.cpp \
|
||||
cli/startstream.cpp \
|
||||
settings/compatfetcher.cpp \
|
||||
settings/mappingfetcher.cpp \
|
||||
settings/streamingpreferences.cpp \
|
||||
streaming/input/abstouch.cpp \
|
||||
@@ -156,6 +157,7 @@ SOURCES += \
|
||||
|
||||
HEADERS += \
|
||||
backend/nvapp.h \
|
||||
settings/compatfetcher.h \
|
||||
settings/mappingfetcher.h \
|
||||
utils.h \
|
||||
backend/computerseeker.h \
|
||||
@@ -327,7 +329,10 @@ RESOURCES += \
|
||||
TRANSLATIONS += \
|
||||
languages/qml_zh_cn.ts \
|
||||
languages/qml_de.ts \
|
||||
languages/qml_fr.ts
|
||||
languages/qml_fr.ts \
|
||||
languages/qml_nb_NO.ts \
|
||||
languages/qml_ru.ts \
|
||||
languages/qml_es.ts
|
||||
|
||||
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||
QML_IMPORT_PATH =
|
||||
|
||||
@@ -146,7 +146,8 @@ private:
|
||||
ComputerManager::ComputerManager(QObject *parent)
|
||||
: QObject(parent),
|
||||
m_PollingRef(0),
|
||||
m_MdnsBrowser(nullptr)
|
||||
m_MdnsBrowser(nullptr),
|
||||
m_CompatFetcher(nullptr)
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
@@ -159,6 +160,9 @@ ComputerManager::ComputerManager(QObject *parent)
|
||||
}
|
||||
settings.endArray();
|
||||
|
||||
// Fetch latest compatibility data asynchronously
|
||||
m_CompatFetcher.start();
|
||||
|
||||
// To quit in a timely manner, we must block additional requests
|
||||
// after we receive the aboutToQuit() signal. This is neccessary
|
||||
// because NvHTTP uses aboutToQuit() to abort requests in progres
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "nvcomputer.h"
|
||||
#include "nvpairingmanager.h"
|
||||
#include "settings/compatfetcher.h"
|
||||
|
||||
#include <qmdnsengine/server.h>
|
||||
#include <qmdnsengine/cache.h>
|
||||
@@ -214,4 +215,5 @@ private:
|
||||
QMdnsEngine::Browser* m_MdnsBrowser;
|
||||
QMdnsEngine::Cache m_MdnsCache;
|
||||
QVector<MdnsPendingComputer*> m_PendingResolution;
|
||||
CompatFetcher m_CompatFetcher;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "nvcomputer.h"
|
||||
#include "nvapp.h"
|
||||
#include "settings/compatfetcher.h"
|
||||
|
||||
#include <QUdpSocket>
|
||||
#include <QHostInfo>
|
||||
@@ -50,6 +51,7 @@ NvComputer::NvComputer(QSettings& settings)
|
||||
this->serverCodecModeSupport = 0;
|
||||
this->pendingQuit = false;
|
||||
this->gpuModel = nullptr;
|
||||
this->isSupportedServerVersion = true;
|
||||
}
|
||||
|
||||
void NvComputer::serialize(QSettings& settings) const
|
||||
@@ -143,6 +145,7 @@ NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serv
|
||||
this->activeAddress = address;
|
||||
this->state = NvComputer::CS_ONLINE;
|
||||
this->pendingQuit = false;
|
||||
this->isSupportedServerVersion = CompatFetcher::isGfeVersionSupported(this->gfeVersion);
|
||||
}
|
||||
|
||||
bool NvComputer::wake()
|
||||
@@ -408,6 +411,7 @@ bool NvComputer::update(NvComputer& that)
|
||||
ASSIGN_IF_CHANGED(state);
|
||||
ASSIGN_IF_CHANGED(gfeVersion);
|
||||
ASSIGN_IF_CHANGED(appVersion);
|
||||
ASSIGN_IF_CHANGED(isSupportedServerVersion);
|
||||
ASSIGN_IF_CHANGED(maxLumaPixelsHEVC);
|
||||
ASSIGN_IF_CHANGED(gpuModel);
|
||||
ASSIGN_IF_CHANGED_AND_NONNULL(serverCert);
|
||||
|
||||
@@ -65,6 +65,7 @@ public:
|
||||
int maxLumaPixelsHEVC;
|
||||
int serverCodecModeSupport;
|
||||
QString gpuModel;
|
||||
bool isSupportedServerVersion;
|
||||
|
||||
// Persisted traits
|
||||
QString localAddress;
|
||||
|
||||
@@ -451,6 +451,11 @@ NvHTTP::openConnection(QUrl baseUrl,
|
||||
// Add our client certificate
|
||||
request.setSslConfiguration(IdentityManager::get()->getSslConfig());
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
// Disable HTTP/2 (GFE 3.22 doesn't like it) and Qt 6 enables it by default
|
||||
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);
|
||||
#endif
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) && QT_VERSION < QT_VERSION_CHECK(5, 15, 1) && !defined(QT_NO_BEARERMANAGEMENT)
|
||||
// HACK: Set network accessibility to work around QTBUG-80947 (introduced in Qt 5.14.0 and fixed in Qt 5.15.1)
|
||||
QT_WARNING_PUSH
|
||||
|
||||
@@ -36,6 +36,38 @@
|
||||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="3.1.3" date="2021-05-07">
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Fixed an issue that could cause excessive audio latency on some connections</li>
|
||||
<li>Updated community-contributed translations from Weblate</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.1.2" date="2021-05-03">
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Improved connection reliability and performance with GeForce Experience 3.22</li>
|
||||
<li>Added support for audio encryption with GeForce Experience 3.22</li>
|
||||
<li>Added compatibility update checks for future versions of GeForce Experience</li>
|
||||
<li>Fixed keyboard capture on X11</li>
|
||||
<li>Updated community-contributed translations from Weblate</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.1.1" date="2021-04-09">
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Added support for streaming from GeForce Experience 3.22</li>
|
||||
<li>Added support for AMF-encoded HEVC streams from servers like Sunshine and OpenStream</li>
|
||||
<li>Added new community-contributed translations from Weblate</li>
|
||||
<li>Fixed KMSDRM rendering with buffer modifiers on embedded devices</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.1.0" date="2021-03-14">
|
||||
<description>
|
||||
<p>New features:</p>
|
||||
|
||||
+8
-3
@@ -88,9 +88,14 @@ CenteredGridView {
|
||||
source: model.boxart
|
||||
|
||||
onSourceSizeChanged: {
|
||||
if ((sourceSize.width == 130 && sourceSize.height == 180) || // GFE 2.0 placeholder image
|
||||
(sourceSize.width == 628 && sourceSize.height == 888) || // GFE 3.0 placeholder image
|
||||
(sourceSize.width == 200 && sourceSize.height == 266)) // Our no_app_image.png
|
||||
// Nearly all of Nvidia's official box art does not match the dimensions of placeholder
|
||||
// images, however the one known exeception is Overcooked. Therefore, we only execute
|
||||
// the image size checks if this is not an app collector game. We know the officially
|
||||
// supported games all have box art, so this check is not required.
|
||||
if (!model.isAppCollectorGame &&
|
||||
((sourceSize.width == 130 && sourceSize.height == 180) || // GFE 2.0 placeholder image
|
||||
(sourceSize.width == 628 && sourceSize.height == 888) || // GFE 3.0 placeholder image
|
||||
(sourceSize.width == 200 && sourceSize.height == 266))) // Our no_app_image.png
|
||||
{
|
||||
isPlaceholder = true
|
||||
}
|
||||
|
||||
+6
-1
@@ -220,7 +220,12 @@ CenteredGridView {
|
||||
|
||||
onClicked: {
|
||||
if (model.online) {
|
||||
if (model.paired) {
|
||||
if (!model.serverSupported) {
|
||||
errorDialog.text = qsTr("The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.").arg(model.name)
|
||||
errorDialog.helpText = ""
|
||||
errorDialog.open()
|
||||
}
|
||||
else if (model.paired) {
|
||||
// go to game view
|
||||
var component = Qt.createComponent("AppView.qml")
|
||||
var appView = component.createObject(stackView, {"computerIndex": index, "objectName": model.name})
|
||||
|
||||
@@ -781,6 +781,19 @@ Flickable {
|
||||
text: "简体中文" //Simplified Chinese
|
||||
val: StreamingPreferences.LANG_ZH_CN
|
||||
}
|
||||
ListElement {
|
||||
text: "Norwegian Bokmål"
|
||||
val: StreamingPreferences.LANG_NB_NO
|
||||
}
|
||||
ListElement {
|
||||
text: "русский" // Russian
|
||||
val: StreamingPreferences.LANG_RU
|
||||
}
|
||||
// Don't list Spanish until it is more complete
|
||||
/*ListElement {
|
||||
text: "Español" // Spanish
|
||||
val: StreamingPreferences.LANG_ES
|
||||
}*/
|
||||
}
|
||||
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
||||
onActivated : {
|
||||
|
||||
@@ -91,6 +91,8 @@ QVariant AppModel::data(const QModelIndex &index, int role) const
|
||||
return app.id;
|
||||
case DirectLaunchRole:
|
||||
return app.directLaunch;
|
||||
case AppCollectorGameRole:
|
||||
return app.isAppCollectorGame;
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
@@ -106,6 +108,7 @@ QHash<int, QByteArray> AppModel::roleNames() const
|
||||
names[HiddenRole] = "hidden";
|
||||
names[AppIdRole] = "appid";
|
||||
names[DirectLaunchRole] = "directLaunch";
|
||||
names[AppCollectorGameRole] = "appCollectorGame";
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
+2
-1
@@ -17,7 +17,8 @@ class AppModel : public QAbstractListModel
|
||||
BoxArtRole,
|
||||
HiddenRole,
|
||||
AppIdRole,
|
||||
DirectLaunchRole
|
||||
DirectLaunchRole,
|
||||
AppCollectorGameRole,
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
@@ -42,6 +42,8 @@ QVariant ComputerModel::data(const QModelIndex& index, int role) const
|
||||
return !computer->macAddress.isEmpty();
|
||||
case StatusUnknownRole:
|
||||
return computer->state == NvComputer::CS_UNKNOWN;
|
||||
case ServerSupportedRole:
|
||||
return computer->isSupportedServerVersion;
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
@@ -68,6 +70,7 @@ QHash<int, QByteArray> ComputerModel::roleNames() const
|
||||
names[BusyRole] = "busy";
|
||||
names[WakeableRole] = "wakeable";
|
||||
names[StatusUnknownRole] = "statusUnknown";
|
||||
names[ServerSupportedRole] = "serverSupported";
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ class ComputerModel : public QAbstractListModel
|
||||
PairedRole,
|
||||
BusyRole,
|
||||
WakeableRole,
|
||||
StatusUnknownRole
|
||||
StatusUnknownRole,
|
||||
ServerSupportedRole
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
Binary file not shown.
+139
-129
@@ -4,49 +4,49 @@
|
||||
<context>
|
||||
<name>AppView</name>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="139"/>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="144"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Resume Game</source>
|
||||
<translation>App fortsetzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="165"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<location filename="../gui/AppView.qml" line="170"/>
|
||||
<location filename="../gui/AppView.qml" line="303"/>
|
||||
<source>Quit Game</source>
|
||||
<translation>App beenden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Launch Game</source>
|
||||
<translation>App starten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="306"/>
|
||||
<location filename="../gui/AppView.qml" line="311"/>
|
||||
<source>Direct Launch</source>
|
||||
<translation>Autostart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="310"/>
|
||||
<location filename="../gui/AppView.qml" line="315"/>
|
||||
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
|
||||
<translation>Starte diese App sofort nachdem dieser Host ausgewählt wurde und überspringe die Appauswahl.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="319"/>
|
||||
<location filename="../gui/AppView.qml" line="324"/>
|
||||
<source>Hide Game</source>
|
||||
<translation>App ausblenden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>Hide this game from the app grid. To access hidden games, right-click on the host and choose %1.</source>
|
||||
<translation>Blende diese App in der Appauswahl aus. Um ausgeblendete Apps wieder anzuzeigen, rechsklicke auf den Host und wähle %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>View All Apps</source>
|
||||
<translation>Zeige alle Apps</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="338"/>
|
||||
<location filename="../gui/AppView.qml" line="343"/>
|
||||
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
|
||||
<translation>Bist du sicher, dass du '%1' beenden willst? Nicht gespeicherte Fortschritte gehen dabei verloren.</translation>
|
||||
</message>
|
||||
@@ -113,7 +113,7 @@
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="70"/>
|
||||
<source>This PC's Internet connection is blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
|
||||
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das streamen übers Internet möglicherweise nicht funktionieren.</translation>
|
||||
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das Streamen übers Internet möglicherweise nicht funktionieren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="73"/>
|
||||
@@ -140,7 +140,7 @@
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="187"/>
|
||||
<source>Wake PC</source>
|
||||
<translation>Host aufwachen</translation>
|
||||
<translation>Host aufwecken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="193"/>
|
||||
@@ -158,52 +158,57 @@
|
||||
<translation>Host entfernen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="242"/>
|
||||
<location filename="../gui/PcView.qml" line="224"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="247"/>
|
||||
<source>You cannot pair while a previous session is still running on the host PC. Quit any running games or reboot the host PC, then try pairing again.</source>
|
||||
<translation>Solange eine vorherige Session auf dem Host läuft, kann du nicht Pairen. Beende alle laufenden Apps oder state den Host neu. Dann probiere das pairen nochmal.</translation>
|
||||
<translation>Solange eine vorherige Session auf dem Host läuft, kannst du nicht koppeln. Beende alle laufenden Apps oder starte den Host neu. Dann probiere das Koppeln erneut.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="297"/>
|
||||
<location filename="../gui/PcView.qml" line="302"/>
|
||||
<source>Please enter %1 on your GameStream PC. This dialog will close when pairing is completed.</source>
|
||||
<translation>Bitte gebe %1 auf deinem Host ein. Diese Nachricht wird nach dem Pairen automatisch geschlossen.</translation>
|
||||
<translation>Bitte gebe %1 auf deinem Host ein. Diese Nachricht wird nach dem Koppeln automatisch geschlossen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="308"/>
|
||||
<location filename="../gui/PcView.qml" line="313"/>
|
||||
<source>Are you sure you want to remove this PC?</source>
|
||||
<translation>Bist du sicher, dass du diesen Host entfernen möchtest?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>Moonlight is testing your network connection to determine if NVIDIA GameStream is blocked.</source>
|
||||
<translation>Moonlight testet nun dein Netzwerk umherauszufinden, ob NVIDIA GameStream blockiert ist.</translation>
|
||||
<translation>Moonlight testet nun dein Netzwerk um herauszufinden, ob NVIDIA GameStream blockiert ist.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>This may take a few seconds…</source>
|
||||
<translation>Dies dauert ein paar Sekunden...</translation>
|
||||
<translation>Dies dauert ein paar Sekunden…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>This network does not appear to be blocking Moonlight. If you still have trouble connecting, check your PC's firewall settings.</source>
|
||||
<translation>Dieses Netzwerk scheint Moonlight nicht zu blocken. Wenn du trotzdem Probleme beim verbinden hast, prüfe die Firewall deines Hosts.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>If you are trying to stream over the Internet, install the Moonlight Internet Hosting Tool on your gaming PC and run the included Internet Streaming Tester to check your gaming PC's Internet connection.</source>
|
||||
<translation>Wenn du veruchst übers Internet zu streamen, installiere das Moonlight Internet Hosting Tool auf deinem Host und starte das dort enthaltene Internet Streaming Tester Tool um deine Hos Internetverbindung zu prüfen.</translation>
|
||||
<translation>Wenn du versuchst übers Internet zu streamen, installiere das Moonlight Internet Hosting Tool auf deinem Host und starte das dort enthaltene Internet Streaming Tester Tool um deine Host Internetverbindung zu prüfen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>Your PC's current network connection seems to be blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
|
||||
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das streamen übers Internet möglicherweise nicht funktionieren.</translation>
|
||||
<translation>Die Internetverbindung dieses Hosts blockiert Moonlight. Solange eine Verbindung mit diesem Netzwerk besteht, wird das Streamen übers Internet möglicherweise nicht funktionieren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>The following network ports were blocked:</source>
|
||||
<translation>Die folgenden Netzwerkports sind gesperrt:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="332"/>
|
||||
<location filename="../gui/PcView.qml" line="337"/>
|
||||
<source>The network test could not be performed because none of Moonlight's connection testing servers were reachable from this PC. Check your Internet connection or try again later.</source>
|
||||
<translation>Der Netzwerktest von diesem Host konnte nicht ausgeführt werden, da keine Verbindung zu den Testservern von Moonlight aufgebaut werden konnte. Prüfe deine Internetverbindung oder versuche es später nocheinmal.</translation>
|
||||
</message>
|
||||
@@ -230,10 +235,10 @@
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="177"/>
|
||||
<source>View All Apps</source>
|
||||
<translation>Zeieg alle Apps</translation>
|
||||
<translation>Zeige alle Apps</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="352"/>
|
||||
<location filename="../gui/PcView.qml" line="357"/>
|
||||
<source>Enter the new name for this PC:</source>
|
||||
<translation>Gebe einen neuen Namen für diesen Host ein:</translation>
|
||||
</message>
|
||||
@@ -241,7 +246,7 @@
|
||||
<context>
|
||||
<name>PendingQuitTask</name>
|
||||
<message>
|
||||
<location filename="../backend/computermanager.cpp" line="538"/>
|
||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
||||
<source>The running game wasn't started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
|
||||
<translation>Die laufende App wurde von einem anderem PC gestartet. Beende die App auf dem Host manuell oder vom PC welcher die App gestartet hat.</translation>
|
||||
</message>
|
||||
@@ -258,7 +263,7 @@
|
||||
<location filename="../cli/quitstream.cpp" line="88"/>
|
||||
<location filename="../cli/startstream.cpp" line="89"/>
|
||||
<source>Computer %1 has not been paired. Please open Moonlight to pair before streaming.</source>
|
||||
<translation>PC %1 wurde noch nicht gepairt. Bitte öffne Moonlight zum pairen.</translation>
|
||||
<translation>Host %1 wurde noch nicht gekoppelt. Bitte öffne Moonlight zum koppeln.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cli/quitstream.cpp" line="102"/>
|
||||
@@ -304,7 +309,7 @@
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="100"/>
|
||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||
<translation>Auf deinem Host ist etwas schiefgelaufen beim starten vom Stream.</translation>
|
||||
<translation>Auf deinem Host ist etwas beim Starten vom Stream schiefgelaufen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="101"/>
|
||||
@@ -322,107 +327,112 @@
|
||||
<translation>Verbindung getrennt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="578"/>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="597"/>
|
||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||
<translation>Die Auswahl des Remote Desktop Maus Modus kann in Spielen zu Problemen führen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="583"/>
|
||||
<location filename="../streaming/session.cpp" line="602"/>
|
||||
<source>HDR is not supported with software decoding.</source>
|
||||
<translation>HDR wird nicht von Software decodierung unterstützt.</translation>
|
||||
<translation>HDR wird nicht von Software Dekodierung unterstützt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="587"/>
|
||||
<location filename="../streaming/session.cpp" line="606"/>
|
||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||
<translation>Software decodierung kann zu schlecher streaming Leitung führen.</translation>
|
||||
<translation>Software Dekodierung kann zu schlecher streaming Leitung führen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<location filename="../streaming/session.cpp" line="611"/>
|
||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||
<translation>Nicht unterstütze FPS Optionen kann stottern verursachen.</translation>
|
||||
<translation>Nicht unterstützte FPS Optionen können stottern verursachen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="595"/>
|
||||
<location filename="../streaming/session.cpp" line="614"/>
|
||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||
<translation>V-Sync wird deaktiviert wenn mit einer höheren FrameRate als der Display gestreamt wird.</translation>
|
||||
<translation>V-Sync wird deaktiviert wenn mit einer höheren Framerate als der des Display gestreamt wird.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="612"/>
|
||||
<location filename="../streaming/session.cpp" line="631"/>
|
||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||
<translation>Da deine Grafikkarte kein HEVC Decodierung unterstützt wird Software decoding benutzt. Die kann zu einer schlechten streaming Leistung führen.</translation>
|
||||
<translation>Da deine Grafikkarte kein HEVC Decodierung unterstützt wird Software Dekodierung benutzt. Die kann zu einer schlechten streaming Leistung führen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="615"/>
|
||||
<location filename="../streaming/session.cpp" line="634"/>
|
||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||
<translation>Die Grafikkarte deines PC's unterstützt keine HEVC Decodierung.</translation>
|
||||
<translation>Die Grafikkarte deines PC's unterstützt keine HEVC Dekodierung.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="622"/>
|
||||
<location filename="../streaming/session.cpp" line="641"/>
|
||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
||||
<translation>Die Grafikkarte deines Host's unterstützt kein HEVC. Es wird mindestens eine GeForce GTX 900-Series (Maxwell) oder neuer benötigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="639"/>
|
||||
<location filename="../streaming/session.cpp" line="658"/>
|
||||
<source>%1 doesn't support HDR10.</source>
|
||||
<translation>%1 unterstützt kein HDR10.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="643"/>
|
||||
<location filename="../streaming/session.cpp" line="662"/>
|
||||
<source>Your host PC GPU doesn't support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
|
||||
<translation>Die Grafikkarte deines Host's unterstützt kein HDR. Es wird mindestens eine GeForce GTX 1000-Series (Pascal) oder neuer benötigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="652"/>
|
||||
<location filename="../streaming/session.cpp" line="671"/>
|
||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||
<translation>Die Grafikkarte deines PC's unterstützt keine HEVC Main10 Decodierung für HDR streaming.</translation>
|
||||
<translation>Die Grafikkarte deines PC's unterstützt keine HEVC Main10 Dekodierung für HDR streaming.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="665"/>
|
||||
<location filename="../streaming/session.cpp" line="684"/>
|
||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||
<translation>Für 4K steaming wird mindestens GeForce Experience 3.0 benötigt.</translation>
|
||||
<translation>Für 4K Streaming wird mindestens GeForce Experience 3.0 benötigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="680"/>
|
||||
<location filename="../streaming/session.cpp" line="699"/>
|
||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||
<translation>Deine ausgewählte Surround Sound Einstellung wird nicht von dem momentanen Audiogerät untertützt.</translation>
|
||||
<translation>Deine ausgewählte Surround Sound Einstellung wird von dem momentanen Audiogerät nicht untertützt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="687"/>
|
||||
<location filename="../streaming/session.cpp" line="706"/>
|
||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||
<translation>Zugriff auf das Audiogerät fehlgeschlagen. Es wird kein Ton für diese Session Verfügbar sein.</translation>
|
||||
<translation>Zugriff auf das Audiogerät fehlgeschlagen. Es wird kein Ton für diese Session verfügbar sein.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="692"/>
|
||||
<location filename="../streaming/session.cpp" line="711"/>
|
||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||
<translation>Ein angeschlossener Controller hat keine Tastenbelegung und ist somit nicht nutzbar. Besuche die Moonlight help um dies zu lösen.</translation>
|
||||
<translation>Ein angeschlossener Controller hat keine Tastenbelegung und ist somit nicht nutzbar. Besuche die Moonlight Hilfe um dies zu lösen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="700"/>
|
||||
<location filename="../streaming/session.cpp" line="719"/>
|
||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||
<translation>Die Grafikkarte deines Host's unterstüzt keine Videoauflösung übr 4K zum Streamen.</translation>
|
||||
<translation>Die Grafikkarte deines Host's unterstüzt keine Videoauflösung über 4K zum Streamen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="704"/>
|
||||
<location filename="../streaming/session.cpp" line="723"/>
|
||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||
<translation>Videoauflösungen über 4K sind nur mit dem HEVC Codec Verfügbar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="718"/>
|
||||
<location filename="../streaming/session.cpp" line="737"/>
|
||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||
<translation>Erzwungene Hardware Decodierung kann nicht ausgewählt werden, da der PC keine Hardware Decodierung unterstützt.</translation>
|
||||
<translation>Erzwungene Hardware Dekodierung kann nicht ausgewählt werden, da der PC keine Hardware Decodierung unterstützt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="721"/>
|
||||
<location filename="../streaming/session.cpp" line="740"/>
|
||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
||||
<translation>Erzwungene Hardware Decodierung ist nicht mit deinem ausgewähltem Codec kompatibel, da die Grafikkarte deines PC's den ausgewählen Codec nicht unterstützt.</translation>
|
||||
<translation>Erzwungene Hardware Dekodierung ist nicht mit deinem ausgewähltem Codec kompatibel, da die Grafikkarte deines PC's den ausgewählen Codec nicht unterstützt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1022"/>
|
||||
<location filename="../streaming/session.cpp" line="1041"/>
|
||||
<source>GeForce Experience returned error: %1</source>
|
||||
<translation>GeForce Experience hat einen Fehler gemeldet: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1445"/>
|
||||
<location filename="../streaming/session.cpp" line="1519"/>
|
||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||
<translation>Video Decoder konnte nicht initialisiert werden. Bitte prüfe deine Streaming Einstellungen und versuche es erneut.</translation>
|
||||
</message>
|
||||
@@ -442,7 +452,7 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||
<translation>Zu hohe Werte für deinen PC oder deinem Netzwerk kann Lag oder Fehler verursachen.</translation>
|
||||
<translation>Zu hohe Werte für deinen PC oder dein Netzwerk können Lags oder Fehler verursachen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
||||
@@ -472,12 +482,12 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
||||
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
|
||||
<translation>Benutzerdefinierte Auflösungen sind offiziell nicht von GeForce Experience unterstützt, daher wird es deine Host Auflösung nicht setzen. Du musst es manuell setzen während des Streams.</translation>
|
||||
<translation>Benutzerdefinierte Auflösungen sind offiziell nicht von GeForce Experience unterstützt, daher wird es deine Host Auflösung nicht setzen. Du musst es manuell während des Streams setzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||
<translation>Auflösung die von deinem Host oder Client nicht unterstützt sind, können zu Fehlern beim streamen führen.</translation>
|
||||
<translation>Auflösung die nicht von deinem Host oder Client unterstützt sind, können zu Fehlern beim Streamen führen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
||||
@@ -504,7 +514,7 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||
<translation>Verringere die Bitrate für langsame Verbindungen. Erhöhe sie für eine bessere Videoqualität.</translation>
|
||||
<translation>Verringere die Bitrate bei einer langsamen Verbindung, Erhöhe sie für eine bessere Videoqualität.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||
@@ -524,7 +534,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
||||
<location filename="../gui/SettingsView.qml" line="847"/>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>Vollbild</translation>
|
||||
</message>
|
||||
@@ -549,7 +559,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
||||
<location filename="../gui/SettingsView.qml" line="839"/>
|
||||
<location filename="../gui/SettingsView.qml" line="852"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Fenster</translation>
|
||||
</message>
|
||||
@@ -596,12 +606,12 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
||||
<source>Mute host PC speakers while streaming</source>
|
||||
<translation>Schalte die Host Lautsprecher stumm während des streamens</translation>
|
||||
<translation>Schalte die Host Lautsprecher während des streamens stumm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||
<translation>Du musst die laufende App neustarten damit diese Einstellung aktiv wird</translation>
|
||||
<translation>Du musst die laufende App neustarten, damit diese Einstellung aktiv wird</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
||||
@@ -629,32 +639,32 @@
|
||||
<translation>Automatisch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="792"/>
|
||||
<location filename="../gui/SettingsView.qml" line="805"/>
|
||||
<source>You must restart Moonlight for this change to take effect</source>
|
||||
<translation>Du musst Moonlight neustarten damit diese Einstellung aktiv wird</translation>
|
||||
<translation>Du musst Moonlight neustarten, damit diese Einstellung aktiv wird</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="806"/>
|
||||
<location filename="../gui/SettingsView.qml" line="819"/>
|
||||
<source>GUI display mode</source>
|
||||
<translation>Anzeige Modus der Oberfläche</translation>
|
||||
<translation>Anzeigemodus der Oberfläche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="843"/>
|
||||
<location filename="../gui/SettingsView.qml" line="856"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maximiert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="900"/>
|
||||
<location filename="../gui/SettingsView.qml" line="913"/>
|
||||
<source>Input Settings</source>
|
||||
<translation>Eingabe Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="922"/>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<source>This enables seamless mouse control without capturing the client's mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
|
||||
<translation>Dies ermöglicht eine nahtlose Maussteuerung, ohne den Mauszeiger des PCs zu erfassen. Es ist ideal für die Remote-Desktop-Nutzung, funktioniert aber bei den meisten Spielen nicht.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<location filename="../gui/SettingsView.qml" line="936"/>
|
||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
||||
<translation>HINWEIS: Aufgrund eines Fehlers in GeForce Experience funktioniert diese Option möglicherweise nicht richtig, wenn Ihr Host mehrere Monitore hat.</translation>
|
||||
</message>
|
||||
@@ -667,77 +677,77 @@
|
||||
<translation type="vanished">Dies ermöglicht die Erfassung von systemweiten Tastenkombinationen wie Alt+Tab, die normalerweise vom Client beim Streamen im Vollbildmodus ausgeführt werden würden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
||||
<location filename="../gui/SettingsView.qml" line="955"/>
|
||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
||||
<translation>HINWEIS: Bestimmte Tastenkombinationen wie Strg+Alt+Entf unter Windows können von keiner Anwendung abgefangen werden, auch nicht von Moonlight.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1018"/>
|
||||
<source>Use touchscreen as a virtual trackpad</source>
|
||||
<translation>Touchscreen als virtuelles Trackpad verwenden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1023"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1035"/>
|
||||
<source>Swap left and right mouse buttons</source>
|
||||
<translation>Linke und rechte Maustaste vertauschen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1035"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||
<source>Reverse mouse scrolling direction</source>
|
||||
<translation>Scrollrichtung umkehren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1049"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1061"/>
|
||||
<source>Gamepad Settings</source>
|
||||
<translation>Controller Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1059"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1071"/>
|
||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||
<translation>Tausche A/B und X/Y Controller Tasten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1089"/>
|
||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||
<translation>Dies ändert das Controller Tastenlayout in ein Nintento Controller Style Layout</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1083"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1095"/>
|
||||
<source>Force gamepad #1 always connected</source>
|
||||
<translation>Erzwinge das Controller #1 immer verbunden ist</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1093"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1105"/>
|
||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||
<translation>Erzwingt, dass ein Controller immer mit dem Host verbunden bleibt, auch wenn keine Gamepads an diesen PC angeschlossen sind.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="923"/>
|
||||
<location filename="../gui/SettingsView.qml" line="935"/>
|
||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||
<translation>Du kannst dies während des streamens umstellen mit Strg+Alt+Shift+M.</translation>
|
||||
<translation>Du kannst dies während des Streamens umstellen mit Strg+Alt+Shift+M.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1101"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||
<translation>Aktivieren Sie die Maussteuerung mit Controllern, indem Sie die 'Start'-Taste gedrückt halten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1112"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1124"/>
|
||||
<source>Process gamepad input when Moonlight is in the background</source>
|
||||
<translation>Controller-Eingaben ausführen auch wenn Moonlight im Hintergrund ist</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1123"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1135"/>
|
||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||
<translation>Erlaubt es Moonlight Controller-Eingaben an den Stream zu schicken auch wenn es nicht das aktive Fenster ist</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1144"/>
|
||||
<source>Host Settings</source>
|
||||
<translation>Host Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1172"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1184"/>
|
||||
<source>Advanced Settings</source>
|
||||
<translation>Erweiterte Einstellungen</translation>
|
||||
</message>
|
||||
@@ -747,118 +757,118 @@
|
||||
<translation>Audio Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<location filename="../gui/SettingsView.qml" line="873"/>
|
||||
<source>Show connection quality warnings</source>
|
||||
<translation>Warnung bei Verbindungsproblemen anzeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="872"/>
|
||||
<location filename="../gui/SettingsView.qml" line="885"/>
|
||||
<source>Discord Rich Presence integration</source>
|
||||
<translation>Integration von Discord Rich Presence</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="882"/>
|
||||
<location filename="../gui/SettingsView.qml" line="895"/>
|
||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||
<translation>Aktualisiert deinen Discord Status um den Namen der aktuellen App anzuzeigen wenn du steamst.</translation>
|
||||
<translation>Aktualisiert deinen Discord Status um den Namen der aktuellen App anzuzeigen, wenn du streamst.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1094"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1106"/>
|
||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||
<translation>Aktiviere diese Option nur wenn du ein Spiel streamst, dass die Verbindung von Controllern nach dem Start nicht unterstützt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="911"/>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<source>Optimize mouse for remote desktop instead of games</source>
|
||||
<translation>Optimiere die Maus für Remote Desktop statt für Apps</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<location filename="../gui/SettingsView.qml" line="946"/>
|
||||
<source>Capture system keyboard shortcuts</source>
|
||||
<translation>Erfasse Systemtastatur Shortcuts</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
||||
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
|
||||
<translation>Dies aktiviert das Erfassen von Systemweiten Tastatur Shortcuts wie Alt+Tab, welche nomalerweise auf dem Client ausgeführt werden würden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||
<location filename="../gui/SettingsView.qml" line="984"/>
|
||||
<source>in fullscreen</source>
|
||||
<translation>im Vollbildmodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="976"/>
|
||||
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||
<source>always</source>
|
||||
<translation>immer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1016"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||
<translation>Wenn aktiviert, verhält sich der Touchscreen wie ein Trackpad. Wenn deaktiviert, steuert der Touchscreen direkt den Mauszeiger.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1142"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||
<source>Optimize game settings for streaming</source>
|
||||
<translation>Optimiere die Spieleinstellungen für das streamen</translation>
|
||||
<translation>Optimiere die Spieleinstellungen für das Streamen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1153"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1165"/>
|
||||
<source>Quit app on host PC after ending stream</source>
|
||||
<translation>Schließe die App auf dem Host nach dem beenden des Streams</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1163"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1175"/>
|
||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||
<translation>Dadurch wird die App, dass du streamst, geschlossen, wenn du deinen Stream beendest. Du verlierst dabei alle ungespeicherten Fortschritte!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1194"/>
|
||||
<source>Video decoder</source>
|
||||
<translation>Video Decoder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1207"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1253"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1219"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1265"/>
|
||||
<source>Automatic (Recommended)</source>
|
||||
<translation>Automatisch (empfohlen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1211"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1223"/>
|
||||
<source>Force software decoding</source>
|
||||
<translation>Erwzinge Software decoding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1215"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
||||
<source>Force hardware decoding</source>
|
||||
<translation>Erzwinge Hardware decoding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1240"/>
|
||||
<source>Video codec</source>
|
||||
<translation>Video Codec</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1257"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1269"/>
|
||||
<source>H.264</source>
|
||||
<translation>H.264</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1261"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
||||
<source>HEVC (H.265)</source>
|
||||
<translation>HEVC (H.265)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1278"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1290"/>
|
||||
<source>Unlock unsupported FPS options</source>
|
||||
<translation>Zeige nicht unterstützte FPS Optionen an</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1297"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1309"/>
|
||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||
<translation>Suche automatisch nach Hosts im lokalen Netzwerk (empfohlen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1322"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1334"/>
|
||||
<source>Automatically detect blocked connections (Recommended)</source>
|
||||
<translation>Erkenne automatisch geblockte Verbindungen (empfohlen)</translation>
|
||||
</message>
|
||||
@@ -909,7 +919,7 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
||||
<source>Ctrl+Alt+Shift+Q</source>
|
||||
<translation>Strg + Alt + Shift + Q</translation>
|
||||
<translation>Strg+Alt+Shift+Q</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -955,7 +965,7 @@
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="381"/>
|
||||
<source>Gamepad Mapping</source>
|
||||
<translation>Controller Tastenbelegen</translation>
|
||||
<translation>Controllertasten belegen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="415"/>
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+193
-183
@@ -4,51 +4,51 @@
|
||||
<context>
|
||||
<name>AppView</name>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="139"/>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="144"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Resume Game</source>
|
||||
<translation>Reprendre le jeu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="165"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<location filename="../gui/AppView.qml" line="170"/>
|
||||
<location filename="../gui/AppView.qml" line="303"/>
|
||||
<source>Quit Game</source>
|
||||
<translation>Quitter le jeu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Launch Game</source>
|
||||
<translation>Lancer le jeu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="306"/>
|
||||
<location filename="../gui/AppView.qml" line="311"/>
|
||||
<source>Direct Launch</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Lancement direct</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="310"/>
|
||||
<location filename="../gui/AppView.qml" line="315"/>
|
||||
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Lancer cette application immédiatement lorsque l'hôte est sélectionné, en ignorant la grille d'applications.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="319"/>
|
||||
<location filename="../gui/AppView.qml" line="324"/>
|
||||
<source>Hide Game</source>
|
||||
<translation>Cacher le jeu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>Hide this game from the app grid. To access hidden games, right-click on the host and choose %1.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Cacher ce jeu de la grille d'applications. Pour le retrouver plus tard, faites un clic droit sur l'ordinateur et choisissez %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>View All Apps</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Voir toutes les applis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="338"/>
|
||||
<location filename="../gui/AppView.qml" line="343"/>
|
||||
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
|
||||
<translation>Vous êtes sûr de vouloir arrêter %1? Tout progrès non enregistré sera perdu.</translation>
|
||||
<translation>Êtes-vous sûr de vouloir arrêter %1 ? Tout progrès non enregistré sera perdu.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -56,7 +56,7 @@
|
||||
<message>
|
||||
<location filename="../gui/CliQuitStreamSegue.qml" line="9"/>
|
||||
<source>Establishing connection to PC...</source>
|
||||
<translation>connexion au PC...</translation>
|
||||
<translation>Connexion au PC...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/CliQuitStreamSegue.qml" line="13"/>
|
||||
@@ -69,7 +69,7 @@
|
||||
<message>
|
||||
<location filename="../gui/CliStartStreamSegue.qml" line="9"/>
|
||||
<source>Establishing connection to PC...</source>
|
||||
<translation>connexion au PC...</translation>
|
||||
<translation>Connexion au PC...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/CliStartStreamSegue.qml" line="13"/>
|
||||
@@ -79,7 +79,7 @@
|
||||
<message>
|
||||
<location filename="../gui/CliStartStreamSegue.qml" line="81"/>
|
||||
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
|
||||
<translation>Vous êtes sûr de vouloir arrêter %1? Tout progrès non enregistré sera perdu.</translation>
|
||||
<translation>Êtes-vous sûr de vouloir arrêter %1 ? Tout progrès non enregistré sera perdu.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -87,7 +87,7 @@
|
||||
<message>
|
||||
<location filename="../gui/GamepadMapper.qml" line="4"/>
|
||||
<source>Gamepad Mapping</source>
|
||||
<translation>Configuration du controleur</translation>
|
||||
<translation>Configuration du contrôleur</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -158,52 +158,57 @@
|
||||
<translation>Supprimer le PC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="242"/>
|
||||
<location filename="../gui/PcView.qml" line="224"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation>Cette version de GeForce Experience sur %1 n'est pas supportée par cette version de Moonlight. Vous devez mettre à jour Moonlight pour streamer depuis %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="247"/>
|
||||
<source>You cannot pair while a previous session is still running on the host PC. Quit any running games or reboot the host PC, then try pairing again.</source>
|
||||
<translation>Vous ne pouvez pas effectuer de couplage alors qu'une session précédente est encore en cours sur le PC hôte. Fermez les jeux en cours ou redémarrez le PC hôte, puis essayez à nouveau d'effectuer l'appariement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="297"/>
|
||||
<location filename="../gui/PcView.qml" line="302"/>
|
||||
<source>Please enter %1 on your GameStream PC. This dialog will close when pairing is completed.</source>
|
||||
<translation>Veuillez saisir %1 sur votre PC GameStream. Cette boîte de dialogue se fermera lorsque l'appariement sera terminé.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="308"/>
|
||||
<location filename="../gui/PcView.qml" line="313"/>
|
||||
<source>Are you sure you want to remove this PC?</source>
|
||||
<translation>Êtes-vous sûr de vouloir supprimer ce PC ?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>Moonlight is testing your network connection to determine if NVIDIA GameStream is blocked.</source>
|
||||
<translation>Moonlight teste votre connexion réseau pour déterminer si NVIDIA GameStream est bloqué.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>This may take a few seconds…</source>
|
||||
<translation>Cela peut prendre quelques secondes...</translation>
|
||||
<translation>Ceci peut prendre quelques secondes…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>This network does not appear to be blocking Moonlight. If you still have trouble connecting, check your PC's firewall settings.</source>
|
||||
<translation>Ce réseau ne semble pas bloquer Moonlight. Si vous avez toujours des problèmes de connexion, vérifiez les paramètres du pare-feu de votre PC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>If you are trying to stream over the Internet, install the Moonlight Internet Hosting Tool on your gaming PC and run the included Internet Streaming Tester to check your gaming PC's Internet connection.</source>
|
||||
<translation>Si vous essayez d'utiliser la diffusion en continu sur Internet, installez l'outil d'hébergement Internet Moonlight sur votre PC de jeu et exécutez le testeur de diffusion en continu sur Internet inclus pour vérifier la connexion Internet de votre PC de jeu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>Your PC's current network connection seems to be blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
|
||||
<translation>La connexion réseau actuelle de votre PC semble bloquer le Moonlight. Il se peut que la diffusion en continu sur Internet ne fonctionne pas lorsque vous êtes connecté à ce réseau.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>The following network ports were blocked:</source>
|
||||
<translation>Les ports de réseau suivants ont été bloqués :</translation>
|
||||
<translation>Les ports réseau suivants ont été bloqués :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="332"/>
|
||||
<location filename="../gui/PcView.qml" line="337"/>
|
||||
<source>The network test could not be performed because none of Moonlight's connection testing servers were reachable from this PC. Check your Internet connection or try again later.</source>
|
||||
<translation>Le test de réseau n'a pas pu être effectué car aucun des serveurs de test de connexion de Moonlight n'était accessible depuis ce PC. Vérifiez votre connexion Internet ou réessayez plus tard.</translation>
|
||||
</message>
|
||||
@@ -215,25 +220,25 @@
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="171"/>
|
||||
<source>PC Status: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Statut du PC : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="171"/>
|
||||
<source>Online</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="171"/>
|
||||
<source>Offline</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="177"/>
|
||||
<source>View All Apps</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Voir toutes les applis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="352"/>
|
||||
<location filename="../gui/PcView.qml" line="357"/>
|
||||
<source>Enter the new name for this PC:</source>
|
||||
<translation>Saisissez le nouveau nom de ce PC :</translation>
|
||||
</message>
|
||||
@@ -241,7 +246,7 @@
|
||||
<context>
|
||||
<name>PendingQuitTask</name>
|
||||
<message>
|
||||
<location filename="../backend/computermanager.cpp" line="538"/>
|
||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
||||
<source>The running game wasn't started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
|
||||
<translation>Le jeu en cours d’exécution n'a pas été démarré par ce PC. Vous devez fermer le jeu sur le PC hôte manuellement ou utiliser l'appareil qui a démarré le jeu à l'origine.</translation>
|
||||
</message>
|
||||
@@ -258,7 +263,7 @@
|
||||
<location filename="../cli/quitstream.cpp" line="88"/>
|
||||
<location filename="../cli/startstream.cpp" line="89"/>
|
||||
<source>Computer %1 has not been paired. Please open Moonlight to pair before streaming.</source>
|
||||
<translation>Le %1 de l'ordinateur n'a pas été jumelé. Veuillez ouvrir Moonlight pour jumeler avant le streaming.</translation>
|
||||
<translation>L''ordinateur %1 n'a pas été jumelé. Veuillez ouvrir Moonlight pour jumeler avant le streaming.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../cli/quitstream.cpp" line="102"/>
|
||||
@@ -277,7 +282,7 @@
|
||||
<message>
|
||||
<location filename="../gui/QuitSegue.qml" line="12"/>
|
||||
<source>Quitting %1...</source>
|
||||
<translation>Fermeture %1...</translation>
|
||||
<translation>Fermeture de %1...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -289,32 +294,32 @@
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="89"/>
|
||||
<source>No video received from host.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Aucune vidéo reçue de l'hôte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="90"/>
|
||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vérifiez votre pare-feu ainsi que les règles de redirection pour le(s) port(s) suivant(s) : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="95"/>
|
||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||
<translation>Votre connexion réseau ne fonctionne pas bien. Réduisez votre débit vidéo ou essayez une connexion plus rapide.</translation>
|
||||
<translation>Votre connexion réseau ne fonctionne pas très bien. Réduisez votre débit vidéo ou essayez une connexion plus rapide.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="100"/>
|
||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Quelque chose s'est mal passé sur votre PC hôte lors du lancement du streaming.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="101"/>
|
||||
<source>Make sure you don't have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vérifiez que vous n'avez pas de contenu protégé par DRM ouvert sur votre PC hôte. Vous pouvez également essayer de redémarrer le PC hôte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="102"/>
|
||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Si le problème persiste, essayez de réinstaller vos pilotes GPU et GeForce Experience.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="107"/>
|
||||
@@ -322,109 +327,114 @@
|
||||
<translation>Connexion terminée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="578"/>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation>La version de GeForce Experience sur %1 n'est pas supportée par cette version de Moonlight. Vous devez mettre à jour Moonlight pour streamer depuis %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="597"/>
|
||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||
<translation>Votre sélection pour activer le mode de souris de bureau à distance peut causer des problèmes dans les jeux.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="583"/>
|
||||
<location filename="../streaming/session.cpp" line="602"/>
|
||||
<source>HDR is not supported with software decoding.</source>
|
||||
<translation>Le HDR n'est pas pris en charge par le décodage logiciel.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="587"/>
|
||||
<location filename="../streaming/session.cpp" line="606"/>
|
||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||
<translation>La sélection de vos paramètres pour forcer le décodage du logiciel peut entraîner de mauvaises performances de streaming.</translation>
|
||||
<translation>La sélection de vos paramètres pour forcer le décodage logiciel peut entraîner de mauvaises performances de streaming.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<location filename="../streaming/session.cpp" line="611"/>
|
||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||
<translation>L'utilisation d'options de FPS non prises en charge peut entraîner un stuttering ou des lag.</translation>
|
||||
<translation>L'utilisation d'options FPS non prises en charge peut entraîner des saccades ou des lags.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="595"/>
|
||||
<location filename="../streaming/session.cpp" line="614"/>
|
||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||
<translation>La synchronisation vertical sera désactivée lors de la diffusion en continu à une fréquence d'images supérieure à celle de l'affichage.</translation>
|
||||
<translation>La synchronisation verticale (V-sync) sera désactivée lors de la diffusion en continu à une fréquence d'images supérieure à celle de l'affichage.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="612"/>
|
||||
<location filename="../streaming/session.cpp" line="631"/>
|
||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||
<translation>Utilisation du décodage logiciel dû à votre sélection pour forcer les HEVC sans support GPU. Cela peut entraîner de mauvaises performances de streaming.</translation>
|
||||
<translation>Utilisation du décodage logiciel dû à votre sélection pour forcer le codec HEVC sans support GPU. Ceci peut entraîner de mauvaises performances de streaming.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="615"/>
|
||||
<location filename="../streaming/session.cpp" line="634"/>
|
||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="622"/>
|
||||
<location filename="../streaming/session.cpp" line="641"/>
|
||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
||||
<translation>Le GPU de votre PC hôte ne prend pas en charge les HEVC. Un GPU GeForce GTX série 900 (Maxwell) ou plus récent est nécessaire pour le streaming HEVC.</translation>
|
||||
<translation>Le GPU de votre PC hôte ne prend pas en charge le codec HEVC. Un GPU GeForce GTX série 900 (Maxwell) ou plus récent est nécessaire pour le streaming HEVC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="639"/>
|
||||
<location filename="../streaming/session.cpp" line="658"/>
|
||||
<source>%1 doesn't support HDR10.</source>
|
||||
<translation>%1 ne prend pas en charge le HDR10.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="643"/>
|
||||
<location filename="../streaming/session.cpp" line="662"/>
|
||||
<source>Your host PC GPU doesn't support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
|
||||
<translation>Le GPU de votre PC hôte ne prend pas en charge le streaming HDR. Un GPU GeForce GTX série 1000 (Pascal) ou plus récent est nécessaire pour la diffusion HDR.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="652"/>
|
||||
<location filename="../streaming/session.cpp" line="671"/>
|
||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC pour le streaming HDR.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="665"/>
|
||||
<location filename="../streaming/session.cpp" line="684"/>
|
||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||
<translation>Une expérience GeForce 3.0 ou supérieure est requise pour le streaming 4K.</translation>
|
||||
<translation>GeForce Experience 3.0 ou supérieur est requis pour le streaming 4K.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="680"/>
|
||||
<location filename="../streaming/session.cpp" line="699"/>
|
||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||
<translation>Le réglage du son surround que vous avez sélectionné n'est pas pris en charge par l'appareil audio actuel.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="687"/>
|
||||
<location filename="../streaming/session.cpp" line="706"/>
|
||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||
<translation>Echec de l'ouverture de l'appareil audio. L'audio ne sera pas disponible pendant cette session.</translation>
|
||||
<translation>Échec de l'ouverture de l'appareil audio. L'audio ne sera pas disponible pendant cette session.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="692"/>
|
||||
<location filename="../streaming/session.cpp" line="711"/>
|
||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||
<translation>Une manette de jeun n'a pas était configurée et ne sera pas utilisable. Visitez le Moonlight pour aider à résoudre ce problème.</translation>
|
||||
<translation>Une manette de jeu attachée n'a pas été configurée et ne sera pas utilisable. Visitez l'aide Moonlight pour résoudre ce problème.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="700"/>
|
||||
<location filename="../streaming/session.cpp" line="719"/>
|
||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||
<translation>Le GPU de votre PC hôte ne prend pas en charge les résolutions vidéo en continu supérieures à 4K.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="704"/>
|
||||
<location filename="../streaming/session.cpp" line="723"/>
|
||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||
<translation>Les résolutions vidéo supérieures à 4K sont uniquement prises en charge par le codec HEVC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="718"/>
|
||||
<location filename="../streaming/session.cpp" line="737"/>
|
||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||
<translation>Votre choix pour forcer le décodage matériel ne peut être satisfait en raison de l'absence de support de décodage matériel sur le GPU de ce PC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="721"/>
|
||||
<location filename="../streaming/session.cpp" line="740"/>
|
||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
||||
<translation>Votre sélection de codecs et le réglage du décodage matériel ne sont pas compatibles. Le GPU de ce PC ne prend pas en charge le décodage du codec que vous avez choisi.</translation>
|
||||
<translation>Votre sélection de codecs et le réglage du décodage matériel ne sont pas compatibles. Le GPU de ce PC ne prend pas en charge le décodage du codec que vous avez choisi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1022"/>
|
||||
<location filename="../streaming/session.cpp" line="1041"/>
|
||||
<source>GeForce Experience returned error: %1</source>
|
||||
<translation>GeForce Experience a renvoyé l'erreur : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1445"/>
|
||||
<location filename="../streaming/session.cpp" line="1519"/>
|
||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||
<translation>Impossible d'initialiser le décodeur vidéo. Veuillez vérifier vos paramètres de diffusion en continu et réessayer.</translation>
|
||||
<translation>Impossible d'initialiser le décodeur vidéo. Veuillez vérifier vos paramètres de diffusion en continu et réessayez.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -442,7 +452,7 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||
<translation>Le fait de fixer des valeurs trop élevées pour votre PC ou votre connexion réseau peut entraîner un décalage, des bégaiements ou des erreurs.</translation>
|
||||
<translation>Fixer des valeurs trop élevées pour votre PC ou votre connexion réseau, peut entraîner un décalage, des saccades ou des erreurs.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
||||
@@ -472,17 +482,17 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
||||
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Les résolutions personnalisées ne sont pas officiellement prises en charge par GeForce Experience, qui ne pourra donc pas définir la résolution de votre écran hôte. Vous devrez la définir manuellement dans le jeu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Les résolutions qui ne sont pas prises en charge par votre client ou votre PC hôte peuvent entraîner des problèmes de diffusion.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
||||
<source>Enter a custom resolution:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Entrez une résolution personnalisée :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||
@@ -514,7 +524,7 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||
<source>Video bitrate: %1 Mbps</source>
|
||||
<translation>Bitrate vidéo : %1 Mbps</translation>
|
||||
<translation>Bitrate vidéo : %1 Mbps</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
||||
@@ -528,14 +538,14 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
||||
<location filename="../gui/SettingsView.qml" line="847"/>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
||||
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Le plein écran offre généralement les meilleures performances, mais le mode fenêtre sans bordure peut mieux fonctionner avec des fonctionnalités comme les espaces sur macOS, Alt+Tab, les outils de capture d'écran, les overlays, etc.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Full-screen</source>
|
||||
@@ -544,11 +554,11 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
||||
<source>Borderless windowed</source>
|
||||
<translation>fenêtré sans bordure</translation>
|
||||
<translation>Fenêtré sans bordure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
||||
<location filename="../gui/SettingsView.qml" line="839"/>
|
||||
<location filename="../gui/SettingsView.qml" line="852"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Fenêtré</translation>
|
||||
</message>
|
||||
@@ -584,37 +594,37 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
||||
<source>Stereo</source>
|
||||
<translation>Stereo</translation>
|
||||
<translation>Stéréo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
||||
<source>5.1 surround sound</source>
|
||||
<translation>5.1 son surround</translation>
|
||||
<translation>Son surround 5.1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
||||
<source>7.1 surround sound</source>
|
||||
<translation>7.1 son surround</translation>
|
||||
<translation>Son surround 7.1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
||||
<source>Mute host PC speakers while streaming</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Couper le son des haut-parleurs du PC hôte pendant la diffusion</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vous devez redémarrer tout jeu en cours pour que ce paramètre prenne effet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Couper le son du stream quand Moonlight n'est pas au premier plan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Coupe le son du stream quand vous faites Alt+Tab ou si vous cliquez sur une autre fenêtre.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
||||
@@ -624,139 +634,139 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
||||
<source>Language</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Langue</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Automatique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="792"/>
|
||||
<location filename="../gui/SettingsView.qml" line="805"/>
|
||||
<source>You must restart Moonlight for this change to take effect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vous devez redémarrer Moonlight pour que ce changement prenne effet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="806"/>
|
||||
<location filename="../gui/SettingsView.qml" line="819"/>
|
||||
<source>GUI display mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Mode d'affichage de l'interface graphique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="843"/>
|
||||
<location filename="../gui/SettingsView.qml" line="856"/>
|
||||
<source>Maximized</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Maximisé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="900"/>
|
||||
<location filename="../gui/SettingsView.qml" line="913"/>
|
||||
<source>Input Settings</source>
|
||||
<translation>Paramètres d'entrée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="922"/>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<source>This enables seamless mouse control without capturing the client's mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Cela permet un contrôle transparent de la souris, sans capturer le curseur du client. C'est idéal pour l’utilisation du bureau à distance, mais ne fonctionnera pas dans la plupart des jeux.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<location filename="../gui/SettingsView.qml" line="936"/>
|
||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>REMARQUE : En raison d'un bogue dans GeForce Experience, cette option peut ne pas fonctionner correctement si votre PC hôte a plusieurs moniteurs.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
||||
<location filename="../gui/SettingsView.qml" line="955"/>
|
||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>REMARQUE : Certains raccourcis clavier comme Ctrl+Alt+Suppr sur Windows ne peuvent jamais être interceptés, y compris par Moonlight.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||
<location filename="../gui/SettingsView.qml" line="984"/>
|
||||
<source>in fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>en plein écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="976"/>
|
||||
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||
<source>always</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>toujours</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1018"/>
|
||||
<source>Use touchscreen as a virtual trackpad</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1023"/>
|
||||
<source>Swap left and right mouse buttons</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Utiliser l'écran tactile comme un trackpad virtuel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1035"/>
|
||||
<source>Swap left and right mouse buttons</source>
|
||||
<translation>Permuter les boutons gauche et droit de la souris</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||
<source>Reverse mouse scrolling direction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Inverser le sens de défilement de la souris</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1049"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1061"/>
|
||||
<source>Gamepad Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Paramètres de la manette</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1059"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1071"/>
|
||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Inverser les boutons A/B et X/Y de la manette</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1089"/>
|
||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Permet d'utiliser les boutons comme sur une manette Nintendo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1083"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1095"/>
|
||||
<source>Force gamepad #1 always connected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Forcer la manette #1 à être toujours connectée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1093"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1105"/>
|
||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||
<translation>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</translation>
|
||||
<translation>Force une seule manette de jeu à toujours rester connectée à l'hôte, même si aucune manette de jeu n'est réellement connectée à ce PC.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This enables mouse control without capturing the client's mouse cursor. It will not work in most games.</source>
|
||||
<translation type="vanished">Cela permet de contrôler la souris sans avoir à capturer le curseur du client. Cela ne fonctionne pas dans la plupart des jeux.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="923"/>
|
||||
<location filename="../gui/SettingsView.qml" line="935"/>
|
||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||
<translation>Vous pouvez le basculer pendant la diffusion en utilisant Ctrl+Alt+Shift+M.</translation>
|
||||
<translation>Vous pouvez basculer ceci pendant la diffusion en utilisant Ctrl+Alt+Maj+M.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<location filename="../gui/SettingsView.qml" line="946"/>
|
||||
<source>Capture system keyboard shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Capturer les raccourcis clavier système</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
||||
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ceci permet la capture de raccourcis clavier système comme Alt+Tab, qui seraient normalement utilisés par le système d’exploitation client.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1101"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Active le contrôle de la souris par la manette en maintenant le bouton « Start »</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1112"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1124"/>
|
||||
<source>Process gamepad input when Moonlight is in the background</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Capturer la manette même lorsque Moonlight est en arrière-plan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1123"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1135"/>
|
||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Permet à Moonlight de capturer la manette même si Moonlight n'est pas au premier plan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1144"/>
|
||||
<source>Host Settings</source>
|
||||
<translation>Paramètres de l'hôte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1172"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1184"/>
|
||||
<source>Advanced Settings</source>
|
||||
<translation>Paramètres avancés</translation>
|
||||
</message>
|
||||
@@ -770,17 +780,17 @@
|
||||
<translation type="vanished">Maximiser la fenêtre Moonlight au démarrage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<location filename="../gui/SettingsView.qml" line="873"/>
|
||||
<source>Show connection quality warnings</source>
|
||||
<translation>Afficher les avertissements sur la qualité de la connexion</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="872"/>
|
||||
<location filename="../gui/SettingsView.qml" line="885"/>
|
||||
<source>Discord Rich Presence integration</source>
|
||||
<translation>Intégration de la présence Discord Rich</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="882"/>
|
||||
<location filename="../gui/SettingsView.qml" line="895"/>
|
||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||
<translation>Met à jour votre statut Discord pour afficher le nom du jeu que vous diffusez en continu.</translation>
|
||||
</message>
|
||||
@@ -789,12 +799,12 @@
|
||||
<translation type="vanished">Forcé la manette de jeu Force #1 à être toujours présente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1094"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1106"/>
|
||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||
<translation>N'activez cette option que lorsque vous diffusez en continu un jeu qui ne prend pas en charge la connexion des manettes de jeu après le démarrage.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="911"/>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<source>Optimize mouse for remote desktop instead of games</source>
|
||||
<translation>Optimiser la souris pour le bureau à distance plutôt que pour les jeux</translation>
|
||||
</message>
|
||||
@@ -803,9 +813,9 @@
|
||||
<translation type="vanished">Utiliser l'écran tactile comme trackpad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1016"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||
<translation>Lorsqu'on le vérifie, l'écran tactile agit comme un pavé tactile. Lorsqu'il n'est pas coché, l'écran tactile contrôle directement le pointeur de la souris.</translation>
|
||||
<translation>Lorsqu'il est coché, l'écran tactile agit comme un pavé tactile. Lorsqu'il n'est pas coché, l'écran tactile contrôle directement le pointeur de la souris.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Gamepad mouse mode support</source>
|
||||
@@ -824,7 +834,7 @@
|
||||
<translation type="vanished">Lorsque la case est cochée, permuter les boutons gauche et droit de la souris</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1142"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||
<source>Optimize game settings for streaming</source>
|
||||
<translation>Optimiser les paramètres du jeu pour la diffusion en continu</translation>
|
||||
</message>
|
||||
@@ -833,63 +843,63 @@
|
||||
<translation type="vanished">Lecture audio sur le PC hôte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1153"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1165"/>
|
||||
<source>Quit app on host PC after ending stream</source>
|
||||
<translation>Quitter l'application sur le PC hôte après avoir terminé le flux</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1163"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1175"/>
|
||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||
<translation>Cela fermera l'application ou le jeu que vous êtes en train de diffuser lorsque vous aurez terminé votre flux. Vous perdrez tout progrès non sauvegardé !</translation>
|
||||
<translation>Ceci fermera l'application ou le jeu que vous êtes en train de diffuser lorsque vous aurez terminé votre flux. Vous perdrez tout progrès non sauvegardé !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1194"/>
|
||||
<source>Video decoder</source>
|
||||
<translation>Décodeur vidéo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1207"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1253"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1219"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1265"/>
|
||||
<source>Automatic (Recommended)</source>
|
||||
<translation>Automatique (recommandé)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1211"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1223"/>
|
||||
<source>Force software decoding</source>
|
||||
<translation>Forcer le décodage des logiciels</translation>
|
||||
<translation>Forcer le décodage logiciel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1215"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
||||
<source>Force hardware decoding</source>
|
||||
<translation>Forcer le décodage du matériel</translation>
|
||||
<translation>Forcer le décodage matériel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1240"/>
|
||||
<source>Video codec</source>
|
||||
<translation>Codec vidéo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1257"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1269"/>
|
||||
<source>H.264</source>
|
||||
<translation>H.264</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1261"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
||||
<source>HEVC (H.265)</source>
|
||||
<translation>HEVC (H.265)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1278"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1290"/>
|
||||
<source>Unlock unsupported FPS options</source>
|
||||
<translation>Débloquer les options non supportées du FPS</translation>
|
||||
<translation>Débloquer les options FPS non supportées</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1297"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1309"/>
|
||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||
<translation>Trouver automatiquement les PC sur le réseau local (recommandé)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1322"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1334"/>
|
||||
<source>Automatically detect blocked connections (Recommended)</source>
|
||||
<translation>Détecter automatiquement les connexions bloquées (recommandé)</translation>
|
||||
</message>
|
||||
@@ -899,7 +909,7 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="11"/>
|
||||
<source>Resuming %1...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Reprise de %1...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="12"/>
|
||||
@@ -910,22 +920,22 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="25"/>
|
||||
<source>Starting %1 failed: Error %2</source>
|
||||
<translation>Démarrage de %1... echec: erreur %2</translation>
|
||||
<translation>Le démarrage de %1 a échoué : Erreur %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="28"/>
|
||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vérifiez votre pare-feu ainsi que les règles de redirection pour le(s) port(s) suivant(s) : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="74"/>
|
||||
<source>This PC's Internet connection is blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
|
||||
<translation>La connexion Internet de ce PC bloque Moonlight. Le streaming sur Internet peut ne pas fonctionner lorsqu'il est connecté à ce réseau.</translation>
|
||||
<translation>La connexion Internet de ce PC bloque Moonlight. Le streaming à travers Internet peut ne pas fonctionner lorsqu'il est connecté à ce réseau.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
||||
<source>Tip:</source>
|
||||
<translation>Aide:</translation>
|
||||
<translation>Astuce :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
||||
@@ -935,12 +945,12 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
||||
<source>Start+Select+L1+R1</source>
|
||||
<translation>Start+Select+L1+R1</translation>
|
||||
<translation>Start + Select + L1 + R1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
||||
<source>Ctrl+Alt+Shift+Q</source>
|
||||
<translation>Ctrl + Alt + Shift + Q</translation>
|
||||
<translation>Ctrl + Alt + Maj + Q</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -981,17 +991,17 @@
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="377"/>
|
||||
<source>Gamepad Mapper</source>
|
||||
<translation>configuration du controleur</translation>
|
||||
<translation>Configuration du contrôleur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="381"/>
|
||||
<source>Gamepad Mapping</source>
|
||||
<translation>configuration du controleur</translation>
|
||||
<translation>Configuration du contrôleur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="415"/>
|
||||
<source>No functioning hardware accelerated H.264 video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||
<translation>Aucun décodeur vidéo H.264 accéléré par le matériel n'a été détecté par Moonlight. Dans cette configuration, les performances de votre streaming peuvent être fortement dégradées.</translation>
|
||||
<translation>Aucun décodeur vidéo H.264 accéléré par le matériel n'a été détecté par Moonlight. Dans cette configuration, les performances de streaming peuvent être fortement dégradées.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="423"/>
|
||||
@@ -1001,12 +1011,12 @@
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="432"/>
|
||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Cette version de Moonlight n'est pas optimisée pour votre PC. Téléchargez la version « %1 » pour de meilleures performances.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="441"/>
|
||||
<source>Moonlight detected gamepads without a mapping:</source>
|
||||
<translation>Moonlight a détecté des manettes de jeu san configuration:</translation>
|
||||
<translation>Moonlight a détecté des manettes sans configuration :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="354"/>
|
||||
@@ -1035,7 +1045,7 @@
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="451"/>
|
||||
<source>Are you sure you want to quit?</source>
|
||||
<translation>Vous êtes sûr de vouloir quitter?</translation>
|
||||
<translation>Êtes-vous sûr de vouloir quitter ?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/main.qml" line="481"/>
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+119
-109
@@ -4,49 +4,49 @@
|
||||
<context>
|
||||
<name>AppView</name>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="139"/>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="144"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Resume Game</source>
|
||||
<translation>继续游戏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="165"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<location filename="../gui/AppView.qml" line="170"/>
|
||||
<location filename="../gui/AppView.qml" line="303"/>
|
||||
<source>Quit Game</source>
|
||||
<translation>退出游戏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="293"/>
|
||||
<location filename="../gui/AppView.qml" line="298"/>
|
||||
<source>Launch Game</source>
|
||||
<translation>启动游戏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="306"/>
|
||||
<location filename="../gui/AppView.qml" line="311"/>
|
||||
<source>Direct Launch</source>
|
||||
<translation>直接启动</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="310"/>
|
||||
<location filename="../gui/AppView.qml" line="315"/>
|
||||
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
|
||||
<translation>选择目标计算机后立即启动此应用程序,绕过应用程序选择网格。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="319"/>
|
||||
<location filename="../gui/AppView.qml" line="324"/>
|
||||
<source>Hide Game</source>
|
||||
<translation>隐藏游戏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>Hide this game from the app grid. To access hidden games, right-click on the host and choose %1.</source>
|
||||
<translation>从应用程序网格中隐藏此游戏。要访问隐藏的游戏,请右键单击目标计算机并选择 %1。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="323"/>
|
||||
<location filename="../gui/AppView.qml" line="328"/>
|
||||
<source>View All Apps</source>
|
||||
<translation>查看所有应用程序</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/AppView.qml" line="338"/>
|
||||
<location filename="../gui/AppView.qml" line="343"/>
|
||||
<source>Are you sure you want to quit %1? Any unsaved progress will be lost.</source>
|
||||
<translation>你确定要退出 %1 吗?所有未保存的游戏进度都将丢失。</translation>
|
||||
</message>
|
||||
@@ -171,57 +171,62 @@
|
||||
<translation>删除计算机</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="242"/>
|
||||
<location filename="../gui/PcView.qml" line="224"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="247"/>
|
||||
<source>You cannot pair while a previous session is still running on the host PC. Quit any running games or reboot the host PC, then try pairing again.</source>
|
||||
<translation>当上一个会话仍在运行时,无法进行配对。请退出所有正在运行的游戏或重新启动目标计算机,然后重试配对。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="297"/>
|
||||
<location filename="../gui/PcView.qml" line="302"/>
|
||||
<source>Please enter %1 on your GameStream PC. This dialog will close when pairing is completed.</source>
|
||||
<translation>请在启用 GameStream 的计算机上输入 %1。配对完成后,此对话框将关闭。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="308"/>
|
||||
<location filename="../gui/PcView.qml" line="313"/>
|
||||
<source>Are you sure you want to remove this PC?</source>
|
||||
<translation>确定要移除这个计算机吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>Moonlight is testing your network connection to determine if NVIDIA GameStream is blocked.</source>
|
||||
<translation>Moonlight 正在测试你的网络连接,以检测 NVIDIA GameStream 是否被阻止。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="325"/>
|
||||
<location filename="../gui/PcView.qml" line="330"/>
|
||||
<source>This may take a few seconds…</source>
|
||||
<translation>这可能需要几秒钟...</translation>
|
||||
<translation>这可能需要几秒钟……</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="332"/>
|
||||
<location filename="../gui/PcView.qml" line="337"/>
|
||||
<source>The network test could not be performed because none of Moonlight's connection testing servers were reachable from this PC. Check your Internet connection or try again later.</source>
|
||||
<translation>无法执行网络测试,因为此计算机无法访问 Moonlight 的连接测试服务器。请检查你的互联网连接或稍后再试。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>This network does not appear to be blocking Moonlight. If you still have trouble connecting, check your PC's firewall settings.</source>
|
||||
<translation>此网络似乎没有阻止 Moonlight。如果仍然无法连接,请检查计算机的防火墙设置。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="336"/>
|
||||
<location filename="../gui/PcView.qml" line="341"/>
|
||||
<source>If you are trying to stream over the Internet, install the Moonlight Internet Hosting Tool on your gaming PC and run the included Internet Streaming Tester to check your gaming PC's Internet connection.</source>
|
||||
<translation>如果你想通过互联网进行流式传输,请在你的目标计算机上安装 Moonlight Internet Hosting 工具,并运行包含的互联网流式传输测试程序来检查你目标计算机的互联网连接。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>Your PC's current network connection seems to be blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
|
||||
<translation>此计算机当前的网络连接似乎被阻塞了。当连接到此网络时,互联网上的流式传输可能无法工作。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="340"/>
|
||||
<location filename="../gui/PcView.qml" line="345"/>
|
||||
<source>The following network ports were blocked:</source>
|
||||
<translation>下列网络端口被阻止:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/PcView.qml" line="352"/>
|
||||
<location filename="../gui/PcView.qml" line="357"/>
|
||||
<source>Enter the new name for this PC:</source>
|
||||
<translation>输入这台计算机的新名称:</translation>
|
||||
</message>
|
||||
@@ -229,7 +234,7 @@
|
||||
<context>
|
||||
<name>PendingQuitTask</name>
|
||||
<message>
|
||||
<location filename="../backend/computermanager.cpp" line="538"/>
|
||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
||||
<source>The running game wasn't started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
|
||||
<translation>正在运行的游戏不是由这台计算机启动的。你必须在目标计算机上手动退出游戏或使用最初启动游戏的设备。</translation>
|
||||
</message>
|
||||
@@ -306,107 +311,112 @@
|
||||
<translation>会话已终止</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="578"/>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="597"/>
|
||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||
<translation>启用远程桌面鼠标模式可能会导致游戏出现问题。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="583"/>
|
||||
<location filename="../streaming/session.cpp" line="602"/>
|
||||
<source>HDR is not supported with software decoding.</source>
|
||||
<translation>软件解码不支持 HDR。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="587"/>
|
||||
<location filename="../streaming/session.cpp" line="606"/>
|
||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||
<translation>你选择的用于强制软件解码的设置可能会导致流式传输性能不佳。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="592"/>
|
||||
<location filename="../streaming/session.cpp" line="611"/>
|
||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||
<translation>使用不受支持的 FPS 选项可能会导致卡顿或延迟。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="595"/>
|
||||
<location filename="../streaming/session.cpp" line="614"/>
|
||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||
<translation>当流式传输的帧率高于显示时,垂直同步将被禁用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="612"/>
|
||||
<location filename="../streaming/session.cpp" line="631"/>
|
||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||
<translation>根据你的选择使用软件解码,以在没有显卡支持的情况下强制 HEVC。这可能会导致流式传输性能不佳。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="615"/>
|
||||
<location filename="../streaming/session.cpp" line="634"/>
|
||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||
<translation>此计算机的显卡不支持 HEVC 解码。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="622"/>
|
||||
<location filename="../streaming/session.cpp" line="641"/>
|
||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
||||
<translation>目标计算机的显卡不支持 HEVC。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="639"/>
|
||||
<location filename="../streaming/session.cpp" line="658"/>
|
||||
<source>%1 doesn't support HDR10.</source>
|
||||
<translation>%1 不支持 HDR10。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="643"/>
|
||||
<location filename="../streaming/session.cpp" line="662"/>
|
||||
<source>Your host PC GPU doesn't support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
|
||||
<translation>目标计算机的显卡不支持 HDR 流。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="652"/>
|
||||
<location filename="../streaming/session.cpp" line="671"/>
|
||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||
<translation>此计算机的显卡不支持 HEVC Main10 解码 HDR 流。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="665"/>
|
||||
<location filename="../streaming/session.cpp" line="684"/>
|
||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||
<translation>4K 流式传输需要 GeForce Experience 3.0 或更高版本。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="680"/>
|
||||
<location filename="../streaming/session.cpp" line="699"/>
|
||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||
<translation>当前音频设备不支持你选择的环绕声设置。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="687"/>
|
||||
<location filename="../streaming/session.cpp" line="706"/>
|
||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||
<translation>无法打开音频设备。音频在此会话期间将不可用。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="692"/>
|
||||
<location filename="../streaming/session.cpp" line="711"/>
|
||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||
<translation>附加的手柄没有映射,因此无法使用。请访问 Moonlight 帮助解决此问题。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="700"/>
|
||||
<location filename="../streaming/session.cpp" line="719"/>
|
||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||
<translation>目标计算机的显卡不支持 4K 以上的流式传输视频分辨率。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="704"/>
|
||||
<location filename="../streaming/session.cpp" line="723"/>
|
||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||
<translation>只有 HEVC 编解码器才支持 4K 以上的视频分辨率。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="718"/>
|
||||
<location filename="../streaming/session.cpp" line="737"/>
|
||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||
<translation>由于此计算机的显卡上缺少硬件解码支持,无法满足强制硬件解码的选择。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="721"/>
|
||||
<location filename="../streaming/session.cpp" line="740"/>
|
||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
||||
<translation>你选择的编解码器和强制硬件解码设置不兼容。此计算机的显卡不支持解码你选择的编解码器。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1022"/>
|
||||
<location filename="../streaming/session.cpp" line="1041"/>
|
||||
<source>GeForce Experience returned error: %1</source>
|
||||
<translation>GeForce Experience 返回错误: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../streaming/session.cpp" line="1445"/>
|
||||
<location filename="../streaming/session.cpp" line="1519"/>
|
||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||
<translation>无法初始化视频解码器。请检查你的流式传输设置,然后重试。</translation>
|
||||
</message>
|
||||
@@ -436,22 +446,22 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
||||
<source>720p</source>
|
||||
<translation></translation>
|
||||
<translation>720p</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
||||
<source>1080p</source>
|
||||
<translation></translation>
|
||||
<translation>1080p</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
||||
<source>1440p</source>
|
||||
<translation></translation>
|
||||
<translation>1440p</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
||||
<source>4K</source>
|
||||
<translation></translation>
|
||||
<translation>4K</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
||||
@@ -474,7 +484,7 @@
|
||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
||||
<source>%1 FPS</source>
|
||||
<translation></translation>
|
||||
<translation>%1 FPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
||||
@@ -512,7 +522,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
||||
<location filename="../gui/SettingsView.qml" line="847"/>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<source>Fullscreen</source>
|
||||
<translation>全屏</translation>
|
||||
</message>
|
||||
@@ -523,7 +533,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
||||
<location filename="../gui/SettingsView.qml" line="839"/>
|
||||
<location filename="../gui/SettingsView.qml" line="852"/>
|
||||
<source>Windowed</source>
|
||||
<translation>窗口化</translation>
|
||||
</message>
|
||||
@@ -605,77 +615,77 @@
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
||||
<source>Language</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>语言</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
||||
<source>Automatic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>自动化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="792"/>
|
||||
<location filename="../gui/SettingsView.qml" line="805"/>
|
||||
<source>You must restart Moonlight for this change to take effect</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>你必须重新启动 Moonlight 才能使更改生效</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="806"/>
|
||||
<location filename="../gui/SettingsView.qml" line="819"/>
|
||||
<source>GUI display mode</source>
|
||||
<translation>窗口显示模式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="843"/>
|
||||
<location filename="../gui/SettingsView.qml" line="856"/>
|
||||
<source>Maximized</source>
|
||||
<translation>最大化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
||||
<location filename="../gui/SettingsView.qml" line="873"/>
|
||||
<source>Show connection quality warnings</source>
|
||||
<translation>显示连接质量警告</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="872"/>
|
||||
<location filename="../gui/SettingsView.qml" line="885"/>
|
||||
<source>Discord Rich Presence integration</source>
|
||||
<translation>Discord Rich Presence 集成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="882"/>
|
||||
<location filename="../gui/SettingsView.qml" line="895"/>
|
||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||
<translation>更新你的 Discord 状态,以显示正在运行的游戏名称。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="900"/>
|
||||
<location filename="../gui/SettingsView.qml" line="913"/>
|
||||
<source>Input Settings</source>
|
||||
<translation>输入设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="911"/>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<source>Optimize mouse for remote desktop instead of games</source>
|
||||
<translation>为远程桌面而不是游戏优化鼠标</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="922"/>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<source>This enables seamless mouse control without capturing the client's mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
|
||||
<translation>这可以实现无缝鼠标控制,而无需捕获客户端的鼠标光标。这是理想的远程桌面使用方案,但不会在大多数游戏中工作。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="923"/>
|
||||
<location filename="../gui/SettingsView.qml" line="935"/>
|
||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||
<translation>你可以使用 Ctrl+Alt+Shift+M 切换鼠标控制模式。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="924"/>
|
||||
<location filename="../gui/SettingsView.qml" line="936"/>
|
||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
||||
<translation>注意:由于 GeForce Experience 的 Bug,如果你的目标计算机有多个显示器,则此选项可能无法正常工作。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="934"/>
|
||||
<location filename="../gui/SettingsView.qml" line="946"/>
|
||||
<source>Capture system keyboard shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>捕获系统快捷键</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
||||
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>这样可以捕获系统范围的键盘快捷键,例如 Alt + Tab,这些快捷键通常在流式传输时由客户端系统处理。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||
@@ -686,158 +696,158 @@
|
||||
<translation type="vanished">这允许捕获系统范围内的键盘快捷键(如Alt+Tab),这些快捷键通常在全屏流式传输时由客户端操作系统处理。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
||||
<location filename="../gui/SettingsView.qml" line="955"/>
|
||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
||||
<translation>注意:Windows 上的某些键盘快捷键(如 Ctrl+Alt+Del)不能被任何应用程序截获,包括 Moonlight。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||
<location filename="../gui/SettingsView.qml" line="984"/>
|
||||
<source>in fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>全屏</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="976"/>
|
||||
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||
<source>always</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>总是</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1018"/>
|
||||
<source>Use touchscreen as a virtual trackpad</source>
|
||||
<translation>将触摸屏用作虚拟触控板</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1016"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||
<translation>选中时,触摸屏就像一个触控板。取消选中时,触摸屏将直接控制鼠标指针。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1023"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1035"/>
|
||||
<source>Swap left and right mouse buttons</source>
|
||||
<translation>交换鼠标左键和右键</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1035"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||
<source>Reverse mouse scrolling direction</source>
|
||||
<translation>反转鼠标滚动方向</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1049"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1061"/>
|
||||
<source>Gamepad Settings</source>
|
||||
<translation>手柄设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1059"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1071"/>
|
||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||
<translation>交换手柄的 A/B 和 X/Y 按钮</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1089"/>
|
||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||
<translation>这会将手柄切换为任天堂风格的按钮布局</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1083"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1095"/>
|
||||
<source>Force gamepad #1 always connected</source>
|
||||
<translation>强制手柄 #1 始终连接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1093"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1105"/>
|
||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||
<translation>强制单个手柄始终与目标计算机保持连接,即使没有任何手柄实际连接到此计算机。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1094"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1106"/>
|
||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||
<translation>仅在游戏启动后不支持手柄连接时才启用此选项。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1101"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||
<translation>按住手柄的“Start”按钮启用鼠标控制</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1112"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1124"/>
|
||||
<source>Process gamepad input when Moonlight is in the background</source>
|
||||
<translation>当 Moonlight 在后台时处理手柄输入</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1123"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1135"/>
|
||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||
<translation>即使不是焦点窗口,也允许 Moonlight 捕获手柄的输入</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1144"/>
|
||||
<source>Host Settings</source>
|
||||
<translation>目标计算机设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1142"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||
<source>Optimize game settings for streaming</source>
|
||||
<translation>优化游戏设置以进行流式传输</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1153"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1165"/>
|
||||
<source>Quit app on host PC after ending stream</source>
|
||||
<translation>流式传输结束后退出目标计算机上的应用程序</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1163"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1175"/>
|
||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||
<translation>当你结束流式传输时,这将关闭正在运行的应用程序或游戏。这会导致你失去所有未保存的游戏进度!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1172"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1184"/>
|
||||
<source>Advanced Settings</source>
|
||||
<translation>高级设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1194"/>
|
||||
<source>Video decoder</source>
|
||||
<translation>视频解码器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1207"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1253"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1219"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1265"/>
|
||||
<source>Automatic (Recommended)</source>
|
||||
<translation>自动 (推荐)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1211"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1223"/>
|
||||
<source>Force software decoding</source>
|
||||
<translation>强制软件解码</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1215"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
||||
<source>Force hardware decoding</source>
|
||||
<translation>强制硬件解码</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1240"/>
|
||||
<source>Video codec</source>
|
||||
<translation>视频编解码器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1257"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1269"/>
|
||||
<source>H.264</source>
|
||||
<translation></translation>
|
||||
<translation>H.264</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1261"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
||||
<source>HEVC (H.265)</source>
|
||||
<translation></translation>
|
||||
<translation>HEVC (H.265)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1278"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1290"/>
|
||||
<source>Unlock unsupported FPS options</source>
|
||||
<translation>解锁不受支持的 FPS 选项</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1297"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1309"/>
|
||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||
<translation>自动在本地网络上查找计算机 (推荐)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/SettingsView.qml" line="1322"/>
|
||||
<location filename="../gui/SettingsView.qml" line="1334"/>
|
||||
<source>Automatically detect blocked connections (Recommended)</source>
|
||||
<translation>自动检测被阻止的连接 (推荐)</translation>
|
||||
</message>
|
||||
@@ -858,7 +868,7 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="25"/>
|
||||
<source>Starting %1 failed: Error %2</source>
|
||||
<translation>启动 %1 错误: 错误 %2</translation>
|
||||
<translation>启动 %1 失败: 错误 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="28"/>
|
||||
@@ -883,12 +893,12 @@
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
||||
<source>Start+Select+L1+R1</source>
|
||||
<translation></translation>
|
||||
<translation>Start+Select+L1+R1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
||||
<source>Ctrl+Alt+Shift+Q</source>
|
||||
<translation></translation>
|
||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+10
-2
@@ -23,12 +23,20 @@
|
||||
<file>languages/qml_fr.qm</file>
|
||||
<file>languages/qml_zh_cn.ts</file>
|
||||
<file>languages/qml_zh_cn.qm</file>
|
||||
<file>languages/qml_nb_NO.ts</file>
|
||||
<file>languages/qml_nb_NO.qm</file>
|
||||
<file>languages/qml_ru.ts</file>
|
||||
<file>languages/qml_ru.qm</file>
|
||||
<file>languages/qml_es.ts</file>
|
||||
<file>languages/qml_es.qm</file>
|
||||
</qresource>
|
||||
<qresource prefix="/data">
|
||||
<file alias="gamecontrollerdb.txt">SDL_GameControllerDB/gamecontrollerdb.txt</file>
|
||||
<file alias="ModeSeven.ttf">ModeSeven.ttf</file>
|
||||
<file alias="egl.frag">shaders/egl.frag</file>
|
||||
<file alias="egl.vert">shaders/egl.vert</file>
|
||||
<file alias="egl_nv12.frag">shaders/egl_nv12.frag</file>
|
||||
<file alias="egl_nv12.vert">shaders/egl_nv12.vert</file>
|
||||
<file alias="egl_opaque.frag">shaders/egl_opaque.frag</file>
|
||||
<file alias="egl_opaque.vert">shaders/egl_opaque.vert</file>
|
||||
<file alias="egl_overlay.frag">shaders/egl_overlay.frag</file>
|
||||
<file alias="egl_overlay.vert">shaders/egl_overlay.vert</file>
|
||||
</qresource>
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
#include "compatfetcher.h"
|
||||
#include "path.h"
|
||||
|
||||
#include <QNetworkReply>
|
||||
#include <QSettings>
|
||||
|
||||
#define COMPAT_VERSION "v1"
|
||||
#define COMPAT_KEY "latestsupportedversion-"
|
||||
|
||||
CompatFetcher::CompatFetcher(QObject *parent) :
|
||||
QObject(parent),
|
||||
m_Nam(this)
|
||||
{
|
||||
// Never communicate over HTTP
|
||||
m_Nam.setStrictTransportSecurityEnabled(true);
|
||||
|
||||
// Allow HTTP redirects
|
||||
m_Nam.setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
|
||||
|
||||
connect(&m_Nam, &QNetworkAccessManager::finished,
|
||||
this, &CompatFetcher::handleCompatInfoFetched);
|
||||
}
|
||||
|
||||
void CompatFetcher::start()
|
||||
{
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) && QT_VERSION < QT_VERSION_CHECK(5, 15, 1) && !defined(QT_NO_BEARERMANAGEMENT)
|
||||
// HACK: Set network accessibility to work around QTBUG-80947 (introduced in Qt 5.14.0 and fixed in Qt 5.15.1)
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_DEPRECATED
|
||||
m_Nam.setNetworkAccessible(QNetworkAccessManager::Accessible);
|
||||
QT_WARNING_POP
|
||||
#endif
|
||||
|
||||
QUrl url("https://moonlight-stream.org/compatibility/" COMPAT_VERSION);
|
||||
QNetworkRequest request(url);
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
||||
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, true);
|
||||
#else
|
||||
request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true);
|
||||
#endif
|
||||
|
||||
// We'll get a callback when this is finished
|
||||
m_Nam.get(request);
|
||||
}
|
||||
|
||||
bool CompatFetcher::isGfeVersionSupported(QString gfeVersion)
|
||||
{
|
||||
QSettings settings;
|
||||
|
||||
if (gfeVersion.trimmed().isEmpty()) {
|
||||
// If we don't have a GFE version, just allow it
|
||||
return true;
|
||||
}
|
||||
|
||||
QString latestSupportedVersion = settings.value(COMPAT_KEY COMPAT_VERSION).toString();
|
||||
if (latestSupportedVersion.isEmpty()) {
|
||||
// We don't have compat data yet, so just assume it's supported
|
||||
return true;
|
||||
}
|
||||
|
||||
QStringList latestSupportedVersionQuad = latestSupportedVersion.split('.');
|
||||
QStringList gfeVersionQuad = gfeVersion.split('.');
|
||||
|
||||
if (gfeVersionQuad.count() <= 1) {
|
||||
qWarning() << "Failed to parse GFE version:" << gfeVersion;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (latestSupportedVersionQuad.count() <= 1) {
|
||||
qWarning() << "Failed to parse latest supported version:" << latestSupportedVersion;
|
||||
return true;
|
||||
}
|
||||
|
||||
for (int i = 0;; i++) {
|
||||
int actualVerVal = 0;
|
||||
int latestSupportedVal = 0;
|
||||
|
||||
// Treat missing decimal places as 0
|
||||
if (i < gfeVersionQuad.count()) {
|
||||
bool ok;
|
||||
|
||||
actualVerVal = gfeVersionQuad[i].toInt(&ok);
|
||||
if (!ok || actualVerVal < 0) {
|
||||
// Return true to be safe
|
||||
qWarning() << "Failed to parse GFE version:" << gfeVersion;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (i < latestSupportedVersionQuad.count()) {
|
||||
bool ok;
|
||||
|
||||
latestSupportedVal = latestSupportedVersionQuad[i].toInt(&ok);
|
||||
if (!ok || latestSupportedVal < 0) {
|
||||
// Return true to be safe
|
||||
qWarning() << "Failed to parse latest supported version:" << latestSupportedVersion;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (i >= gfeVersionQuad.count() && i >= latestSupportedVersionQuad.count()) {
|
||||
// Equal versions - this is fine
|
||||
return true;
|
||||
}
|
||||
|
||||
if (actualVerVal < latestSupportedVal) {
|
||||
// Actual version is lower than latest supported - this is fine
|
||||
return true;
|
||||
}
|
||||
else if (actualVerVal > latestSupportedVal) {
|
||||
// Actual version is greater than latest supported - this is bad
|
||||
qWarning() << "GFE version" << gfeVersion << "is not supported by this version of Moonlight";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CompatFetcher::handleCompatInfoFetched(QNetworkReply* reply)
|
||||
{
|
||||
Q_ASSERT(reply->isFinished());
|
||||
|
||||
if (reply->error() == QNetworkReply::NoError) {
|
||||
// Queue the reply for deletion
|
||||
reply->deleteLater();
|
||||
|
||||
QString version = QString(reply->readAll()).trimmed();
|
||||
|
||||
QSettings settings;
|
||||
settings.setValue(COMPAT_KEY COMPAT_VERSION, version);
|
||||
|
||||
qInfo() << "Latest supported GFE server:" << version;
|
||||
}
|
||||
else {
|
||||
qWarning() << "Failed to download latest compatibility data:" << reply->error();
|
||||
reply->deleteLater();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QNetworkAccessManager>
|
||||
|
||||
class CompatFetcher : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CompatFetcher(QObject *parent = nullptr);
|
||||
|
||||
void start();
|
||||
|
||||
static bool isGfeVersionSupported(QString gfeVersion);
|
||||
|
||||
private slots:
|
||||
void handleCompatInfoFetched(QNetworkReply* reply);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager m_Nam;
|
||||
};
|
||||
@@ -189,6 +189,12 @@ QString StreamingPreferences::getSuffixFromLanguage(StreamingPreferences::Langua
|
||||
return "fr";
|
||||
case LANG_ZH_CN:
|
||||
return "zh_cn";
|
||||
case LANG_NB_NO:
|
||||
return "nb_NO";
|
||||
case LANG_RU:
|
||||
return "ru";
|
||||
case LANG_ES:
|
||||
return "es";
|
||||
case LANG_AUTO:
|
||||
default:
|
||||
return QLocale::system().name();
|
||||
|
||||
@@ -69,7 +69,10 @@ public:
|
||||
LANG_EN,
|
||||
LANG_FR,
|
||||
LANG_ZH_CN,
|
||||
LANG_DE
|
||||
LANG_DE,
|
||||
LANG_NB_NO,
|
||||
LANG_RU,
|
||||
LANG_ES
|
||||
};
|
||||
Q_ENUM(Language);
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#version 300 es
|
||||
#extension GL_OES_EGL_image_external : require
|
||||
precision mediump float;
|
||||
out vec4 FragColor;
|
||||
|
||||
in vec2 vTextCoord;
|
||||
|
||||
uniform samplerExternalOES uTexture;
|
||||
|
||||
void main() {
|
||||
FragColor = texture2D(uTexture, vTextCoord);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#version 300 es
|
||||
|
||||
layout (location = 0) in vec2 aPosition; // 2D: X,Y
|
||||
layout (location = 1) in vec2 aTexCoord;
|
||||
out vec2 vTextCoord;
|
||||
|
||||
void main() {
|
||||
vTextCoord = aTexCoord;
|
||||
gl_Position = vec4(aPosition, 0, 1);
|
||||
}
|
||||
@@ -372,11 +372,18 @@ void SdlInputHandler::updateKeyboardGrabState()
|
||||
// Ungrab if it's fullscreen only and we left fullscreen
|
||||
shouldGrab = false;
|
||||
}
|
||||
#ifdef Q_OS_DARWIN
|
||||
else if (!(windowFlags & SDL_WINDOW_INPUT_FOCUS)) {
|
||||
// Ungrab if we lose input focus (SDL will do this internally, but
|
||||
// not for macOS where SDL is not handling the grab logic).
|
||||
// Ungrab if we lose input focus on macOS. SDL will handle
|
||||
// this internally for platforms where we use the SDL
|
||||
// SDL_SetWindowKeyboardGrab() API exclusively.
|
||||
//
|
||||
// NB: On X11, we may not have input focus at the time of
|
||||
// the initial keyboard grab update, so we must not enable
|
||||
// this codepath on Linux.
|
||||
shouldGrab = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Don't close the window on Alt+F4 when keyboard grab is enabled
|
||||
SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, shouldGrab ? "1" : "0");
|
||||
|
||||
@@ -181,6 +181,11 @@ bool Session::chooseDecoder(StreamingPreferences::VideoDecoderSelection vds,
|
||||
{
|
||||
DECODER_PARAMETERS params;
|
||||
|
||||
// We should never have vsync enabled for test-mode.
|
||||
// It introduces unnecessary delay for renderers that may
|
||||
// block while waiting for a backbuffer swap.
|
||||
SDL_assert(!enableVsync || !testOnly);
|
||||
|
||||
params.width = width;
|
||||
params.height = height;
|
||||
params.frameRate = frameRate;
|
||||
@@ -292,7 +297,7 @@ void Session::getDecoderInfo(SDL_Window* window,
|
||||
|
||||
if (!chooseDecoder(StreamingPreferences::VDS_AUTO,
|
||||
window, VIDEO_FORMAT_H264, 1920, 1080, 60,
|
||||
true, false, true, decoder)) {
|
||||
false, false, true, decoder)) {
|
||||
isHardwareAccelerated = isFullScreenOnly = false;
|
||||
return;
|
||||
}
|
||||
@@ -310,7 +315,7 @@ bool Session::isHardwareDecodeAvailable(SDL_Window* window,
|
||||
{
|
||||
IVideoDecoder* decoder;
|
||||
|
||||
if (!chooseDecoder(vds, window, videoFormat, width, height, frameRate, true, false, true, decoder)) {
|
||||
if (!chooseDecoder(vds, window, videoFormat, width, height, frameRate, false, false, true, decoder)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -332,7 +337,7 @@ bool Session::populateDecoderProperties(SDL_Window* window)
|
||||
m_StreamConfig.width,
|
||||
m_StreamConfig.height,
|
||||
m_StreamConfig.fps,
|
||||
true, false, true, decoder)) {
|
||||
false, false, true, decoder)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -428,6 +433,12 @@ bool Session::initialize()
|
||||
m_StreamConfig.bitrate = m_Preferences->bitrateKbps;
|
||||
m_StreamConfig.hevcBitratePercentageMultiplier = 75;
|
||||
|
||||
#ifndef STEAM_LINK
|
||||
// Enable audio encryption as long as we're not on Steam Link.
|
||||
// That hardware can hardly handle Opus decoding at all.
|
||||
m_StreamConfig.encryptionFlags = ENCFLG_AUDIO;
|
||||
#endif
|
||||
|
||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Video bitrate: %d kbps",
|
||||
m_StreamConfig.bitrate);
|
||||
@@ -577,6 +588,11 @@ bool Session::validateLaunch(SDL_Window* testWindow)
|
||||
{
|
||||
QStringList warningList;
|
||||
|
||||
if (!m_Computer->isSupportedServerVersion) {
|
||||
emit displayLaunchError(tr("The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.").arg(m_Computer->name));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_Preferences->absoluteMouseMode && !m_App.isAppCollectorGame) {
|
||||
emitLaunchWarning(tr("Your selection to enable remote desktop mouse mode may cause problems in games."));
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ DrmRenderer::DrmRenderer()
|
||||
m_CurrentFbId(0)
|
||||
{
|
||||
#ifdef HAVE_EGL
|
||||
m_EGLExtDmaBuf = false;
|
||||
m_eglCreateImage = nullptr;
|
||||
m_eglCreateImageKHR = nullptr;
|
||||
m_eglDestroyImage = nullptr;
|
||||
@@ -297,6 +298,8 @@ void DrmRenderer::renderFrame(AVFrame* frame)
|
||||
uint32_t handles[4] = {};
|
||||
uint32_t pitches[4] = {};
|
||||
uint32_t offsets[4] = {};
|
||||
uint64_t modifiers[4] = {};
|
||||
uint32_t flags = 0;
|
||||
|
||||
SDL_Rect src, dst;
|
||||
|
||||
@@ -318,12 +321,18 @@ void DrmRenderer::renderFrame(AVFrame* frame)
|
||||
return;
|
||||
}
|
||||
|
||||
// Pass along the modifiers to DRM if there are some in the descriptor
|
||||
if (drmFrame->objects[0].format_modifier != DRM_FORMAT_MOD_INVALID) {
|
||||
flags |= DRM_MODE_FB_MODIFIERS;
|
||||
}
|
||||
|
||||
SDL_assert(drmFrame->nb_layers == 1);
|
||||
SDL_assert(drmFrame->layers[0].nb_planes == 2);
|
||||
for (int i = 0; i < drmFrame->layers[0].nb_planes; i++) {
|
||||
handles[i] = primeHandle;
|
||||
pitches[i] = drmFrame->layers[0].planes[i].pitch;
|
||||
offsets[i] = drmFrame->layers[0].planes[i].offset;
|
||||
modifiers[i] = drmFrame->objects[0].format_modifier;
|
||||
}
|
||||
|
||||
// Remember the last FB object we created so we can free it
|
||||
@@ -331,12 +340,15 @@ void DrmRenderer::renderFrame(AVFrame* frame)
|
||||
uint32_t lastFbId = m_CurrentFbId;
|
||||
|
||||
// Create a frame buffer object from the PRIME buffer
|
||||
err = drmModeAddFB2(m_DrmFd, frame->width, frame->height,
|
||||
drmFrame->layers[0].format,
|
||||
handles, pitches, offsets, &m_CurrentFbId, 0);
|
||||
// NB: It is an error to pass modifiers without DRM_MODE_FB_MODIFIERS set.
|
||||
err = drmModeAddFB2WithModifiers(m_DrmFd, frame->width, frame->height,
|
||||
drmFrame->layers[0].format,
|
||||
handles, pitches, offsets,
|
||||
(flags & DRM_MODE_FB_MODIFIERS) ? modifiers : NULL,
|
||||
&m_CurrentFbId, flags);
|
||||
if (err < 0) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"drmModeAddFB2() failed: %d",
|
||||
"drmModeAddFB2WithModifiers() failed: %d",
|
||||
errno);
|
||||
m_CurrentFbId = lastFbId;
|
||||
return;
|
||||
@@ -387,7 +399,8 @@ bool DrmRenderer::canExportEGL() {
|
||||
}
|
||||
|
||||
AVPixelFormat DrmRenderer::getEGLImagePixelFormat() {
|
||||
return AV_PIX_FMT_NV12;
|
||||
// This tells EGLRenderer to treat the EGLImage as a single opaque texture
|
||||
return AV_PIX_FMT_DRM_PRIME;
|
||||
}
|
||||
|
||||
bool DrmRenderer::initializeEGL(EGLDisplay,
|
||||
@@ -398,6 +411,8 @@ bool DrmRenderer::initializeEGL(EGLDisplay,
|
||||
return false;
|
||||
}
|
||||
|
||||
m_EGLExtDmaBuf = ext.isSupported("EGL_EXT_image_dma_buf_import_modifiers");
|
||||
|
||||
// NB: eglCreateImage() and eglCreateImageKHR() have slightly different definitions
|
||||
m_eglCreateImage = (typeof(m_eglCreateImage))eglGetProcAddress("eglCreateImage");
|
||||
m_eglCreateImageKHR = (typeof(m_eglCreateImageKHR))eglGetProcAddress("eglCreateImageKHR");
|
||||
@@ -416,61 +431,125 @@ bool DrmRenderer::initializeEGL(EGLDisplay,
|
||||
|
||||
ssize_t DrmRenderer::exportEGLImages(AVFrame *frame, EGLDisplay dpy,
|
||||
EGLImage images[EGL_MAX_PLANES]) {
|
||||
ssize_t count = 0;
|
||||
AVDRMFrameDescriptor* drmFrame = (AVDRMFrameDescriptor*)frame->data[0];
|
||||
|
||||
memset(images, 0, sizeof(EGLImage) * EGL_MAX_PLANES);
|
||||
|
||||
SDL_assert(drmFrame->nb_objects == 1);
|
||||
SDL_assert(drmFrame->nb_layers == 1);
|
||||
SDL_assert(drmFrame->layers[0].nb_planes == 2);
|
||||
|
||||
// Max 30 attributes (1 key + 1 value for each)
|
||||
const int MAX_ATTRIB_COUNT = 30 * 2;
|
||||
EGLAttrib attribs[MAX_ATTRIB_COUNT] = {
|
||||
EGL_LINUX_DRM_FOURCC_EXT, (EGLAttrib)drmFrame->layers[0].format,
|
||||
EGL_WIDTH, frame->width,
|
||||
EGL_HEIGHT, frame->height,
|
||||
};
|
||||
int attribIndex = 6;
|
||||
|
||||
for (int i = 0; i < drmFrame->layers[0].nb_planes; ++i) {
|
||||
const auto &plane = drmFrame->layers[0].planes[i];
|
||||
const auto &object = drmFrame->objects[plane.object_index];
|
||||
|
||||
const int EGL_ATTRIB_COUNT = 13;
|
||||
EGLAttrib attribs[EGL_ATTRIB_COUNT] = {
|
||||
EGL_LINUX_DRM_FOURCC_EXT, i == 0 ? DRM_FORMAT_R8 : DRM_FORMAT_GR88,
|
||||
EGL_WIDTH, i == 0 ? frame->width : frame->width / 2,
|
||||
EGL_HEIGHT, i == 0 ? frame->height : frame->height / 2,
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, object.fd,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT, plane.offset,
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT, plane.pitch,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
if (m_eglCreateImage) {
|
||||
images[i] = m_eglCreateImage(dpy, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT,
|
||||
nullptr, attribs);
|
||||
if (!images[i]) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"eglCreateImage() Failed: %d", eglGetError());
|
||||
goto fail;
|
||||
switch (i) {
|
||||
case 0:
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_FD_EXT;
|
||||
attribs[attribIndex++] = object.fd;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
|
||||
attribs[attribIndex++] = plane.offset;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
|
||||
attribs[attribIndex++] = plane.pitch;
|
||||
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_FD_EXT;
|
||||
attribs[attribIndex++] = object.fd;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_OFFSET_EXT;
|
||||
attribs[attribIndex++] = plane.offset;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
|
||||
attribs[attribIndex++] = plane.pitch;
|
||||
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_FD_EXT;
|
||||
attribs[attribIndex++] = object.fd;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_OFFSET_EXT;
|
||||
attribs[attribIndex++] = plane.offset;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
|
||||
attribs[attribIndex++] = plane.pitch;
|
||||
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_FD_EXT;
|
||||
attribs[attribIndex++] = object.fd;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_OFFSET_EXT;
|
||||
attribs[attribIndex++] = plane.offset;
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_PITCH_EXT;
|
||||
attribs[attribIndex++] = plane.pitch;
|
||||
if (m_EGLExtDmaBuf && object.format_modifier != DRM_FORMAT_MOD_INVALID) {
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier & 0xFFFFFFFF);
|
||||
attribs[attribIndex++] = EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT;
|
||||
attribs[attribIndex++] = (EGLint)(object.format_modifier >> 32);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
else {
|
||||
// Cast the EGLAttrib array elements to EGLint for the KHR extension
|
||||
EGLint intAttribs[EGL_ATTRIB_COUNT];
|
||||
for (int i = 0; i < EGL_ATTRIB_COUNT; i++) {
|
||||
intAttribs[i] = (EGLint)attribs[i];
|
||||
}
|
||||
|
||||
images[i] = m_eglCreateImageKHR(dpy, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT,
|
||||
nullptr, intAttribs);
|
||||
if (!images[i]) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"eglCreateImageKHR() Failed: %d", eglGetError());
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
// Terminate the attribute list
|
||||
attribs[attribIndex++] = EGL_NONE;
|
||||
SDL_assert(attribIndex <= MAX_ATTRIB_COUNT);
|
||||
|
||||
// Our EGLImages are non-planar, so we only populate the first entry
|
||||
if (m_eglCreateImage) {
|
||||
images[0] = m_eglCreateImage(dpy, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT,
|
||||
nullptr, attribs);
|
||||
if (!images[0]) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"eglCreateImage() Failed: %d", eglGetError());
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Cast the EGLAttrib array elements to EGLint for the KHR extension
|
||||
EGLint intAttribs[MAX_ATTRIB_COUNT];
|
||||
for (int i = 0; i < MAX_ATTRIB_COUNT; i++) {
|
||||
intAttribs[i] = (EGLint)attribs[i];
|
||||
}
|
||||
|
||||
images[0] = m_eglCreateImageKHR(dpy, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT,
|
||||
nullptr, intAttribs);
|
||||
if (!images[0]) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"eglCreateImageKHR() Failed: %d", eglGetError());
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
fail:
|
||||
freeEGLImages(dpy, images);
|
||||
@@ -478,14 +557,16 @@ fail:
|
||||
}
|
||||
|
||||
void DrmRenderer::freeEGLImages(EGLDisplay dpy, EGLImage images[EGL_MAX_PLANES]) {
|
||||
for (size_t i = 0; i < EGL_MAX_PLANES; ++i) {
|
||||
if (m_eglDestroyImage) {
|
||||
m_eglDestroyImage(dpy, images[i]);
|
||||
}
|
||||
else {
|
||||
m_eglDestroyImageKHR(dpy, images[i]);
|
||||
}
|
||||
if (m_eglDestroyImage) {
|
||||
m_eglDestroyImage(dpy, images[0]);
|
||||
}
|
||||
else {
|
||||
m_eglDestroyImageKHR(dpy, images[0]);
|
||||
}
|
||||
|
||||
// Our EGLImages are non-planar
|
||||
SDL_assert(images[1] == 0);
|
||||
SDL_assert(images[2] == 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -35,6 +35,7 @@ private:
|
||||
SDL_Rect m_OutputRect;
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
bool m_EGLExtDmaBuf;
|
||||
PFNEGLCREATEIMAGEPROC m_eglCreateImage;
|
||||
PFNEGLDESTROYIMAGEPROC m_eglDestroyImage;
|
||||
PFNEGLCREATEIMAGEKHRPROC m_eglCreateImageKHR;
|
||||
|
||||
@@ -250,7 +250,7 @@ void EGLRenderer::renderOverlay(Overlay::OverlayType type)
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, m_OverlayTextures[type]);
|
||||
glUniform1i(m_OverlayShaderProgramParams[PARAM_TEXTURE], 0);
|
||||
glUniform1i(m_OverlayShaderProgramParams[OVERLAY_PARAM_TEXTURE], 0);
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
}
|
||||
@@ -373,24 +373,39 @@ bool EGLRenderer::compileShaders() {
|
||||
SDL_assert(m_EGLImagePixelFormat != AV_PIX_FMT_NONE);
|
||||
|
||||
// XXX: TODO: other formats
|
||||
SDL_assert(m_EGLImagePixelFormat == AV_PIX_FMT_NV12);
|
||||
if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) {
|
||||
m_ShaderProgram = compileShader("egl_nv12.vert", "egl_nv12.frag");
|
||||
if (!m_ShaderProgram) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_ShaderProgram = compileShader("egl.vert", "egl.frag");
|
||||
if (!m_ShaderProgram) {
|
||||
m_ShaderProgramParams[NV12_PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat");
|
||||
m_ShaderProgramParams[NV12_PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset");
|
||||
m_ShaderProgramParams[NV12_PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1");
|
||||
m_ShaderProgramParams[NV12_PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2");
|
||||
}
|
||||
else if (m_EGLImagePixelFormat == AV_PIX_FMT_DRM_PRIME) {
|
||||
m_ShaderProgram = compileShader("egl_opaque.vert", "egl_opaque.frag");
|
||||
if (!m_ShaderProgram) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_ShaderProgramParams[OPAQUE_PARAM_TEXTURE] = glGetUniformLocation(m_ShaderProgram, "uTexture");
|
||||
}
|
||||
else {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Unsupported EGL pixel format: %d",
|
||||
m_EGLImagePixelFormat);
|
||||
SDL_assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_ShaderProgramParams[PARAM_YUVMAT] = glGetUniformLocation(m_ShaderProgram, "yuvmat");
|
||||
m_ShaderProgramParams[PARAM_OFFSET] = glGetUniformLocation(m_ShaderProgram, "offset");
|
||||
m_ShaderProgramParams[PARAM_PLANE1] = glGetUniformLocation(m_ShaderProgram, "plane1");
|
||||
m_ShaderProgramParams[PARAM_PLANE2] = glGetUniformLocation(m_ShaderProgram, "plane2");
|
||||
|
||||
m_OverlayShaderProgram = compileShader("egl_overlay.vert", "egl_overlay.frag");
|
||||
if (!m_OverlayShaderProgram) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_OverlayShaderProgramParams[PARAM_TEXTURE] = glGetUniformLocation(m_OverlayShaderProgram, "uTexture");
|
||||
m_OverlayShaderProgramParams[OVERLAY_PARAM_TEXTURE] = glGetUniformLocation(m_OverlayShaderProgram, "uTexture");
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -778,10 +793,16 @@ void EGLRenderer::renderFrame(AVFrame* frame)
|
||||
glUseProgram(m_ShaderProgram);
|
||||
m_glBindVertexArrayOES(m_VAO);
|
||||
|
||||
glUniformMatrix3fv(m_ShaderProgramParams[PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix());
|
||||
glUniform3fv(m_ShaderProgramParams[PARAM_OFFSET], 1, getColorOffsets());
|
||||
glUniform1i(m_ShaderProgramParams[PARAM_PLANE1], 0);
|
||||
glUniform1i(m_ShaderProgramParams[PARAM_PLANE2], 1);
|
||||
// Bind parameters for the shaders
|
||||
if (m_EGLImagePixelFormat == AV_PIX_FMT_NV12) {
|
||||
glUniformMatrix3fv(m_ShaderProgramParams[NV12_PARAM_YUVMAT], 1, GL_FALSE, getColorMatrix());
|
||||
glUniform3fv(m_ShaderProgramParams[NV12_PARAM_OFFSET], 1, getColorOffsets());
|
||||
glUniform1i(m_ShaderProgramParams[NV12_PARAM_PLANE1], 0);
|
||||
glUniform1i(m_ShaderProgramParams[NV12_PARAM_PLANE2], 1);
|
||||
}
|
||||
else if (m_EGLImagePixelFormat == AV_PIX_FMT_DRM_PRIME) {
|
||||
glUniform1i(m_ShaderProgramParams[OPAQUE_PARAM_TEXTURE], 0);
|
||||
}
|
||||
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
|
||||
@@ -815,3 +836,21 @@ void EGLRenderer::renderFrame(AVFrame* frame)
|
||||
av_frame_unref(m_LastFrame);
|
||||
av_frame_move_ref(m_LastFrame, frame);
|
||||
}
|
||||
|
||||
bool EGLRenderer::testRenderFrame(AVFrame* frame)
|
||||
{
|
||||
EGLImage imgs[EGL_MAX_PLANES];
|
||||
|
||||
// Make sure we can get working EGLImages from the backend renderer.
|
||||
// Some devices (Raspberry Pi) will happily decode into DRM formats that
|
||||
// its own GL implementation won't accept in eglCreateImage().
|
||||
ssize_t plane_count = m_Backend->exportEGLImages(frame, m_EGLDisplay, imgs);
|
||||
if (plane_count <= 0) {
|
||||
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Backend failed to export EGL image for test frame");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_Backend->freeEGLImages(m_EGLDisplay, imgs);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ public:
|
||||
virtual bool initialize(PDECODER_PARAMETERS params) override;
|
||||
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override;
|
||||
virtual void renderFrame(AVFrame* frame) override;
|
||||
virtual bool testRenderFrame(AVFrame* frame) override;
|
||||
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
||||
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
|
||||
virtual AVPixelFormat getPreferredPixelFormat(int videoFormat) override;
|
||||
@@ -51,13 +52,14 @@ private:
|
||||
PFNGLBINDVERTEXARRAYOESPROC m_glBindVertexArrayOES;
|
||||
PFNGLDELETEVERTEXARRAYSOESPROC m_glDeleteVertexArraysOES;
|
||||
|
||||
#define PARAM_YUVMAT 0
|
||||
#define PARAM_OFFSET 1
|
||||
#define PARAM_PLANE1 2
|
||||
#define PARAM_PLANE2 3
|
||||
#define NV12_PARAM_YUVMAT 0
|
||||
#define NV12_PARAM_OFFSET 1
|
||||
#define NV12_PARAM_PLANE1 2
|
||||
#define NV12_PARAM_PLANE2 3
|
||||
#define OPAQUE_PARAM_TEXTURE 0
|
||||
int m_ShaderProgramParams[4];
|
||||
|
||||
#define PARAM_TEXTURE 0
|
||||
#define OVERLAY_PARAM_TEXTURE 0
|
||||
int m_OverlayShaderProgramParams[1];
|
||||
|
||||
int m_OldContextProfileMask;
|
||||
|
||||
@@ -42,11 +42,26 @@ typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platf
|
||||
#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
|
||||
#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
|
||||
#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
|
||||
#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275
|
||||
#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276
|
||||
#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277
|
||||
#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278
|
||||
#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279
|
||||
#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A
|
||||
#endif
|
||||
|
||||
#ifndef EGL_EXT_image_dma_buf_import_modifiers
|
||||
#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440
|
||||
#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441
|
||||
#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442
|
||||
#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443
|
||||
#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444
|
||||
#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445
|
||||
#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446
|
||||
#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447
|
||||
#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448
|
||||
#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449
|
||||
#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A
|
||||
#endif
|
||||
|
||||
#define EGL_MAX_PLANES 4
|
||||
@@ -71,6 +86,13 @@ public:
|
||||
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) = 0;
|
||||
virtual void renderFrame(AVFrame* frame) = 0;
|
||||
|
||||
virtual bool testRenderFrame(AVFrame*) {
|
||||
// If the renderer doesn't provide an explicit test routine,
|
||||
// we will always assume that any returned AVFrame can be
|
||||
// rendered successfully.
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool needsTestFrame() {
|
||||
// No test frame required by default
|
||||
return false;
|
||||
|
||||
@@ -351,3 +351,36 @@ Exit:
|
||||
av_frame_free(&swFrame);
|
||||
}
|
||||
}
|
||||
|
||||
bool SdlRenderer::testRenderFrame(AVFrame* frame)
|
||||
{
|
||||
// If we are acting as the frontend for a hardware
|
||||
// accelerated decoder, we'll need to read the frame
|
||||
// back to render it. Test that this can be done
|
||||
// for the given frame successfully.
|
||||
if (frame->hw_frames_ctx != nullptr) {
|
||||
auto hwFrameCtx = (AVHWFramesContext*)frame->hw_frames_ctx->data;
|
||||
|
||||
AVFrame* swFrame = av_frame_alloc();
|
||||
if (swFrame == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
swFrame->width = frame->width;
|
||||
swFrame->height = frame->height;
|
||||
swFrame->format = hwFrameCtx->sw_format;
|
||||
|
||||
int err = av_hwframe_transfer_data(swFrame, frame, 0);
|
||||
|
||||
av_frame_free(&swFrame);
|
||||
|
||||
if (err != 0) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"av_hwframe_transfer_data() failed: %d",
|
||||
err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ public:
|
||||
virtual void renderFrame(AVFrame* frame) override;
|
||||
virtual bool isRenderThreadSupported() override;
|
||||
virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override;
|
||||
virtual bool testRenderFrame(AVFrame* frame) override;
|
||||
|
||||
private:
|
||||
void renderOverlay(Overlay::OverlayType type);
|
||||
|
||||
@@ -193,17 +193,22 @@ void FFmpegVideoDecoder::reset()
|
||||
}
|
||||
}
|
||||
|
||||
bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params)
|
||||
bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params, bool eglOnly)
|
||||
{
|
||||
if (eglOnly) {
|
||||
#ifdef HAVE_EGL
|
||||
if (m_BackendRenderer->canExportEGL()) {
|
||||
m_FrontendRenderer = new EGLRenderer(m_BackendRenderer);
|
||||
if (m_FrontendRenderer->initialize(params)) {
|
||||
return true;
|
||||
if (m_BackendRenderer->canExportEGL()) {
|
||||
m_FrontendRenderer = new EGLRenderer(m_BackendRenderer);
|
||||
if (m_FrontendRenderer->initialize(params)) {
|
||||
return true;
|
||||
}
|
||||
delete m_FrontendRenderer;
|
||||
m_FrontendRenderer = nullptr;
|
||||
}
|
||||
delete m_FrontendRenderer;
|
||||
}
|
||||
#endif
|
||||
// If we made it here, we failed to create the EGLRenderer
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_BackendRenderer->isDirectRenderingSupported()) {
|
||||
// The backend renderer can render to the display
|
||||
@@ -221,13 +226,13 @@ bool FFmpegVideoDecoder::createFrontendRenderer(PDECODER_PARAMETERS params)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame)
|
||||
bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame, bool eglOnly)
|
||||
{
|
||||
// In test-only mode, we should only see test frames
|
||||
SDL_assert(!m_TestOnly || testFrame);
|
||||
|
||||
// Create the frontend renderer based on the capabilities of the backend renderer
|
||||
if (!createFrontendRenderer(params)) {
|
||||
if (!createFrontendRenderer(params, eglOnly)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -365,6 +370,14 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAM
|
||||
}
|
||||
}
|
||||
|
||||
// Allow the renderer to do any validation it wants on this frame
|
||||
if (!m_FrontendRenderer->testRenderFrame(frame)) {
|
||||
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Render test failed");
|
||||
av_frame_free(&frame);
|
||||
return false;
|
||||
}
|
||||
|
||||
av_frame_free(&frame);
|
||||
if (err < 0) {
|
||||
char errorstring[512];
|
||||
@@ -555,42 +568,52 @@ bool FFmpegVideoDecoder::tryInitializeRenderer(AVCodec* decoder,
|
||||
const AVCodecHWConfig* hwConfig,
|
||||
std::function<IFFmpegRenderer*()> createRendererFunc)
|
||||
{
|
||||
m_BackendRenderer = createRendererFunc();
|
||||
m_HwDecodeCfg = hwConfig;
|
||||
|
||||
if (m_BackendRenderer != nullptr &&
|
||||
m_BackendRenderer->initialize(params) &&
|
||||
completeInitialization(decoder, params, m_TestOnly || m_BackendRenderer->needsTestFrame())) {
|
||||
if (m_TestOnly) {
|
||||
// This decoder is only for testing capabilities, so don't bother
|
||||
// creating a usable renderer
|
||||
return true;
|
||||
}
|
||||
|
||||
if (m_BackendRenderer->needsTestFrame()) {
|
||||
// The test worked, so now let's initialize it for real
|
||||
reset();
|
||||
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
|
||||
m_BackendRenderer->initialize(params) &&
|
||||
completeInitialization(decoder, params, false)) {
|
||||
// i == 0 - Indirect via EGL frontend with zero-copy DMA-BUF passing
|
||||
// i == 1 - Direct rendering or indirect via SDL read-back
|
||||
#ifdef HAVE_EGL
|
||||
for (int i = 0; i < 2; i++) {
|
||||
#else
|
||||
for (int i = 1; i < 2; i++) {
|
||||
#endif
|
||||
SDL_assert(m_BackendRenderer == nullptr);
|
||||
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
|
||||
m_BackendRenderer->initialize(params) &&
|
||||
completeInitialization(decoder, params, m_TestOnly || m_BackendRenderer->needsTestFrame(), i == 0 /* EGL */)) {
|
||||
if (m_TestOnly) {
|
||||
// This decoder is only for testing capabilities, so don't bother
|
||||
// creating a usable renderer
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Decoder failed to initialize after successful test");
|
||||
|
||||
if (m_BackendRenderer->needsTestFrame()) {
|
||||
// The test worked, so now let's initialize it for real
|
||||
reset();
|
||||
if ((m_BackendRenderer = createRendererFunc()) != nullptr &&
|
||||
m_BackendRenderer->initialize(params) &&
|
||||
completeInitialization(decoder, params, false, i == 0 /* EGL */)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Decoder failed to initialize after successful test");
|
||||
reset();
|
||||
}
|
||||
}
|
||||
else {
|
||||
// No test required. Good to go now.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// No test required. Good to go now.
|
||||
return true;
|
||||
// Failed to initialize, so keep looking
|
||||
reset();
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Failed to initialize or test frame failed, so keep looking
|
||||
reset();
|
||||
}
|
||||
|
||||
// reset() must be called before we reach this point!
|
||||
SDL_assert(m_BackendRenderer == nullptr);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
virtual IFFmpegRenderer* getBackendRenderer();
|
||||
|
||||
private:
|
||||
bool completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame);
|
||||
bool completeInitialization(AVCodec* decoder, PDECODER_PARAMETERS params, bool testFrame, bool eglOnly);
|
||||
|
||||
void stringifyVideoStats(VIDEO_STATS& stats, char* output);
|
||||
|
||||
@@ -34,7 +34,7 @@ private:
|
||||
|
||||
void addVideoStats(VIDEO_STATS& src, VIDEO_STATS& dst);
|
||||
|
||||
bool createFrontendRenderer(PDECODER_PARAMETERS params);
|
||||
bool createFrontendRenderer(PDECODER_PARAMETERS params, bool eglOnly);
|
||||
|
||||
bool tryInitializeRendererForDecoderByName(const char* decoderName,
|
||||
PDECODER_PARAMETERS params);
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
3.1.0
|
||||
3.1.3
|
||||
+2
-2
@@ -20,11 +20,11 @@ install:
|
||||
- sh: '[ "$BUILD_TARGET" != steamlink ] || sudo apt install -y libc6:i386 libstdc++6:i386'
|
||||
- sh: '[ "$BUILD_TARGET" != steamlink ] || git clone --depth=1 https://github.com/ValveSoftware/steamlink-sdk.git $HOME/steamlink-sdk'
|
||||
- sh: '[ "$BUILD_TARGET" != linux ] || sudo add-apt-repository ppa:beineri/opt-qt-5.14.2-xenial'
|
||||
- sh: '[ "$BUILD_TARGET" != linux ] || sudo apt update'
|
||||
- sh: '[ "$BUILD_TARGET" != linux ] || sudo apt update || true'
|
||||
- sh: '[ "$BUILD_TARGET" != linux ] || sudo apt install -y qt514base qt514quickcontrols2 qt514svg qt514wayland nasm libgbm-dev libdrm-dev libfreetype6-dev libasound2-dev libdbus-1-dev libegl1-mesa-dev libgl1-mesa-dev libgles2-mesa-dev libglu1-mesa-dev libibus-1.0-dev libpulse-dev libudev-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxkbcommon-dev libxrandr-dev libxss-dev libxt-dev libxv-dev libxxf86vm-dev wayland-protocols libopus-dev libvdpau-dev'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export SDL2_REV=dfa64eadd38a6a8125290dcf121f1bc285e98dad && git clone https://github.com/libsdl-org/SDL.git SDL2 && cd SDL2 && git checkout $SDL2_REV && ./configure --enable-video-kmsdrm && make -j$(nproc) && sudo make install && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export SDL2_TTF_VER=2.0.15 && wget https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-$SDL2_TTF_VER.tar.gz && tar -xvf SDL2_ttf-$SDL2_TTF_VER.tar.gz && cd SDL2_ttf-$SDL2_TTF_VER && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export LIBVA_VER=2.10.0 && wget https://github.com/intel/libva/releases/download/$LIBVA_VER/libva-$LIBVA_VER.tar.bz2 && tar -xvf libva-$LIBVA_VER.tar.bz2 && cd libva-$LIBVA_VER && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export LIBVA_VER=2.11.0 && git clone https://github.com/intel/libva.git && cd libva && git checkout $LIBVA_VER && ./autogen.sh && ./configure && make -j$(nproc) && sudo make install && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export NVHDR_VER=8.1.24.12 && wget https://github.com/FFmpeg/nv-codec-headers/releases/download/n$NVHDR_VER/nv-codec-headers-$NVHDR_VER.tar.gz && tar -xvf nv-codec-headers-$NVHDR_VER.tar.gz && cd nv-codec-headers-$NVHDR_VER && sudo make install && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then export FFMPEG_VER=4.3.1 && wget https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VER.tar.bz2 && tar -xvf ffmpeg-$FFMPEG_VER.tar.bz2 && cd ffmpeg-$FFMPEG_VER && ./configure $FFMPEG_CONFIGURE_ARGS && make -j$(nproc) && sudo make install && sudo ldconfig && cd ..; fi'
|
||||
- sh: 'if [[ "$BUILD_TARGET" = linux ]]; then mkdir $HOME/bin && wget -O $HOME/bin/linuxdeployqt https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage && chmod a+x $HOME/bin/linuxdeployqt; fi'
|
||||
|
||||
+1
-1
Submodule libs updated: db54134a65...c5149747ff
Submodule moonlight-common-c/moonlight-common-c updated: a64af8d8cf...ccaca624f3
@@ -54,6 +54,7 @@ SOURCES += \
|
||||
$$COMMON_C_DIR/src/LinkedBlockingQueue.c \
|
||||
$$COMMON_C_DIR/src/Misc.c \
|
||||
$$COMMON_C_DIR/src/Platform.c \
|
||||
$$COMMON_C_DIR/src/PlatformCrypto.c \
|
||||
$$COMMON_C_DIR/src/PlatformSockets.c \
|
||||
$$COMMON_C_DIR/src/RtpFecQueue.c \
|
||||
$$COMMON_C_DIR/src/RtpReorderQueue.c \
|
||||
|
||||
Reference in New Issue
Block a user